Multipath簡稱爲多路徑訪問,主要功能就是和存儲設備一塊兒配合實現三大功能: 1. 故障的切換和恢復 2. IO流量的負載均衡 3. 磁盤的虛擬化node
1、multipath在redhat 7.2中的基本配置:linux
wKioL1hck-_A9WpgAADUF9Ah-cM128.pngios
從上面的提示能夠看出,默認沒有/etc/multipath,DM模塊沒有加載,在redhat linux 7.2能夠用命令/sbin/mpathconf/ --enable 生成配置文件 express
在/etc/multipath.conf配置文件中內容是被註釋掉的app
wKiom1hclDyx0blSAAEcSNr1nl0957.png負載均衡
全部要注意些,要修改的地方去掉註釋;dom
爲節省時間,下面有6.2的配置詳情,和7.2差異不大ide
1、multipath在redhat 6.2中的基本配置:oop
接着經過命令:multipath –ll 查看多路徑狀態查看模塊是否加載成功測試
[root@liujing ~]# multipath –ll 查看多路徑狀態
Mar 10 19:18:28 | /etc/multipath.conf does not exist, blacklisting alldevices.
Mar 10 19:18:28 | A sample multipath.conf file is located at
Mar 10 19:18:28 |/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf
Mar 10 19:18:28 | You can run /sbin/mpathconf to create or modify/etc/multipath.conf
Mar 10 19:18:28 | DM multipath kernel driver notloaded ----DM模塊沒有加載
若是模塊沒有加載成功請使用下列命初始化DM,或重啓系統
---Use the following commands to initialize and start DM for the first time:
modprobe dm-multipath
modprobe dm-round-robin
service multipathd start
multipath –v2
初始化完了以後再經過multipath -ll命令查看是否加載成功
[root@liujing ~]# multipath -ll
Mar 10 19:21:14 | /etc/multipath.conf does not exist, blacklisting alldevices.
Mar 10 19:21:14 | A sample multipath.conf file is located at
Mar 10 19:21:14 |/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf
Mar 10 19:21:14 | You can run /sbin/mpathconf to create or modify/etc/multipath.conf
DM multipath kernel driver not loaded ----這個提示沒了說明DM模塊已加載成功。
從上面的提示能夠看到,DM模塊是成功加載,可是/etc/下沒有multipath.conf 配置文件,下一步介紹如何配置multipath.conf 文件。
經過vi命令建立一個Multipath的配置文件路徑是/etc/multipath.conf ,在配置文件中添加multipath正常工做的最簡配置以下:
vi /etc/multipath.conf
blacklist {
devnode "^sda"
}
defaults {
user_friendly_names yes
path_grouping_policy multibus
failback immediate
no_path_retry fail
}
編輯完成後保存配置,同時經過命令:
/etc/init.d/multipathd start #開啓mulitipath服務
若是出現沒法開啓服務的狀況,沒有提示OK的話以下:
[root@liujing mapper]# service multipathd start
Starting multipathd daemon: 沒有提示OK
從新開關一下服務就能夠解決了。
[root@liujing mapper]# /etc/init.d/multipathd stop
Stopping multipathddaemon: [ OK ]
[root@localhost mapper]# /etc/init.d/multipathd start
Starting multipathddaemon: [ OK ] -----提示OK 正常開啓服務
經過命令查看:
[root@liujing mapper]# multipath -ll
mpatha (360a9800064665072443469563477396c) dm-0NETAPP,LUN ----建立了一個lun
size=3.5G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=4 status=active
|- 1:0:0:0 sdb 8:16 active ready running ----多路徑下的兩個盤符sdb和sde.
`- 2:0:0:0 sde 8:64 active ready running
目錄/dev/mapper/ 下多了兩個文件夾mpatha 和mpathap1。
[root@liujing mapper]# cd /dev/mapper/
[root@liujing mapper]# ls
control mpatha mpathap1
同時fdisk –l的命令下也多了兩個設備標識:
沒有配置多路徑時:
[root@liujing~]# fdisk -l
Disk /dev/sda: 146.8 GB, 146815733760 bytes
255 heads, 63 sectors/track, 17849 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a6cdd
DeviceBoot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 287 2097152 82 Linuxswap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 287 17850 141071360 83 Linux
Disk /dev/sdb: 3774 MB, 3774873600 bytes
117 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 7254 * 512 = 3714048 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 65536 bytes
Disk identifier: 0xac956c3a
DeviceBoot Start End Blocks Id System
/dev/sdb1 1 1016 3685001 83 Linux
Partition 1 does not start on physical sector boundary.
Disk /dev/sde: 3774 MB, 3774873600 bytes
117 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 7254 * 512 = 3714048 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 65536 bytes
Disk identifier: 0xac956c3a
DeviceBoot Start End Blocks Id System
/dev/sde1 1 1016 3685001 83 Linux
Partition 1 does not start on physical sector boundary.
兩個CAN網卡獲取到同一盤符:
/dev/sde和/dev/sdb.
配置後多了/dev/mapper/mpatha和/dev/mapper/mpathap1:
[root@localhost mapper]# fdisk -l
Disk /dev/sda: 146.8 GB, 146815733760 bytes
255 heads, 63 sectors/track, 17849 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a6cdd
DeviceBoot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 287 2097152 82 Linuxswap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 287 17850 141071360 83 Linux
Disk /dev/sdb: 3774 MB, 3774873600 bytes
117 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 7254 * 512 = 3714048 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 65536 bytes
Disk identifier: 0xac956c3a
DeviceBoot Start End Blocks Id System
/dev/sdb1 1 1016 3685001 83 Linux
Partition 1 does not start on physical sector boundary.
Disk /dev/sde: 3774 MB, 3774873600 bytes
117 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 7254 * 512 = 3714048 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 65536 bytes
Disk identifier: 0xac956c3a
Device Boot Start End Blocks Id System
/dev/sde1 1 1016 3685001 83 Linux
Partition 1 does not start on physical sector boundary.
Disk /dev/mapper/mpatha: 3774 MB, 3774873600 bytes
117 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 7254 * 512 = 3714048 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 65536 bytes
Disk identifier: 0xac956c3a
DeviceBoot Start End Blocks Id System
/dev/mapper/mpathap1 1 1016 3685001 83 Linux
Partition 1 does not start on physical sector boundary.
Disk /dev/mapper/mpathap1: 3773 MB, 3773441024 bytes
255 heads, 63 sectors/track, 458 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 65536 bytes
Alignment offset: 1024 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/mpathap1 doesn't contain a valid partition table
multipath -F #刪除現有路徑 兩個新的路徑就會被刪除
multipath -v2 #格式化路徑 格式化後又出現
要對多路徑軟件生成的磁盤進行操做直接操做/dev/mapper/目錄下的磁盤就行.
在對多路徑軟件生成的磁盤進行分區以前最好運行一下pvcreate命令:
pvcreate /dev/mapper/mpatha
#fdisk /dev/mapper/mpatha 分區時用這個目錄/dev/mapper/mpatha
用fdisk對多路徑軟件生成的磁盤進行分區保存時會有一個報錯,此報錯不用理會.
ls -l /dev/mapper/
[root@liujing mnt]# ls -l /dev/mapper/
total 0
crw-rw----. 1 root root 10, 58 Mar 10 19:10 control
lrwxrwxrwx. 1 root root 7 Mar 10 20:28mpatha -> ../dm-0
lrwxrwxrwx. 1 root root 7 Mar 10 20:33 mpathap1-> ../dm-1
的mpathap1就是咱們對multipath磁盤進行的分區
mkfs.ext4 /dev/mapper/mpathap1 #對mpath1p1分區格式化成ext4文件系統
mount /dev/mapper/mpathap1 /mnt/ #掛載mpathap1分區
格式化和掛載時用/dev/mapper/mpathap1
上面有提到分區時用目錄/dev/mapper/mpatha
[root@liujing~]# fdisk /dev/mapper/mpatha
Device contains neither a valid DOS partition table, nor Sun, SGI or OSFdisklabel
Building a new DOS disklabel with disk identifier 0xac956c3a.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected byw(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n------------------------新建分區
Command action
e extended
p primary partition (1-4)
p-----------------------------主分區
Partition number (1-4): 1
First cylinder (1-1016, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1016, default 1016):
Using default value 1016
Command (m for help): w ---------------------寫入列表至關於保存
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
注:若是同一臺設備的兩個node掛一樣的盤符,另外一個盤符還須要再次寫入w就行。不須要n了。
[root@liujing ~]# mkfs.ext4 /dev/mapper/mpathap1
mke2fs 1.41.12 (17-May-2010)
/dev/sdd1 alignment is offset by 1024 bytes.
This may result in very poor performance, (re)-partitioning suggested.
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1 blocks, Stripe width=16 blocks
230608 inodes, 921250 blocks
46062 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=943718400
29 block groups
32768 blocks per group, 32768 fragments per group
7952 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first. Use tune2fs -c or -i tooverride.
[root@liujing ~]# mount /dev/mapper/mpathap1 /mnt
3、multipath的高級配置以前的配置都是用multipath的默認配置來完成multipath,好比映射設備的名稱,multipath負載均衡的方法都是默認設置。那有沒有按照咱們本身定義的方法來配置multipath呢,答案是OK。
一、multipath.conf文件的配置
接下來的工做就是要編輯/etc/multipath.conf的配置文件
multipath.conf主要包括blacklist、multipaths、devices三部份的配置
blacklist配置
blacklist {
devnode "^sda"
}
Multipaths部分配置multipaths和devices兩部份的配置。
multipaths {
multipath {
wwid **** #此值multipath -v3能夠看到
alias iscsi-dm0 #映射後的別名,能夠隨便取
path_grouping_policy multibus #路徑組策略
path_checker tur #決定路徑狀態的方法
path_selector "round-robin 0" #選擇那條路徑進行下一個IO操做的方法
}
}
Devices部分配置
devices {
device {
vendor "iSCSI-Enterprise" #廠商名稱
product "Virtual disk" #產品型號
path_grouping_policy multibus #默認的路徑組策略
getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #得到惟一設備號使用的默認程序
prio_callout "/sbin/acs_prio_alua%d" #獲取有限級數值使用的默認程序
path_checker readsector0 #決定路徑狀態的方法
path_selector "round-robin 0" #選擇那條路徑進行下一個IO操做的方法
failback immediate #故障恢復的模式
no_path_retry queue #在disable queue以前系統嘗試使用失效路徑的次數的數值
rr_min_io 100 #在當前的用戶組中,在切換到另一條路徑以前的IO請求的數目
}
}
下面是相關參數的標準文檔的介紹:
Attribute
Description
wwid
Specifies the WWID of the multipath device to which themultipath attributes apply. This parameter is mandatory for this section of themultipath.conf file.
alias
Specifies the symbolic name for the multipath device to which themultipath attributes apply. If you are usinguser_friendly_names, do not set this value tompathn; this may conflict with an automatically assigned user friendly name and give you incorrect device node names.
path_grouping_policy
Specifies the default path grouping policy to apply to unspecified multipaths. Possible values include:
failover = 1 path per priority group
multibus = all valid paths in 1 priority group
group_by_serial = 1 priority group per detected serial number
group_by_prio = 1 priority group per path priority value
group_by_node_name = 1 priority group per target node name
path_selector
Specifies the default algorithm to use in determining what path to use for the next I/O operation. Possible values include:
round-robin 0: Loop through every path in the path group, sending the same amount of I/O to each.
queue-length 0: Send the next bunch of I/O down the path with the least number of outstanding I/O requests.
service-time 0: Send the next bunch of I/O down the path with the shortest estimated service time, which is determined by dividing the total size of the outstanding I/O to each path by its relative throughput.
failback
Manages path group failback.
A value of immediate specifies immediate failback to the highest priority path group that contains active paths.
A value of manual specifies that there should not be immediate failback but that failback can happen only with operator intervention.
A value of followover specifies that automatic failback should be performed when the first path of a path group becomes active. This keeps a node from automatically failing back when another node requested the failover.
A numeric value greater than zero specifies deferred failback, expressed in seconds.
prio
Specifies the default function to call to obtain a path priority value. For example, the ALUA bits in SPC-3 provide an exploitableprio value. Possible values include:
const: Set a priority of 1 to all paths.
emc: Generate the path priority for EMC arrays.
alua: Generate the path priority based on the SCSI-3 ALUA settings.
tpg_pref: Generate the path priority based on the SCSI-3 ALUA settings, using the preferred port bit.
ontap: Generate the path priority for NetApp arrays.
rdac: Generate the path priority for LSI/Engenio RDAC controller.
hp_sw: Generate the path priority for Compaq/HP controller in active/standby mode.
hds: Generate the path priority for Hitachi HDS Modular storage arrays.
no_path_retry
A numeric value for this attribute specifies the number of times the system should attempt to use a failed path before disabling queueing.
A value of fail indicates immediate failure, without queueing.
A value of queue indicates that queueing should not stop until the path is fixed.
rr_min_io
Specifies the number of I/O requests to route to a path before switching to the next path in the current path group. This setting is only for systems running kernels older that 2.6.31. Newer systems should userr_min_io_rq. The default value is 1000.
rr_min_io_rq
Specifies the number of I/O requests to route to a path before switching to the next path in the current path group, using request-based device-mapper-multipath. This setting should be used on systems running current kernels. On systems running kernels older than 2.6.31, use rr_min_io. The default value is 1.
rr_weight
If set to priorities, then instead of sending rr_min_iorequests to a path before calling path_selector to choose the next path, the number of requests to send is determined byrr_min_io times the path's priority, as determined by theprio function. If set to uniform, all path weights are equal.
flush_on_last_del
If set to yes, then multipath will disable queueing when the last path to a device has been deleted.
在我本地的一個完整的高級配置以下:
[root@liujing ~]# vi /etc/multipath.conf
blacklist {
devnode "^sda"
}
multipaths {
multipath {
wwid 360a98000646650724434697454546156
alias mpathb_fcoe
path_grouping_policy multibus
#path_checker "directio"
prio "random"
path_selector "round-robin0"
}
}
devices {
device {
vendor "NETAPP"
product "LUN"
getuid_callout "/lib/udev/scsi_id--whitelisted --device=/dev/%n"
#path_checker "directio"
#path_selector "round-robin0"
failback immediate
no_path_retry fail
}
}
其中 wwid,vendor,product, getuid_callout這些參數能夠經過:multipath -v3命令來獲取。若是在/etc/multipath.conf中有設定各wwid 別名,別名會覆蓋此設定。
4、負載均衡測試:
可使用dd命令來對設備進行讀寫操做,並同時經過iostat來查看I/0狀態,流量從哪一個路徑出去:
DD命令:dd if=/dev/zero of=/mnt/1Gfile bs=8k count=131072 在上面咱們已經把磁盤掛載在/MNT文件夾下因此咱們在讀寫磁盤時直接對/mnt文件夾直接讀寫就能夠了。
若是想對磁盤重複讀寫能夠用以下語句:
[root@liujing ~]# for ((i=1;i<=5;i++));do dd if=/dev/zeroof=/mnt/1Gfile bs=8k count=131072 2>&1|grep MB;done; ---重複讀寫5次這個值能夠根據本身測試需求修改。
另外一個控制檯輸入iostat 2 10查看IO讀寫狀態:
能夠看到sdc和sdd是兩個多路徑的盤符,流量均勻的負載在兩條路徑中,負載均衡很成功。
5、路徑冗餘備份測試
將其中一條路徑的端口down掉,全部流量會直接切換到另外一個路徑中