1、ISCSI多路徑應用
如果存儲伺服器到交換機隻有一條線路的時候,那麼一條線路出線故障,整個就沒法使用了,是以多線路可以解決這個問題,避免單點故障。
2、實驗環境: 172.17.1.150,172.17.1.151配置雙網卡。
服務端:docker-01 IP:172.17.1.150 eth0 ,br ;IP:172.17.1.160 eth1 , vmnet4
用戶端:docker-02 IP:172.17.1.151 eth0 ,br ;IP:172.17.1.170 eth1 , vmnet4
3、将docker-01配置成ip san,将docker-01上的sdb1分區,通過ip san 共享出去。
伺服器端:target docker-01
用戶端: initiator docker-02
3.1生成eth1配置檔案,配置IP ,172.17.1.160 172.17.1.170
#172.17.1.150(docker-01)
[root@docker-01 network-scripts]# cd /etc/sysconfig/network-scripts/
[root@docker-01 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@docker-01 network-scripts]# vim ifcfg-eth1
DEVICE=eth1 ##修改
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=172.17.1.160 ##修改
NETMASK=255.255.240.0
GATEWAY=172.17.0.1
[root@docker-01 network-scripts]# service network restart
#172.17.1.151(docker-02)
[root@docker-02 network-scripts]# cd /etc/sysconfig/network-scripts/
[root@docker-02 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@docker-02 network-scripts]# vim ifcfg-eth1
DEVICE=eth1 ##修改
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=172.17.1.170 ##修改
NETMASK=255.255.240.0
GATEWAY=172.17.0.1
[root@docker-02 network-scripts]# service network restart
3.2安裝tgtd伺服器,準備一個磁盤: sda4
[root@docker-01 network-scripts]# yum install -y scsi-target-utils
[root@docker-01 network-scripts]# fdisk /dev/sda
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 forhelp): p
Disk /dev/sda: 107.4 GB, 107374182400bytes
255heads, 63sectors/track, 13054cylinders
Units =cylinders of 16065* 512=8225280bytes
Sector size (logical/physical): 512bytes / 512bytes
I/O size (minimum/optimal): 512bytes / 512bytes
Disk identifier: 0x000b076e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83Linux
Partition 1does not end on cylinder boundary.
/dev/sda2 26 287 2097152 82Linux swap / Solaris
Partition 2does not end on cylinder boundary.
/dev/sda3 287 13055 102554624 83Linux
Command (m forhelp): d
Partition number (1-4): 2
Command (m forhelp): p
Disk /dev/sda: 107.4 GB, 107374182400bytes
255heads, 63sectors/track, 13054cylinders
Units =cylinders of 16065* 512=8225280bytes
Sector size (logical/physical): 512bytes / 512bytes
I/O size (minimum/optimal): 512bytes / 512bytes
Disk identifier: 0x000b076e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83Linux
Partition 1does not end on cylinder boundary.
/dev/sda3 287 13055 102554624 83Linux
Command (m forhelp): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
Value out of range.
Partition number (1-4): 4
First cylinder (26-13054, default 26):
Using default value 26
Last cylinder, +cylinders or +size{K,M,G} (26-286, default 286): +10G
Value out of range.
Last cylinder, +cylinders or +size{K,M,G} (26-286, default 286):
Using default value 286
Command (m forhelp): p
Disk /dev/sda: 107.4 GB, 107374182400bytes
255heads, 63sectors/track, 13054cylinders
Units =cylinders of 16065* 512=8225280bytes
Sector size (logical/physical): 512bytes / 512bytes
I/O size (minimum/optimal): 512bytes / 512bytes
Disk identifier: 0x000b076e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83Linux
Partition 1does not end on cylinder boundary.
/dev/sda3 287 13055 102554624 83Linux
/dev/sda4 26 286 2091471 83Linux
Partition table entries are not indisk order
Command (m forhelp): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 裝置或資源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@docker-01 network-scripts]# reboot
3.3配置target ,把sda4分區共享出去,修改配置檔案。
[root@docker-01 ~]# vim /etc/tgt/targets.conf
##在參考這段内容并在段内容後,追加以下紅色标記内容:
75#<target iqn.2008-09.com.example:server.target4>
76# direct-store /dev/sdb # Becomes LUN 1
77# direct-store /dev/sdc # Becomes LUN 2
78# direct-store /dev/sdd # Becomes LUN 3
79# write-cache off
80# vendor_id MyCompany Inc.
81#</target>
##改為
82<target iqn.2019-09.cn.docker.www:target_san1>
83 backing-store /dev/sda4
84 initiator-address 172.17.1.151
85 initiator-address 172.17.1.170 #在通路控制清單中添加一個用戶端
86 vendor_id docker
87 product_id target1
88</target>
##注釋:
default-driver iscsi #此配置檔案預設全部注釋,使用iscsi驅動
<target iqn.2019-09.cn.docker.www:target_san1> # iscsi正規名字格式 : iqn.年-月.主機名倒着寫: target端名字
backing-store /dev/sda4 # 可以是具體的分區,也可以是DD出來的檔案。不能小于1G。(後面的檔案系統是GFS,光日志空間就128M)
initiator-address 172.17.1.150 #指定允許通路的此存儲主機
initiator-address 172.17.1.151 #指定允許通路的此存儲主機
vendor_id “docker” #供應廠商編号 辨別這個裝置(字元不要過長)
product_id "target1" # 産品編号
</target>
3.4啟動服務
[root@docker-01 scripts]# service tgtd restart
Stopping SCSI target daemon: not running [FAILED]
Starting SCSI target daemon: [ OK ]
[root@docker-01 scripts]# netstat -antup | grep 3260
tcp 0 00.0.0.0:3260 0.0.0.0:* LISTEN 1328/tgtd
[root@docker-01 scripts]# chkconfig tgtd on
3.5檢視狀态tgt-admin --show
[root@docker-01 scripts]# tgt-admin --show
Target 1: iqn.2019-09.cn.docker.www:target_san1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2142MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/sda4
Backing store flags:
Account information:
ACL information:
172.17.1.151
172.17.1.170
4、配置用戶端: 172.17.1.151
[root@docker-02 network-scripts]# yum install -y iscsi-initiator-utils
[root@docker-02 network-scripts]# iscsiadm -m discovery -t sendtargets -p 172.17.1.150:3260
正在啟動 iscsid: [确定]
172.17.1.150:3260,1 iqn.2019-09.cn.docker.www:target_san1
[root@docker-02 network-scripts]# service iscsi restart
Stopping iscsi: [ OK ]
Starting iscsi: [ OK ]
5、檢視發現到新硬碟
[root@docker-02 network-scripts]# ls /dev/sdb
/dev/sdb
[root@docker-02 network-scripts]# netstat -antup | grep 3260
tcp 0 0172.17.1.151:44880 172.17.1.150:3260 ESTABLISHED 2062/iscsid
6、用戶端從另一條線路發現裝置
[root@docker-02 network-scripts]# iscsiadm -m discovery -t sendtargets -p 172.17.1.160
172.17.1.160:3260,1 iqn.2019-09.cn.docker.www:target_san1
[root@docker-02 network-scripts]# yum install -y tree
[root@docker-02 network-scripts]# tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│ └── iqn.2019-09.cn.docker.www:target_san1
│ ├── 172.17.1.150,3260,1
│ │ └── default
│ └── 172.17.1.160,3260,1
│ └── default
├── send_targets
│ ├── 172.17.1.150,3260
│ │ ├── iqn.2019-09.cn.docker.www:target_san1,172.17.1.150,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-09.cn.docker.www:target_san1/172.17.1.150,3260,1
│ │ └── st_config
│ └── 172.17.1.160,3260
│ ├── iqn.2019-09.cn.docker.www:target_san1,172.17.1.160,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-09.cn.docker.www:target_san1/172.17.1.160,3260,1
│ └── st_config
├── slp
└── static
13directories, 4files
[root@docker-02 network-scripts]# service iscsi restart
Stopping iscsi: [OK]
Starting iscsi: [OK]
[root@docker-02 network-scripts]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb /dev/sdc
7、挂載硬碟測試資料
[root@docker-02 network-scripts]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x1d8c9593.
Changes will remain inmemory only, untilyou decide to writethem.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4will be corrected by w(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 forhelp): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1022, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1022, default 1022):
Using default value 1022
Command (m forhelp): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@docker-02 network-scripts]# mkfs.ext4 /dev/sdb1
[root@docker-02 network-scripts]# mount /dev/sdb1 /opt/
[root@docker-02 network-scripts]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 97G 2.5G 89G 3% /
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 ext4 190M 52M 129M 29% /boot
/dev/sdb1 ext4 2.0G 3.0M 1.9G 1% /opt
##注:可以看到sdb1可以正常使用
[root@docker-02 network-scripts]# ls /dev/sdc* ##檢視不到sdc1
/dev/sdc
[root@docker-02 network-scripts]# service iscsi restart
Stopping iscsi: [OK]
Starting iscsi: [OK]
[root@docker-02 network-scripts]# ls /dev/sdc*
/dev/sdc /dev/sdc1
[root@docker-02 network-scripts]# mkdir /tmp/sdc1
[root@docker-02 network-scripts]# mount /dev/sdc1 /tmp/sdc1/
[root@docker-02 network-scripts]# mount /dev/sdb1 /opt/ ## 挂載報錯了吧?
mount: you must specify the filesystem type
[root@docker-02 network-scripts]# blkid /dev/sdc1 /dev/sdb1 ##對比一下,發現UUID一樣的
/dev/sdc1: UUID="d6493ee6-b9c8-4d28-9920-efc46c0354dd"TYPE="ext4"
##解決方法
[root@docker-02 network-scripts]# mount -t xfs -o nouuid /dev/sdb1 /opt
[root@docker-02 network-scripts]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 97G 2.5G 89G 3% /
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 ext4 190M 52M 129M 29% /boot
/dev/sdb1 ext4 2.0G 3.0M 1.9G 1% /opt
/dev/sdc1 ext4 2.0G 3.0M 1.9G 1% /tmp/sdc1
8、在存儲用戶端docker-02(172.17.1.151)上配置多路徑
多路徑軟體Device Mapper Multipath(DM-Multipath)可以将伺服器節點和存儲陣列之間的多條I/O鍊路配置為一個單獨的裝置。這些I/O鍊路是由不同的線纜、交換機、控制器組成的SAN實體鍊路。Multipath将這些鍊路聚合在一起,生成一個單獨的新的裝置。
8.1DM-Multipath概覽:
(1)資料備援
DM-Multipath可以實作在active/passive模式下的災難轉移。在active/passive模式下,隻有一半的鍊路在工作,如果鍊路上的某一部分(線纜、交換機、控制器)出現故障,DM-Multipath就會切換到另一半鍊路上。
(2)提高性能
DM-Multipath也可以配置為active/active模式,進而I/O任務以round-robin的方式分布到所有的鍊路上去。通過配置,DM-Multipath還可以檢測鍊路上的負載情況,動态地進行負載均衡。
8.2安裝多路經軟體
[root@docker-02 network-scripts]# yum install device-mapper-multipath -y
[root@docker-02 network-scripts]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/
[root@docker-02 network-scripts]# service multipathd restart
ux_socket_connect: No such file or directory
Stopping multipathd daemon: [FAILED]
Starting multipathd daemon: [ OK ]
[root@docker-02 network-scripts]# multipath -ll ##沒有輸出消息。表示出錯了。
##解決:把正在使用中的sdb1和sdbc1解除安裝了
[root@docker-02 network-scripts]# umount /opt/
[root@docker-02 network-scripts]# service iscsi restart
Stopping iscsi: [ OK ]
Starting iscsi: [ OK ]
[root@docker-02 network-scripts]# service multipathd restart
ok
Stopping multipathd daemon: [OK]
Starting multipathd daemon: [OK]
[root@docker-02 network-scripts]# multipath -ll
mpathb (1IET 00010001) ##(遠端儲存設備id) dm-0 ##(廠商)docker,target1 ##(産品ID)
size=2.0G features='0'hwhandler='0'wp=rw
|-+-policy='round-robin 0'prio=1status=active ##預設使用active的鍊路
|`- 8:0:0:1 sdb 8:16 active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
##有效的鍊路,但不是活動鍊路
`- 7:0:0:1 sdc 8:32 active ready running
##預設配置并不會實作負載均衡,隻會實作高可用的效果。
##課外講解
00010001遠端儲存設備的産品資訊,由于sda和sdb對應的都是遠端同一個存儲,是以産品資訊是一樣的,最後被多路經驅動發現,是以為他們生成了一個裝置檔案/dev/mapper/mpatha
[root@docker-02 network-scripts]# ll /dev/mapper/mpathb*
lrwxrwxrwx 1root root 79月 3022:55 /dev/mapper/mpathb -> ../dm-0
lrwxrwxrwx 1root root 79月 3022:55 /dev/mapper/mpathbp1 -> ../dm-1
8.3修改配置檔案,啟動高可用負載均衡模式,并自定義多路經裝置檔案的名字
[root@localhost ~]# /lib/udev/scsi_id --whitelisted --replace-whitespace /dev/sdb
1IET_00010001
[root@docker-02 network-scripts]# vim /etc/multipath.conf
##登出掉下面三行内容
25defaults {
26 user_friendly_names yes
27}
##請在此模版下寫内容
28multipaths {
29 multipath {
30 wwid "1IET_00010001" #填寫硬碟産品關鍵資訊
31 alias webdata #自定義名字
32 path_grouping_policy multibus
33 path_selector "round-robin 0"
34 failback manual
35 rr_weight priorities
36 no_path_retry 5
37 }
38}
8.4重新開機服務multipathd
[root@docker-02 network-scripts]# service multipathd restart
ok
Stopping multipathd daemon: [OK]
Starting multipathd daemon: [OK]
[root@docker-02 network-scripts]# service iscsi restart ##需要重新實别一下存儲
Stopping iscsi: [ OK ]
Starting iscsi: [ OK ]
##再次檢視
[root@docker-02 network-scripts]# multipath -ll
1IET 00010001dm-0 docker,target1
size=2.0G features='0'hwhandler='0'wp=rw
|-+-policy='round-robin 0'prio=1status=active
| `- 10:0:0:1 sde 8:64 active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
`- 9:0:0:1 sdd 8:48 active ready running
##注:之前相當于主備,現在相當于負載均衡
8.5模拟故障: 斷開一條鍊路。測試鍊路高可用,關閉其中一個網卡,多路經驅動需要約1分鐘的時間,去識别鍊路故障
[root@docker-01 scripts]# ifdown eth1
[root@docker-02 mapper]# multipath -ll ##多路經驅動需要約1分鐘的時間,去識别鍊路故障
1IET 00010001dm-0 docker,target1
size=2.0G features='0'hwhandler='0'wp=rw
|-+-policy='round-robin 0'prio=0status=active
| `- 10:0:0:1 sde 8:64 failed faulty running
##連結運作不正常 faulty故障
`-+- policy='round-robin 0' prio=1 status=enabled
`- 9:0:0:1 sdd 8:48 active ready running
##會卡在這個地方,大約一分鐘後,檢測故障結束
[root@docker-01 scripts]# ifup eth1
Determining ifip address 172.17.1.160 is already inuse fordevice eth1...
[root@docker-02 mapper]# multipath -ll
1IET 00010001dm-0 docker,target1
size=2.0G features='0'hwhandler='0'wp=rw
|-+-policy='round-robin 0'prio=1status=active
| `- 10:0:0:1 sde 8:64 active ready running
##鍊路運作正常
`-+- policy='round-robin 0' prio=1 status=enabled
`- 9:0:0:1 sdd 8:48 active ready running
9、在應用伺服器上使用udev規則為target建立固定名字的軟連結
udev概述:udev 是Linux kernel 2.6系列的裝置管理器。它主要的功能是管理/dev目錄底下的裝置節點。udev會根據使用者添加/删除硬體的行為,自處理/dev目錄下所有裝置檔案。
主配置檔案**:/etc/udev/udev.conf**
裝置檔案名字規則目錄:
[root@localhost ~]# ls /lib/udev/rules.d/10-dm.rules
/lib/udev/rules.d/10-dm.rules
命名規律:開頭為數字, 結尾是 .rules
運作機制和注意事項:
1、udev按照規則檔案名的數字順序來查詢全部規則檔案,然後為比對規則的裝置,建立其裝置檔案或檔案連結。
2、通常情況下,建議讓自己想要的規則檔案最先被解析。比如,建立一個名為 /etc/udev/rules.d/10-myrule.rules的檔案,并把你的規則寫入該檔案,這樣udev就會在解析系統預設的規則檔案之前解析到你的檔案。
3、在規則檔案裡,除了以“#”開頭的行(注釋),所有的非空行都被視為一條規則,但是一條規則不能擴充到多行。
4、規則都是由多個鍵值對(key-valuepairs)組成,并由逗号隔開,鍵值對可以分為條件比對鍵值對(以下簡稱“比對鍵”)和指派鍵值對(以下簡稱“指派鍵”),一條規則可以有多條比對鍵和多條指派鍵。
5、比對鍵是比對一個裝置屬性的條件,當一個裝置的屬性比對了該規則裡所有的比對鍵,就認為這條規則生效,然後按照指派鍵的内容,執行該規則的指派。
說明:如果有一個裝置被核心實别sdb1,則該條件生效,執行後面的指派:在/dev下産生一個名為my_ disk的裝置檔案,并把裝置檔案的權限設為0666。
詳細參數說明
udev**規則的比對鍵**
- ACTION:事件 (uevent) 的行為,例如:add( 添加裝置 )、remove( 删除裝置 )。
- KERNEL:核心裝置名稱,例如:sda, cdrom。
- DEVPATH:裝置的 devpath 路徑。
- SUBSYSTEM:裝置的子系統名稱,例如:sda 的子系統為 block。
- BUS:裝置在 devpath 裡的總線名稱,例如:usb。
- DRIVER:裝置在 devpath 裡的裝置驅動名稱,例如:ide-cdrom。
- ID:裝置在 devpath 裡的識别号。
- SYSFS{filename}:裝置的 devpath 路徑下,裝置的屬性檔案“filename”裡的内容。
- ENV{key}:環境變量。在一條規則中,可以設定最多五條環境變量的 比對鍵。
- PROGRAM:調用外部指令。
- RESULT:外部指令 PROGRAM 的傳回結果。
udev**重要的指派鍵**
- NAME:在 /dev下産生的裝置檔案名。隻有第一次對某個裝置的 NAME 的指派行為生效,之後比對的規則再對該裝置的 NAME 指派行為将被忽略。如果沒有任何規則對裝置的 NAME 指派,udev 将使用核心裝置名稱來産生裝置檔案。
- SYMLINK:為 /dev/下的裝置檔案産生符号連結。由于 udev 隻能為某個裝置産生一個裝置檔案,是以為了不覆寫系統預設的 udev 規則所産生的檔案,推薦使用符号連結。
- OWNER, GROUP, MODE:為裝置設定權限。
- ENV{key}:導入一個環境變量
udev**規則操作符**
- “==”:比較鍵、值,若等于,則該條件滿足;
- “!=”:比較鍵、值,若不等于,則該條件滿足;
- “=”:對一個鍵指派;
- “+=”:為一個表示多個條目的鍵指派。
- “:=”:對一個鍵指派,并拒絕之後所有對該鍵的改動。目的是防止後面的規則檔案對該鍵指派。
# KERNEL是比對鍵,NAME和MODE是指派鍵。
僅當操作符是“==”或者“!=”時,其為比對鍵;若為其他操作符時,都是指派鍵。
相關文章:http://www.361way.com/udev-disk-order/3954.html
實戰:在應用伺服器172,17,1,151上使用udev規則為每個target建立固定名字的軟連結
對iscsi多路徑共享的裝置裝置,讓核心識别成:my_disk
在進行udev綁定的時候,可以是一個未分區的磁盤,也可以是磁盤的一個分區。
檢視共享裝置磁盤的UUID:
[root@localhost ~]# /lib/udev/scsi_id --whitelisted --replace-whitespace /dev/sdb
1IET_00010001
[root@localhost ~]# vim /etc/udev/rules.d/10-sda.rules
KERNEL=="sd?1",SUBSYSTEM=="block",PROGRAM="/lib/udev/scsi_id --whitelisted --replace-whitespace /dev/$name", RESULT=="1IET_00010001", SYMLINK+="my-disk1", MODE="0660"
參數:
# KERNEL是比對鍵, SUBSYSTEM:裝置的子系統名稱,例如:sda 的子系統為block。udevadm info -a -p /sys/block
# PROGRAM:調用外部指令;
# RESULT:外部指令 PROGRAM 的傳回結果。
# SYMLINK:為/dev/下的裝置檔案産生符号連結。由于udev 隻能為某個裝置産生一個裝置檔案,是以為了不覆寫系統預設的udev 規則所産生的檔案,推薦使用符号連結。
[root@localhost opt]# cd /dev/mapper/
[root@localhost mapper]# ls
1IET\x20\x20\x20\x20\x20000100011IET\x20\x20\x20\x20\x2000010001p1
[root@localhost mapper]# mount /dev/mapper/1IET\\x20\\x20\\x20\\x20\\x2000010001p1 /opt/
[root@localhost mapper]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 97G 2.6G 89G 3% /
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 ext4 190M 52M 129M 29% /boot
/dev/mapper/1IET\x20\x20\x20\x20\x2000010001p1
ext4 2.0G 3.0M 1.9G 1% /opt