实验环境:   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


实战拓扑图:

使用多路径,必免单点故障

iscsi实现多路径_第1张图片

精简版实现拓扑图:

iscsi实现多路径_第2张图片

配置一个 IP SAN 存储服务器 。



将 silence80 配置成 ip san,将 silence80 上的 sda4 分区,通过 ip san 共享出去。 

服务器端: targetsilence80

客户端:initiatorsilence84



配置网络环境:

silence80 :

iscsi实现多路径_第3张图片

生成 eth1 配置文件,IP ,192.168.2.63

#setup

iscsi实现多路径_第4张图片

[root@silence80 Desktop]# service network restart

 silence84:

iscsi实现多路径_第5张图片

生成 eth1 配置文件,IP ,192.168.2.64

#setup

iscsi实现多路径_第6张图片

#service network restart

 

安装 tgtd 服务器:

[root@silence80 Desktop]# yum install -y scsi-target-utils



准备一个磁盘: sda4

[root@silence80 ~]# 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.

[root@silence80 ~]#reboot



配置 target ,把 sda4 分区共享出去 修改配置文件



vim /etc/tgt/targets.conf#写入以下内容

在参考这段内容并在段内容后,追加以下红色标记内容:

#

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 #

为:

backing-store   /dev/sda4 initiator-address 192.168.1.64

initiator-address 192.168.2.64#在访问控制列表中添加一个客户端

vendor_id   xuegod product_idtarget1



注释:

default-driver iscsi#此配置文件默认全部注释,使用 iscsi 驱动

 # 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"# 产品编号



3)启动服务

[root@silence80 Desktop]#service tgtd restart

[root@silence80 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的时候才能看到

[root@silence80 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



开机启动:

[root@silence80 Desktop]# chkconfig tgtd on




配置客户端: silence84

安装包:

[root@silence84 ~]# rpm -ivh /mnt/Packages/iscsi-initiator-utils-6.2.0.872-34.el6.x86_64.rpm



需要先发现 target 存储,再启动客户端服务,才有效

[root@silence84 ~]# 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



[root@silence84 ~]# /etc/init.d/iscsi restart# 根据/var/lib/iscsi/   中发现的信息,识别设备



Stopping iscsi:[   OK   ]

Starting iscsi:[   OK   ]



开机自动启动:

[root@silence84 ~]# chkconfig   iscsi on

[root@silence84 ~]# chkconfig   iscsid on



查看发现到新硬盘:

[root@silence84 ~]# ls /dev/sdb

/dev/sdb



在 silence80 服务端查看链接状态

[root@silence80 ~]# 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



客户端从另一条线路发现设备:

[root@silence84 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.2.63

192.168.2.63:3260,1 iqn.2015-01.cn.xuegod.www:target_san1 [root@silence84 ~]# rpm -ivh /mnt/Packages/tree-1.5.3-2.el6.x86_64.rpm [root@silence84 ~]# 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






识别出硬盘并查看:

[root@silence84 ~]# /etc/init.d/iscsi restart

Stopping iscsi:[   OK   ] Starting iscsi:[   OK   ] [root@silence84 ~]# ls /dev/sd*

/dev/sda   /dev/sda1   /dev/sda2   /dev/sda3   /dev/sdb   /dev/sdc



挂载硬盘测试数据:

[root@silence84 ~]# 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.



[root@silence84 ~]# mkfs.ext4 /dev/sdb1 [root@silence84 ~]# mount /dev/sdb1 /opt/ [root@silence84 ~]# 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 可以正常使用




[root@silence84 ~]# ls /dev/sdc*#查看不到 sdc1

/dev/sdc

[root@silence84 ~]# /etc/init.d/iscsi restart#重启 iscsi 服务,重新挂载存储

Stopping iscsi:[   OK   ] Starting iscsi:[   OK   ] [root@silence84 ~]# ls /dev/sdc*

/dev/sdc   /dev/sdc1

[root@silence84 ~]# mkdir /tmp/sdc1 [root@silence84 ~]# mount /dev/sdc1 /tmp/sdc1/




[root@silence84 ~]# 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 上配置多路径 安装多路经软件

[root@silence84 ~]# yum install device-mapper-multipath -y

使用默认配置文件启动

[root@silence84  ~]#   cp   /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf

/etc/

[root@silence84 ~]# service multipathd restart

[root@silence84 ~]# multipath -ll#没有输出消息。 表示出错了。



解决:把正在使用中的 sdb1 和 sdbc1 卸载了

[root@silence84 ~]# 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 [root@silence84 ~]#



[root@silence84 ~]# umount /opt/ [root@silence84 ~]# umount /tmp/sdc1/



[root@silence84 ~]# /etc/init.d/iscsi restart

Stopping iscsi:  [   OK   ] Starting iscsi:[   OK   ] [root@silence84 ~]#



[root@silence84 ~]# 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 


如图:

iscsi实现多路径_第7张图片

实战 2:修改配置文件,启动高可用负载均衡模式,并自定义多路经设备文件的名字:



vim /etc/multipath.conf

改:19 defaults {// 取消原本只有三行的配置

20user_friendly_names yes

21 }

为:

# defaults {// 取消原本只有三行的配置

#user_friendly_names yes

# }


参考:

iscsi实现多路径_第8张图片

在 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,测试负载均衡:

[root@silence84 ~]# service multipathd restart

Stopping multipathd daemon:  [   OK   ] Starting multipathd daemon:[   OK   ] [root@silence84 ~]#   service iscsi restart#需要重新实别一下存储 再次查看:



[root@silence84 ~]# 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

注:之前相当于主备,现在相当于负载均衡 。




测试:

[root@silence84 ~]# ls /dev/mapper/webdata*

webdata   webdatap1# webdata 对应硬盘 sdb, webdata1 对应硬盘中的第一个分区

[root@silence84 ~]# mount /dev/mapper/webdatap1 /mnt/ [root@silence84 ~]# cp /boot/vmlinuz-2.6.32-220.el6.x86_64 /mnt [root@silence84 ~]# ls /mnt/

lost+found   passwd   vmlinuz-2.6.32-220.el6.x86_64




实战 2:模拟故障: 断开一条链路。测试链路高可用,关闭其中一个网卡,多路经驱动需要约 1 分钟的时 间,去识别链路故障



[root@silence80 ~]# ifdown eth1

查看链路状态:

[root@silence84 ~]# 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

#会卡在这个地方,大约一分钟后,检测故障结束




[root@silence84 ~]# 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



测试写入数据:

[root@silence84 ~]# cp /boot/grub/ /mnt/ -r

[root@silence84 ~]# ls /mnt/

grub   lost+found   passwd   vmlinuz-2.6.32-220.el6.x86_64

注:数据可以正常写入,说明,高可用成功。




打开链路,过一段时间再看:

[root@silence80 ~]# ifup eth1 [root@silence84 ~]# 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



设备文件名字规则目录:

[root@silence84 ~]# 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。



[root@silence84 udev]# cd /etc/udev/rules.d/ [root@xuegod62 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

[root@xuegod62 rules.d]# start_udev

Starting udev: [ OK ]

# start_dev 命令重启 udev 守护进程,并对所有的设备重新查询规则目录下所有的规则文件,然后执行 所匹配的规则里的行为。通常使用该命令让新的规则文件立即生效

start_udev 一般没有标准输出,所有的 udev 相关信息都按照配置文件(udev.conf)的参数设置,由

/var/log/messages 记录。




测试:

[root@xuegod62 rules.d]# ls /dev/my_root_disk

/dev/my_root_disk

[root@xuegod62 rules.d]# ls /dev/sda*#发没有 sda1 了

/dev/sda   /dev/sda2   /dev/sda3 [root@xuegod62 rules.d]# start_udev

[root@xuegod62 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

测试挂载:

[root@silence84 rules.d]# mkdir /tmp/sda1

[root@silence84 rules.d]# mount /dev/my_root_disk /tmp/sda1 [root@silence84 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 设备大小:

[root@xuegod62 rules.d]# cat /sys/block/sdb/size

10491617# block 数


或:

查看设备信息:

[root@xuegod62 rules.d]# udevadm info -a -p /sys/block/sdb | egrep "mode|size" ATTR{size}=="10491617" # block 数

ATTRS{model}=="target1#产品标识




[root@xuegod62 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

[root@silence84 rules.d]#start_udev

查看:

[root@silence84 rules.d]# ll /dev/my_disk

lrwxrwxrwx 1 root root 4 Jul 31 22:50 /dev/my_disk -> dm-0 [root@silence84 rules.d]# mount   /dev/my_disk /opt/ mount: special device /dev/mapper/webdata does not exist

#这是因为 my_disk 对应的是 dm-0   ,这个相当于 sdb,没有做分区,所有不能使用。