实验环境: silence80,silence84 配置双网卡 。
服务端:silence80.cnIP:192.168.1.63 eth0 ,br; IP:192.168.2.63 eth1 , vmnet4
客户端:silence84.cnIP:192.168.1.64 eth0 ,br; IP:192.168.2.64 eth1 , vmnet4
实战拓扑图:
使用多路径,必免单点故障
精简版实现拓扑图:
配置一个 IP SAN 存储服务器 。
将 silence80 配置成 ip san,将 silence80 上的 sda4 分区,通过 ip san 共享出去。
服务器端: targetsilence80
客户端:initiatorsilence84
配置网络环境:
silence80 :
生成 eth1 配置文件,IP ,192.168.2.63
#setup
[[email protected] Desktop]# service network restart
silence84:
生成 eth1 配置文件,IP ,192.168.2.64
#setup
#service network restart
安装 tgtd 服务器:
[[email protected] Desktop]# yum install -y scsi-target-utils
准备一个磁盘: sda4
[[email protected] ~]# fdisk /dev/sda#划分出 sda4 分区
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): p
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0x000b8b35
Device BootStartEndBlocksId System
/dev/sda1*12620480083 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda22613011024000083 Linux
/dev/sda313011428102400082 Linux swap / Solaris
Command (m for help): n
Command action eextended
pprimary partition (1-4)
p
Selected partition 4
First cylinder (1428-2610, default 1428): Using default value 1428
Last cylinder, +cylinders or +size{K,M,G} (1428-2610, default 2610): +1G
Command (m for help): w
The partition table has been altered! Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy. 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.
[[email protected] ~]#reboot
配置 target ,把 sda4 分区共享出去 修改配置文件
vim /etc/tgt/targets.conf#写入以下内容
在参考这段内容并在段内容后,追加以下红色标记内容:
#<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>
为:
<target iqn.2015-01.cn.xuegod.www:target_san1>
backing-store /dev/sda4 initiator-address 192.168.1.64
initiator-address 192.168.2.64#在访问控制列表中添加一个客户端
vendor_id xuegod product_idtarget1
</target>
注释:
default-driver iscsi#此配置文件默认全部注释,使用 iscsi 驱动
<tarrget iqn.2015-1.cn.xuegod.www:target_san1> # iscsi 正规名字栺式 : iqn.年-月.主机名 倒着写: target 端名字
backing-store /dev/hda4# 可以是具体的分区,也可以是 DD 出来的文件。不能小于 1G。(后 面的文件系统是 GFS,光日志空间就 128M)
initiator-address 192.168.1.64#指定允许访问的此存储主机
initiator-address 192.168.2.64#指定允许访问的此存储主机
vendor_id “xuegod.cn” #供应厂商编号 标识这个设备(字符不要过长)
product_id "TARGET1"# 产品编号
</target>
3)启动服务
[[email protected] Desktop]#service tgtd restart
[[email protected] Desktop]# netstat -antup | grep 3260
tcp00 0.0.0.0:32600.0.0.0:*LISTEN
3130/tgtd
tcp00 :::3260:::*LISTEN
3130/tgtd
4) 查看状态 tgt-admin --show #开启了服务show的时候才能看到
[[email protected] Desktop]# tgt-admin --show
Target 1: iqn.2015-01.cn.xuegod.www:target_san1
System information: Driver: iscsi State: ready
I_T nexus information:
LUN information: LUN: 0
Type: controller
SCSI ID: IET00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Readonly: No
Backing store type: null Backing store path: None Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET00010001
SCSI SN: beaf11
Size: 5372 MB, Block size: 512
Online: Yes
Removable media: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/sda4
Backing store flags: Account information:
ACL information: #允许哪些客户端可以访问
192.168.1.64
192.168.2.64
开机启动:
[[email protected] Desktop]# chkconfig tgtd on
配置客户端: silence84
安装包:
[[email protected] ~]# rpm -ivh /mnt/Packages/iscsi-initiator-utils-6.2.0.872-34.el6.x86_64.rpm
需要先发现 target 存储,再启动客户端服务,才有效
[[email protected] ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.63:3260
Starting iscsid:[ OK ] #发时,会自动把 iscsid 服 务启动
192.168.1.63:3260,1 iqn.2015-01.cn.xuegod.www:target_san1
[[email protected] ~]# /etc/init.d/iscsi restart# 根据/var/lib/iscsi/ 中发现的信息,识别设备
Stopping iscsi:[ OK ]
Starting iscsi:[ OK ]
开机自动启动:
[[email protected] ~]# chkconfig iscsi on
[[email protected] ~]# chkconfig iscsid on
查看发现到新硬盘:
[[email protected] ~]# ls /dev/sdb
/dev/sdb
在 silence80 服务端查看链接状态
[[email protected] ~]# netstat -antup | grep 3260
tcp00 0.0.0.0:32600.0.0.0:*LISTEN
1999/tgtd
tcp00 192.168.1.63:3260192.168.1.64:46553
ESTABLISHED 1999/tgtd
tcp00 :::3260:::*LISTEN
1999/tgtd
客户端从另一条线路发现设备:
[[email protected] ~]# iscsiadm -m discovery -t sendtargets -p 192.168.2.63
192.168.2.63:3260,1 iqn.2015-01.cn.xuegod.www:target_san1 [[email protected] ~]# rpm -ivh /mnt/Packages/tree-1.5.3-2.el6.x86_64.rpm [[email protected] ~]# tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│ └── iqn.2015-01.cn.xuegod.www:target_san1
│├── 192.168.1.63,3260,1
││ └── default
│└── 192.168.2.63,3260,1
│└── default
├── send_targets
│ ├── 192.168.1.63,3260
││├ ─ ─iqn.2015-01.cn.xuegod.www:target_san1,192.168.1.63,3260,1,default ->
/var/lib/iscsi/nodes/iqn.2015-01.cn.xuegod.www:target_san1/192.168.1.63,3260,1
│ │ └── st_config
│ └── 192.168.2.63,3260
│├ ─ ─ iqn.2015-01.cn.xuegod.www:target_san1,192.168.2.63,3260,1,default ->
/var/lib/iscsi/nodes/iqn.2015-01.cn.xuegod.www:target_san1/192.168.2.63,3260,1
│└── st_config
识别出硬盘并查看:
[[email protected] ~]# /etc/init.d/iscsi restart
Stopping iscsi:[ OK ] Starting iscsi:[ OK ] [[email protected] ~]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb /dev/sdc
挂载硬盘测试数据:
[[email protected] ~]# fdisk /dev/sdb#使用 sdb 中所有空间,创建 sdb1 分区 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x337c0db1.
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 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 for help): n
Command action eextended
pprimary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1019, default 1): Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1019, default 1019): Using default value 1019
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table. Syncing disks.
[[email protected] ~]# mkfs.ext4 /dev/sdb1 [[email protected] ~]# mount /dev/sdb1 /opt/ [[email protected] ~]# df -h
FilesystemSize Used Avail Use% Mounted on
/dev/sda29.7G 3.7G 5.5G 41% /
tmpfs569M0 569M0% /dev/shm
/dev/sda1194M28M 157M 15% /boot
/dev/sr03.4G 3.4G0 100% /mnt
/dev/sdb15.0G 138M 4.6G3% /opt
注:可以看到 sdb1 可以正常使用
[[email protected] ~]# ls /dev/sdc*#查看不到 sdc1
/dev/sdc
[[email protected] ~]# /etc/init.d/iscsi restart#重启 iscsi 服务,重新挂载存储
Stopping iscsi:[ OK ] Starting iscsi:[ OK ] [[email protected] ~]# ls /dev/sdc*
/dev/sdc /dev/sdc1
[[email protected] ~]# mkdir /tmp/sdc1 [[email protected] ~]# mount /dev/sdc1 /tmp/sdc1/
[[email protected] ~]# df -h
FilesystemSize Used Avail Use% Mounted on
/dev/sda29.7G 3.7G 5.5G 41% /
tmpfs569M0 569M0% /dev/shm
/dev/sda1194M28M 157M 15% /boot
/dev/sr03.4G 3.4G0 100% /mnt
/dev/sdc15.0G 138M 4.6G3% /tmp/sdc1
/dev/sdb15.0G 138M 4.6G3% /opt
实例 5: 在存储客户端 silence84 上配置多路径 安装多路经软件
[[email protected] ~]# yum install device-mapper-multipath -y
使用默认配置文件启动
[[email protected] ~]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf
/etc/
[[email protected] ~]# service multipathd restart
[[email protected] ~]# multipath -ll#没有输出消息。 表示出错了。
解决:把正在使用中的 sdb1 和 sdbc1 卸载了
[[email protected] ~]# ll /dev/sd*
brw-rw---- 1 root disk 8, 0 Jul 31 21:03 /dev/sda brw-rw---- 1 root disk 8, 1 Jul 31 21:03 /dev/sda1 brw-rw---- 1 root disk 8, 2 Jul 31 21:03 /dev/sda2 brw-rw---- 1 root disk 8, 3 Jul 31 21:03 /dev/sda3 brw-rw---- 1 root disk 8, 16 Jul 31 21:23 /dev/sdb brw-rw---- 1 root disk 8, 17 Jul 31 21:23 /dev/sdb1
brw-rw---- 1 root disk 8, 48 Jul 31 21:23 /dev/sdd
brw-rw---- 1 root disk 8, 49 Jul 31 21:23 /dev/sdd1 [[email protected] ~]#
[[email protected] ~]# umount /opt/ [[email protected] ~]# umount /tmp/sdc1/
[[email protected] ~]# /etc/init.d/iscsi restart
Stopping iscsi: [ OK ] Starting iscsi:[ OK ] [[email protected] ~]#
[[email protected] ~]# multipath -ll
mpatha (1IET00010001) 远程存储设备的产品信息 dm-0 xuegod(厂商),target1(产品 ID)
size=1.0G features=‘0‘ hwhandler=‘0‘ wp=rw
|-+- policy=‘round-robin 0‘ prio=1 status=active #默认使用 active 的链路
| `- 7:0:0:1 sdd 8:48 active ready running
`-+- policy=‘round-robin 0‘ prio=1 status=enabled #有效的链路,但不是活动链路
`- 6:0:0:1 sdc 8:32 active ready running
#默认配置并不会实现负载均衡,只会实现高可用的效果。
# (1IET00010001) 远程存储设备的产品信息,由于 sda 和 sdb 对应的都是远端同一个存储,所 以产品信息是一样的,最后被多路经驱动发现,所以为他们生成了一个设备文件/dev/mapper/mpatha
# ll /dev/mapper/mpatha*
lrwxrwxrwx 1 root root 7 1 月 13 09:02 /dev/mapper/mpatha -> ../dm-2 lrwxrwxrwx 1 root root 7 1 月 13 09:02 /dev/mapper/mpathap1 -> ../dm-3
如图:
实战 2:修改配置文件,启动高可用负载均衡模式,并自定义多路经设备文件的名字:
vim /etc/multipath.conf
改:19 defaults {// 取消原本只有三行的配置
20user_friendly_names yes
21 }
为:
# defaults {// 取消原本只有三行的配置
#user_friendly_names yes
# }
参考:
在 63 行以下插入以下内容:
multipaths {
multipath {
wwid"" aliaswebdata path_grouping_policy multibus path_selector "round-robin 0" failback manual
rr_weightpriorities no_path_retry 5
}
}
注释:
multipaths {
multipath {
wwid"1IET00010001"#填写硬盘产品关键信息,中间需要5个空格,否则不成功。
aliaswebdata#自定义名字 path_grouping_policymultibus path_selector "round-robin 0" failback manual
rr_weightpriorities no_path_retry 5
}
}
重启服务 multipathd,测试负载均衡:
[[email protected] ~]# service multipathd restart
Stopping multipathd daemon: [ OK ] Starting multipathd daemon:[ OK ] [[email protected] ~]# service iscsi restart#需要重新实别一下存储 再次查看:
[[email protected] ~]# multipath -ll
webdata (1IET00010001) dm-0 xuegod,target1
size=5.0G features=‘1 queue_if_no_path‘ hwhandler=‘0‘ wp=rw
`-+- policy=‘round-robin 0‘ prio=1 status=active#启用负载均衡模式
|- 8:0:0:1 sdb 8:16 active ready running
`- 9:0:0:1 sdc 8:32 active ready running
注:之前相当于主备,现在相当于负载均衡 。
测试:
[[email protected] ~]# ls /dev/mapper/webdata*
webdata webdatap1# webdata 对应硬盘 sdb, webdata1 对应硬盘中的第一个分区
[[email protected] ~]# mount /dev/mapper/webdatap1 /mnt/ [[email protected] ~]# cp /boot/vmlinuz-2.6.32-220.el6.x86_64 /mnt [[email protected] ~]# ls /mnt/
lost+found passwd vmlinuz-2.6.32-220.el6.x86_64
实战 2:模拟故障: 断开一条链路。测试链路高可用,关闭其中一个网卡,多路经驱动需要约 1 分钟的时 间,去识别链路故障
[[email protected] ~]# ifdown eth1
查看链路状态:
[[email protected] ~]# multipath -ll#多路经驱动需要约 1 分钟的时间,去识别链路故障
webdata (1IET00010001) dm-0 xuegod,target1
size=5.0G features=‘1 queue_if_no_path‘ hwhandler=‘0‘ wp=rw
`-+- policy=‘round-robin 0‘ prio=1 status=active
|- 12:0:0:1 sdb 8:16 active faulty running# 链接运行不正常 faulty 故障
`- 13:0:0:1 sdc 8:32 active ready running
#会卡在这个地方,大约一分钟后,检测故障结束
[[email protected] ~]# multipath -ll
webdata (1IET00010001) dm-0 xuegod,target1
size=5.0G features=‘1 queue_if_no_path‘ hwhandler=‘0‘ wp=rw
`-+- policy=‘round-robin 0‘ prio=1 status=active
|- 12:0:0:1 sdb 8:16 failed faulty running #1 分钟后,显示链路连接失败。
`- 13:0:0:1 sdc 8:32 active ready running
测试写入数据:
[[email protected] ~]# cp /boot/grub/ /mnt/ -r
[[email protected] ~]# ls /mnt/
grub lost+found passwd vmlinuz-2.6.32-220.el6.x86_64
注:数据可以正常写入,说明,高可用成功。
打开链路,过一段时间再看:
[roo[email protected] ~]# ifup eth1 [[email protected] ~]# multipath -ll
webdata (1IET00010001) dm-0 xuegod,target1
size=5.0G features=‘1 queue_if_no_path‘ hwhandler=‘0‘ wp=rw
`-+- policy=‘round-robin 0‘ prio=1 status=active
|- 8:0:0:1 sdb 8:16 active ready running
`- 9:0:0:1 sdc 8:32 active ready running# 链路运行正常
实战:在应用服务器上使用 udev 规则为 target 创建固定名字的软链接
udev 概述:udev 是 Linux kernel 2.6 系列的设备管理器。它主要的功能是管理/dev 目录底下的设 备节点。udev 会根据用户添加/删除硬件的行为,自处理/dev 目录下所有设备文件。
主配置文件:/etc/udev/udev.conf
设备文件名字规则目录:
[[email protected] ~]# ls /etc/udev/rules.d/
40-hplip.rules 90-alsa.rules
命名规律: 开头:数字, 结尾: .rules
运行机制和注意事项:
1、udev 按照规则文件名的数字顺序来查询全部规则文件,然后为匹配规则的设备,创建其设备文件或文 件链接。
2 、 通 常 情 况 下 , 建 议 让 自 己 想 要 的 规 则 文 件 最 先 被 解 析 。 比 如 , 创 建 一 个 名 为
/etc/udev/rules.d/10-myrule.rules 的文件,并把你的规则写入该文件,这样 udev 就会在解析系统默 认的规则文件之前解析到你的文件。
3、在规则文件里,除了以“#”开头的行(注释),所有的非空行都被视为一条规则,但是一条规则不能 扩展到多行。
4、规则都是由多个键值对(key-valuepairs)组成,并由逗号隔开,键值对可以分为条件匹配键值对(以 下简称“匹配键”)和赋值键值对(以下简称“赋值键”),一条规则可以有多条匹配键和多条赋值键。
5、匹配键是匹配一个设备属性的条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则 生效,然后按照赋值键的内容,执行该规则的赋值。
实战:让系统把 sda1 识别为 my_root_disk
说明:如果有一个设备被内核实别 sda1,则该条件生效,执行后面的赋值:在/dev 下产生一个名为
my_root_disk 的设备文件,并把设备文件的权限设为 0666。
[[email protected] udev]# cd /etc/udev/rules.d/ [[email protected] rules.d]# vim 10-sda.rules #写入 KERNEL=="sda1",NAME="my_root_disk", MODE="0666"
# KERNEL 是匹配键,NAME 和 MODE 是赋值键。
仅当操作符是“==”或者“!=”时,其为匹配键;若为其他操作符时,都是赋值键。 详细参数说明: ACTION:事件的行为,例如:add(添加设备)、remove(删除设备)。 KERNEL:内核设备名称,例如:sda, cdrom。
NAME:在/dev 下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的 规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内 核设备名称来产生设备文件。
MODE 是赋值键。 赋的值是权限。
运行 udev
[[email protected] rules.d]# start_udev
Starting udev: [ OK ]
# start_dev 命令重启 udev 守护进程,并对所有的设备重新查询规则目录下所有的规则文件,然后执行 所匹配的规则里的行为。通常使用该命令让新的规则文件立即生效
start_udev 一般没有标准输出,所有的 udev 相关信息都按照配置文件(udev.conf)的参数设置,由
/var/log/messages 记录。
测试:
[[email protected] rules.d]# ls /dev/my_root_disk
/dev/my_root_disk
[[email protected] rules.d]# ls /dev/sda*#发没有 sda1 了
/dev/sda /dev/sda2 /dev/sda3 [[email protected] rules.d]# start_udev
[[email protected] rules.d]# ll /dev/my_root_disk /dev/sda2 #查看权限
brw-rw-rw- 1 root disk 8, 2 May 12 20:17 /dev/my_root_disk
brw-rw---- 1 root disk 8, 1 May 12 20:17 /dev/sda2#硬盘设备默认权限为 0660
测试挂载:
[[email protected] rules.d]# mkdir /tmp/sda1
[[email protected] rules.d]# mount /dev/my_root_disk /tmp/sda1 [[email protected] rules.d]# ls !$
ls /tmp/sda1
config-2.6.32-220.el6.x86_64lost+found
efisymvers-2.6.32-220.el6.x86_64.gz grubSystem.map-2.6.32-220.el6.x86_64
实战 2:在应用服务器 silence84 上使用 udev 规则为每个 target 创建固定名字的软链接 对 iscsi 多路径共享的设备设备,让内核识别成:my_disk
查看 sdb 设备大小:
[[email protected] rules.d]# cat /sys/block/sdb/size
10491617# block 数
或:
查看设备信息:
[[email protected] rules.d]# udevadm info -a -p /sys/block/sdb | egrep "mode|size" ATTR{size}=="10491617" # block 数
ATTRS{model}=="target1#产品标识
[[email protected] rules.d]# vim /etc/udev/rules.d/10-sda.rules #写入以下内容
#KERNEL=="sda1",NAME="my_root_disk", MODE="0666" SUBSYSTEM=="block", SYSFS{size}=="10491617", SYMLINK="my_disk"
参数:
SUBSYSTEM:设备的子系统名称,例如:sda 的子系统为 block。 SYSFS{filename}:设备的 devpath 路径下,设备的属性文件“filename”里的内容。 例如:SYSFS{model}==“ST936701SS”表示:如果设备的型号为 ST936701SS,则该设备匹配该匹 配键值。
SYMLINK:为/dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以 为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
启动 udev
[[email protected] rules.d]#start_udev
查看:
[[email protected] rules.d]# ll /dev/my_disk
lrwxrwxrwx 1 root root 4 Jul 31 22:50 /dev/my_disk -> dm-0 [[email protected] rules.d]# mount /dev/my_disk /opt/ mount: special device /dev/mapper/webdata does not exist
#这是因为 my_disk 对应的是 dm-0 ,这个相当于 sdb,没有做分区,所有不能使用。