Linux多路徑的使用及介紹
普通的電腦主機都是一個硬盤掛接到一個總線上,這裏是一對一的關係。而到了有光纖組成的SAN環境,由於主機和存儲通過了光纖交換機連接,這樣的話,就構成了多對多的關係。也就是說,主機到存儲可以有多條路徑可以選擇。主機到存儲之間的IO由多條路徑可以選擇,如下圖:
根據上圖所示,每個主機到所對應的存儲可以經過幾條不同的路徑,如果是同時使用的話,I/O流量如何分配?其中一條路徑壞掉了,如何處理?還有在操作系統的角度來看,每條路徑,操作系統會認爲是一個實際存在的物理盤,但實際上只是通向同一個物理盤的不同路徑而已,這樣是在使用的時候,就給用戶帶來了困惑。多路徑軟件就是爲了解決上面的問題應運而生的。多路徑的主要功能就是和存儲設備一起配合實現如下功能:
1.故障的切換和恢復
2.IO流量的負載均衡
3.磁盤的虛擬化
由於多路徑軟件是需要和存儲在一起配合使用的,不同的廠商基於不同的操作系統,都提供了不同的版本。並且有的廠商,軟件和硬件也不是一起賣的,如果要使用多路徑軟件的話,可能還需要向廠商購買license才行。比如EMC公司基於linux下的多路徑軟件,就需要單獨的購買license。好在, RedHat和Suse的2.6的內核中都自帶了免費的多路徑軟件包,並且可以免費使用,同時也是一個比較通用的包,可以支持大多數存儲廠商的設備,即使是一些不是出名的廠商,通過對配置文件進行稍作修改,也是可以支持並運行的很好的。
---Linux 內置 HBA 驅動程序和內置多路徑計劃(HP)
從 Red Hat RHEL 5.2 和 Novell SLES 10 SP2 開始的惠普支持的客戶選項
選項一: 惠普提供的 Emulex HBA 驅動程序和 Multipulse 故障轉移,或者惠普提供的 Emulex HBA 驅動程序和內置 Device Mapper Multipathing
選項二: 惠普提供的 QLogic HBA 驅動程序和 QLogic 故障轉移,或者惠普提供的單一路徑模式 QLogic HBA 驅動程序和內置 Device Mapper Multipathing
選項三: 內置 HBA 驅動程序和內置 Device Mapper Multipathing。 該選項僅用於非生產環境
---Linux的multipath需要以下工具包:
1. multipath-tools 應該也就是rpm包device-mapper-multipath。主要提供multipathd和multipath等工具和 multipath.conf等配置文件。這些工具通過device mapper的ioctr的接口創建和配置multipath設備(調用device-mapper的用戶空間庫。創建的多路徑設備會在/dev /mapper中)。
2. device-mapper.linux device mapper主要包括兩大部分:內核部分和用戶部分。內核部分主要由device mapper核心(dm.ko)和一些target driver(md-multipath.ko)。核心完成設備的映射,而target根據映射關係和自身特點具體處理從mappered device 下來的i/o。同時,在覈心部分,提供了一個接口,用戶通過ioctr可和內核部分通信,以指導內核驅動的行爲,比如如何創建mappered device,這些divece的屬性等。linux device mapper的用戶空間部分主要包括device-mapper這個包。其中包括dmsetup工具和一些幫助創建和配置mappered device的庫。這些庫主要抽象,封裝了與ioctr通信的接口,以便方便創建和配置mappered device。multipath-tool的程序中就需要調用這些庫。
3. dm-multipath.ko和dm.ko。dm.ko是device mapper驅動。它是實現multipath的基礎。dm-multipath其實是dm的一個target驅動。
4. scsi_id 包含在udev程序包中,可以在multipath.conf中配置該程序來獲取scsi設備的序號。通過序號,便可以判斷多個路徑對應了同一設備。這個是多路徑實現的關鍵。scsi_id是通過sg驅動,向設備發送EVPD page80或page83 的inquery命令來查詢scsi設備的標識。但一些設備並不支持EVPD 的inquery命令,所以他們無法被用來生成multipath設備。但可以改寫scsi_id,爲不能提供scsi設備標識的設備虛擬一個標識符,並輸出到標準輸出。multipath程序在創建multipath設備時,會調用scsi_id,從其標準輸出中獲得該設備的scsi id。在改寫時,需要修改scsi_id程序的返回值爲0。因爲在multipath程序中,會檢查該直來確定scsi id是否已經成功得到。
---具體安裝過程描述如下:
RHEL4U7 & 光纖網卡等驅動已經安裝完成後。
1. 多路徑軟件包的構成 (都在光盤目錄內)
device-mapper-1.02.13xxx.rpm,該軟件運行在底層,主要進行設備虛擬化和映射(系統已經自動安裝)。
device-mapper-multipath-0.4.7xxx.rpm(Debian等版本Linux內的軟件包命名爲:multipath-tools-xxx),這個軟件包可以在多路徑的管理和監控工具,主要進行路徑狀態的檢測,管理工作.安裝完成後,使用命令modprobe dm_multipath來加載相應的模塊,可以使用lsmod |grep dm_multipath來檢查安裝是否正常。
---It is recommended that DM be integrated into the boot sequence using the following commands:
# chkconfig --add multipathd
# chkconfig multipathd on
---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
2. 下載並安裝HPDM Multipath Enablement Kit for HP StorageWorks Disk Arrays v4.2.0 available at http://www.hp.com/go/devicemapper.
3、修改配置文件/etc/multipath.conf , 主要是針對multipaths 字段,定義各wwid別名(文章後部有詳細說明);其他字段使用默認設定即可,當然也可按照硬件設備自定義。
4、mulitipath服務
# /etc/init.d/multipathd start
5、使用 multipath -F 刪除現有路徑
6、multipath -v2 格式化路徑
---Run command /sbin/multipath –v2. This will invoke multipathd daemon to re-read the multipath.conf file and generate the /dev/mapper/<WWN> (/dev/mapper/alias) and /dev/dm-x device nodes.
7、使用 multipath -ll 查看多路徑
# multipath -ll
ocs1 (3600508b40006ea6e0001a000002a0000) dm-2 HP,HSV210
[size=500G][features=1 queue_if_no_path][hwhandler=0]
\_ round-robin 0 [prio=100][active]
\_ 0:0:2:1 sdc 8:32 [active][ready]
\_ 0:0:3:1 sdd 8:48 [active][ready]
\_ round-robin 0 [prio=20][enabled]
\_ 0:0:0:1 sda 8:0 [active][ready]
\_ 0:0:1:1 sdb 8:16 [active][ready]
7、使用fdisk -l 查看多路徑的情況
# fdisk -l
Disk /dev/cciss/c0d0: 146.7 GB, 146778685440 bytes
255 heads, 63 sectors/track, 17844 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/cciss/c0d0p1 * 1 13 104391 83 Linux
/dev/cciss/c0d0p2 14 17844 143227507+ 8e Linux LVM
Disk /dev/sda: 536.8 GB, 536870912000 bytes
255 heads, 63 sectors/track, 65270 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sda doesn't contain a valid partition table
Disk /dev/sdb: 536.8 GB, 536870912000 bytes
255 heads, 63 sectors/track, 65270 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
8. 對於Oracle安裝中的Storage使用,如OCR & VOTE、ASM等應用,建議都使用獨立LUN, 這樣在LUN的權限分配等方面更靈活。
9. 後續Oracle等應用安裝,參考Oracle或第三方說明文件
----------------------------------
http://bbs.chinaunix.net/archiver/?tid-1301434.html
http://blog.chinaunix.net/u/15278/showart_1777934.html
http://h20000.www2.hp.com/bc/docs/support/SupportManual/c00710472/c00710472.pdf?jumpid=reg_R1002_USEN
http://h20000.www2.hp.com/bc/docs/support/SupportManual/c01388403/c01388403.pdf?jumpid=reg_R1002_USEN
http://www.oracle.com/global/de/community/dbadmin/tipps/multipath_udev/index.html
http://www.oracle.com/technology/tech/linux/validated-configurations/html/vc_dell2970-oel4-rhel4-md3000_1.html?rssid=valconfig
http://www.redhat.com/docs/manuals/csgfs/pdf/DM_Multipath-4_6.pdf
http://www.oracle.com/technology/products/database/asm/pdf/device-mapper-udev-crs-asm%20rh4.pdf
http://www.oracle.com/global/ch-de/events/information_experience/downloads/21_ORACLE_RAC_with_ASM_on_Linux%20.pdf
http://tonykorn97.itpub.net/get/6414/Device%20Mapper%20Multipath%20Configuration%20Guide%20for%20HP%20StorageWorks%20Arrays.pdf
http://www-03.ibm.com/support/techdocs/atsmastr.nsf/5cb5ed706d254a8186256c71006d2e0a/a96abd4202a6d5918625735d0058fee0/$FILE/10GRAC_SLES10_R4.pdf
-----------------------
---在/etc/multipath.conf 中定義各LUN別名的方式:
1. 在系統中,執行fdisk -l 可以看到
Disk /dev/sda: 145.9 GB, 145999527936 bytes
255 heads, 63 sectors/track, 17750 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 25 200781 83 Linux
/dev/sda2 26 3849 30716280 83 Linux
/dev/sda3 3850 4893 8385930 82 Linux swap / Solaris
/dev/sda4 4894 17750 103273852+ 5 Extended
/dev/sda5 4894 17750 103273821 83 Linux
Disk /dev/sdb: 1395.8 GB, 1395864371200 bytes
255 heads, 63 sectors/track, 169704 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sdc: 1395.8 GB, 1395864371200 bytes
255 heads, 63 sectors/track, 169704 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
Disk /dev/sdd: 1395.8 GB, 1395864371200 bytes
255 heads, 63 sectors/track, 169704 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdd doesn't contain a valid partition table
Disk /dev/sde: 1395.8 GB, 1395864371200 bytes
255 heads, 63 sectors/track, 169704 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sde doesn't contain a valid partition table
其中,sdb,sdc,sdd,sde爲通過多路徑看到的兩塊磁盤,此處顯示爲4塊。
輸入multipath -v3可以看到
[root@mailMx1 etc]# multipath -v3
dm-0: blacklisted
.
.
sdb: path checker = hp_sw (controller setting)
sdb: getprio = /sbin/mpath_prio_alua /dev/%n (controller setting)
sdb: getuid = /sbin/scsi_id -g -u -s /block/%n (controller setting)
sdb: uid = 3600508b4001013f70001900004230000 (callout)
.
sdc: vendor = COMPAQ
sdc: product = HSV111 (C)COMPAQ
sdc: rev = 4100
.
.
.
maildata2: set ACT_NOTHING (map unchanged)
根據以上信息,就可以直接編輯配置文件,位於/etc/multipath.conf ,主要修改以下部分
將本機硬盤從多路徑中去掉,
blacklist {
devnode "^sda"
}
添加多路徑映射設備,其中別名alias可以自己起。
multipaths {
multipath {
wwid 3600508b4001013f70001900004230000
alias maildata1
path_grouping_policy multibus
path_checker tur
path_selector "round-robin 0"
}
multipath {
wwid 3600508b4001013f70001900004320000
alias maildata2
path_grouping_policy multibus
path_checker tur
path_selector "round-robin 0"
}
}
添加多路徑設備,注意要用到前面收集的信息,特別是path_checker要和前面一致
devices {
device {
vendor "COMPAQ|HP" //廠商名稱
product "HSV111 \(C\)COMPAQ" //產品型號
path_grouping_policy group_by_prio //默認的路徑組策略
getuid_callout "/sbin/scsi_id -p 0x80 -g -u -s /block/%n" //獲得唯一設備號使用的默認程序
path_checker hp_sw //決定路徑狀態的方法
path_selector "round-robin 0" //選擇那條路徑進行下一個IO操作的方法
prio_callout "/sbin/mpath_prio_alua /dev/%n" //獲取有限級數值使用的默認程序
failback immediate //故障恢復的模式
hardware_handler "0" //確認用來在路徑切換和IO錯誤時,執行特定的操作的模塊。
no_path_retry queue //在disable queue之前系統嘗試使用失效路徑的次數的數值
rr_min_io 100 //在當前的用戶組中,在切換到另外一條路徑之前的IO請求的數目
}
}
這樣,使用multipath -ll就可以看到
[root@mailMx1 etc]# multipath -ll
maildata2 (3600508b4001013f70001900004320000) dm-1 COMPAQ,HSV111 (C)COMPAQ
[size=1.3T][features=1 queue_if_no_path][hwhandler=0]
\_ round-robin 0 [prio=60][active]
\_ 3:0:0:2 sdc 8:32 [active][ready]
\_ 3:0:1:2 sde 8:64 [active][ready]
maildata1 (3600508b4001013f70001900004230000) dm-0 COMPAQ,HSV111 (C)COMPAQ
[size=1.3T][features=1 queue_if_no_path][hwhandler=0]
\_ round-robin 0 [prio=60][active]
\_ 3:0:0:1 sdb 8:16 [active][ready]
\_ 3:0:1:1 sdd 8:48 [active][ready]
說明設備已經配置完畢,可以看到,我們將4個設備聚合成了兩個設備,分別是maildata1和maildata2。這兩個設備的位置在/dev/mapper下。