DS4000做LVM Mirror时的IO暂停时间探讨
2008-11-10 08:25:31 来源:WEB开发网在通常的高可靠性要求下,一台DS4000的全冗余设计和RAID保护可以达到客户的要求。随着越来越多的客户对数据的安全性重视程度的加深和对业务连续性的要求的不断提升,客户需要一种全冗余的存储价格设计。例如,同时使用两台交换机,两个Fabric,任何一个出现故障IO都可用通过备份路径进行;同时使用两台DS4000,通过AIX操作系统的LVM Mirror来镜像两台DS4000中的数据,当任何一台DS4000失效后,应用仍然可以访问镜像盘;同时使用两台主机做HACMP,当一台主机运行的应用损坏后另外一台主机可以接管该应用。这个方案是名符其实的全冗余设计。以下是一个典型的连接拓普图:
如图示的拓普结构中,任何一台DS4000,交换机或主机光纤卡,主机失效,对应用都是透明的。但是如果应用的超时参数设置的非常短,就无法实现设计这个全冗余设计的初衷。所以应用的超时设计应该综合考虑所有部分的延时。本文将对整体延时的一部分——AIX的LVM Mirror的IO暂停时间进行讨论和分析。
本文将在单主机的情况下开展讨论。
讨论一:
任何一台DS4000存储服务器内的一个阵列(Array)失效,例如RAID5阵列中的两块硬盘同时离线。阵列处于不能访问状态。
在这种环境下,AIX的LVM Mirror通过与DS4000存储服务器的控制器进行通讯了解到阵列失效的情况,几秒钟后IO就继续与镜像的PV进行了。
注意:在创建Mirror VG的时候,Keep Quorum Checking On 参数应该设为no。而且Mirror VG建成以后应该重新varyoff,varyon这个VG来使这个设置生效。这个参数为yes时的意思是强制Mirror VG的成员总是同步,如果这样设置,那么一个当LVM 检测到一个PV损坏,就会挂起整个VG,IO将不会继续。
讨论二:
如果做LVM Mirror的主机有两块HBA卡,每块卡看到一台DS4000的两个控制器(拓普图如下),其中任何一块HBA损坏的时候,有哪些设置可以减少LVM Mirror暂停的时间呢?
在如图示的环境中,更改以下表格所列的设备的参数将有效的缩短LVM Mirror IO暂停的时间。
注意:在正常的应用环境中更改此参数对性能和稳定性没有影响。
设备 | 参数 | 默认属性 | 更改为 | 参数的含义 | 备注 |
dar | switch_retries | 5 | 0 | 重试与交换机连接的次数 | 更改为0将失去在线升级DS4000 控制器微码的功能 |
hdisk | rw_timeout | 30 | 10 | 每个读写操作超时的时长,单位是秒 | 每个pending的IO都需要等到超时才能通知LVM |
hdisk | reassign_to | 120 | 30 | 发现丢包后多长时间通知主机,单位是秒 | 允许的范围为0到1000秒 |
讨论三:
如果任何一台DS4000的电源全部损坏或主机端到光纤交换机的连接全部断掉,有哪些设置可以减少LVM Mirror IO暂停的时间呢?
在这个情形下,LVM Mirror IO暂停的时间将比前面两种讨论中的场景都有长:讨论一中LVM可以跟DS4000的控制器通讯,所以它清楚地知道PV坏,马上就可以做出只写镜像的PV的决定;讨论二中,LVM只要等到系统设备超时的报告就可以做出只写镜像的PV的决定;而讨论三的情形下,主机与DS4000之间有光纤交换机相隔,光纤交换机为确认端口设备变化而设置了重试次数和超时时间,所以IO暂停的时间相对前两种较长。
更改fscsi设备的参数将缩短LVM Mirror IO暂停的时间。
注意:此参数在一个DS4000控制器或一条通路失效的情况下也能减少切换时间。它需要交换机的支持,IBM的光纤交换机都支持这一设置,在2006年4月份的测试中,我们发现Qlogic SAN Box 5200不支持这一功能。将fscsi参数设为fast_fail对系统的性能和稳定性没有影响。
设备 | 参数 | 默认属性 | 更改为 | 参数的含义 | 备注 |
fscsi | fc_err_recov | delay_fail | fast_fail | 当交换机发现DS4000不在fabric上时,会通知主机的光纤接口卡,fast_fail的意思是当主机接到这个通知后马上fail掉所有对这个设备的IO | 这个设置在一个它DS4000控制器失效,而另一个控制器没有失效的环境下,对减少IO重新路由需要的时间有巨大的帮助 |
与讨论二相同的是主机端的参数设置应为:
设备 | 参数 | 默认属性 | 更改为 | 参数的含义 | 备注 |
dar | switch_retries | 5 | 0 | 重试与交换机连接的次数 | 更改为0将失去在线升级DS4000 控制器微码的功能 |
hdisk | rw_timeout | 30 | 10 | 每个读写操作超时的时长,单位是秒 | 每个pending的IO都需要等到超时才能通知LVM |
hdisk | reassign_to | 120 | 30 | 发现丢包后多长时间通知主机,单位是秒 | 允许的范围为0到1000秒 |
注意:在创建Mirror VG的时候,Keep Quorum Checking On 参数应该设为no。原因参见讨论一。
实例:
硬件环境:
pSeries 630, DS4500, DS4300Turbo 和2109-F16
软件环境:
AIX 5.2 ML6
devices.fcp.disk.array.rte 5.2.0.60
DS4500微码 06.12.03.00
DS4300Turbo微码 06.12.03.00
光纤交换机微码 v3.2.0
1. 每个交换机做两个Zone,连接图如下。
F16-1 zone 如下:
P630_fcs0_DS4500_CtlA1
P630_fcs0_DS4500_CtlB1
F16-2 zone 如下:
P630_fcs1_DS4300T_CtlA1
P630_fcs1_DS4300T_CtlB1
2. 在AIX中删除所有原有光纤设备,重新扫描cfgmgr,检查设备
lspv
fget_config -vA
看到dar0对于dac0/dac1,dar1对于dac2/dac3
3. 更改设备属性
chdev -l fscsi0 -a fc_err_recov=fast_fail -P
chdev -l fscsi1 -a fc_err_recov=fast_fail -P
chdev -l dar0 -a switch_retries=0
chdev -l dar1 -a switch_retries=0
chdev -l hdisk2 -a rw_timeout=10 --例如LUN_1为hdisk2
chdev -l hdisk2 -a reassign_to=30
chdev -l hdisk3 -a rw_timeout=10 --例如LUN_2为hdisk3
chdev -l hdisk3 -a reassign_to=30
注意:如果fscsi设备的属性无法设置,可以将它的子设备都置为define状态
rmdev - l hdisk2
rmdev - l hdisk3
rmdev - l dar0
rmdev - l dar1
rmdev - l dac0
rmdev - l dac1
rmdev - l dac2
rmdev - l dac3
然后运行:
chdev -l fscsi0 -a fc_err_recov=fast_fail -P
chdev -l fscsi1 -a fc_err_recov=fast_fail - P
最后运行:
cfgmgr
检查设备属性可以用命令:
lsattr - El device_name
4. 创建vg,lv,增加另一个lun到vg, 镜像vg,更改quorum属性, varyoffvg,varyonvg 来使quorum设置生效。
mkvg - y vg_name pv_name
mklv - y lv_name vg_name
extendvg - y vg_name new_pv_name
mirrorvg vg_name new_pv_name
chvg - Qn vg_name
varyoffvg vg_name
varyonvg vg_name
5. 用dd来测试一下对lv的读写,用iostat来监视到DS4000的IO。
写:
time dd if=/dev/zero of=/dev/rlv_name bs=1m count=2000 --写2GB的数据
iostat - a 1|grep fcs --如果fcs0和fcs1都有数据说明mirror成功
读:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs --如果fcs0和fcs1都有数据说明mirror成功
6. 测试讨论一中的情况,Fail一个array
以读为例:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs>scenario_1.txt --将IO情况输出到文件
当任务没有完成前在DS4000的Storage Manager中将一个Array中的两个HDD通过菜单设为advance→maintenance→fail drive
lsvg - p vg_name --查看一个PV的状态为missing
等到time dd…命令执行完成,用ctrl+c停止iostat,用vi打开scenario_1.txt文件,删掉有IO的行,仅保留IO暂停时的记录,数出行数并除以二。得到IO暂停的秒数。
7. 在DS4000的Storage Manager中将一个Array中的两个HDD 通过菜单advance→maintenance→revive drive 设为在线。
lsdev - Cc disk -- 检查相应的hdisk直到available
varyoffvg vg_name
varyonvg vg_name -- syncvg
lsvg - l vg_name -- 查看lv的状态是否是closed/sync
8. 测试讨论二中的情况,主机卡失效。
以读为例:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs>scenario_2.txt --将IO情况输出到文件
当任务没有完成前将交换机上一个主机的接口disable或者拔这根光纤线,模拟主机卡失效。
lsvg - p vg_name --查看一个PV的状态为missing
等到time dd…命令执行完成,用ctrl+c停止iostat,用vi打开scenario_2.txt文件,删掉有IO的行,仅保留IO暂停时的记录,数出行数并除以二。得到IO暂停的秒数。
9. Enable交换机上disable的主机接口或者插上这根光纤线,模拟主机卡恢复健康。
lsdev - Cc disk -- 检查相应的hdisk直到available
varyoffvg vg_name
varyonvg vg_name -- syncvg
lsvg - l vg_name -- 查看lv的状态是否是closed/sync
10. 测试讨论三中的情况,一台DS4000失效。
以读为例:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs>scenario_3.txt --将IO情况输出到文件
当任务没有完成前将交换机上所有这台DS4000的主机接口disable或者拔这些光纤线,模拟DS4000失效;也可以关掉DS4000的电源。
lsvg - p vg_name --查看一个PV的状态为missing
等到time dd…命令执行完成,用ctrl+c停止iostat,用vi打开scenario_3.txt文件,删掉有IO的行,仅保留IO暂停时的记录,数出行数并除以二。得到IO暂停的秒数。
11. Enable交换机上disable的DS4000的主机接口或者插上所有拔掉的光纤线,或是打开DS4000电源开关,模拟DS4000恢复健康。
lsdev - Cc disk -- 检查相应的hdisk直到available
varyoffvg vg_name
varyonvg vg_name -- syncvg
lsvg - l vg_name -- 查看lv的状态是否是closed/sync
更多精彩
赞助商链接