在 SAN 环境中如何使共享 hdisk 保持数据一致性
在 SAN 环境中如何使共享 hdisk 保持数据一致性
在 SAN 日益普及的今天,提到 SAN 环境我们就会想到 :数据高可用、I/O 高性能和数据在服务器间共享等特性。当来自 SAN 中的 LUN 在多个服务器间共享时,我们通常会使用集群软件来保证它们之间数据的一致性的。但是如果在开发,测试环境中没有安装这些集群软件,或在生产环境中某个 LUN 没有被定义到集群中,数据的一致性又该如何保护和实现的呢?在本文会介绍 AIX 中 MPIO hdisk 的 reserve_policy,以及通过对它的正确设置实现数据的共享及保护的方法。
朱 靖虹, 高级 IT 工程师, IBM
朱靖虹 2001 年加入 IBM公司. 在Advanced Technical Skill部门负责AIX, PowerVM, PowerHA 的相关技术支持工作。您可以通过 developerWorks 社区与 朱靖虹 联系。
2013 年 7 月 29 日
内容
概述
在 SAN 技术日益普及的今天,提到 SAN 环境我们就会想到 – 数据高可用、I/O 高性能和数据在系统间共享等特性。当来自 SAN 中的 hdisk 在多个系统间共享时,我们通常会使用集群软件来保证它们之间数据的一致性。
但是如果在开发,测试环境中没有安装集群软件,或在生产环境中某个 hdisk 没有被定义到集群中,但又要使多个 AIX 系统共享它,此时数据的一致性又该如何实现的呢?在本文会介绍 AIX 中 MPIO hdisk 的 reserve_policy 属性,以及通过对它的正确设置实现数据的共享及保护的方法。
在一次去客户现场的时候,有一位负责测试开发的工程师问我:为了测试方便,他们将 SAN 环境中的 LUN 同时 mapping 给了多个 AIX 系统,这几个系统间没有配置 PowerHA 集群, 由哪一个 AIX 系统使用这些 hdisk, 是靠手工来协调的。所以经常由于大意,两个 AIX 系统同时做了 varyonvg 的操作,将该 hdisk 上的卷组 (VG) 给激活,使得用裸设备的数据库会宕掉或起不来; 在 mount 起的文件系统上,明确记得已保存了的文件,当下次再用时找不到了,或内容丢失;有时侯文件系统突然间就不能写了,辛辛苦苦编写的东西转眼就消失了。有什么办法使这几个 hdisk,在多个 AIX 系统共享的同时,又阻止同一时刻对 hdisk 进行写操作,以避免上述情况的发生。
我当时告诉他们的办法是将 hdisk 的 reserve_policy 属性由缺省的 no_reserve 改为 single_path,卷组就只能在一个 AIX 上被激活了. 但是 I/O 的性能会有一定的损失.
随着存储技术和 AIX 系统的不断更新,现在大多数的设备和系统都支持 SCSI-3 系列命令。我们有了既满足共享数据一致性要求,又能不损失 I/O 性能的方法。我为此进行了相应的测试,希望能够帮助分析类似错误发生的原因,找到解决问题的办法。下面将结果分享给大家.
AIX 技术术语介绍
MPIO: Multi-path Input Output, 多路径输入和输出
SCSI-3 PR: 表示 SCSI-3 Persistent Reservation. SCSI-3 PR 使用注册登记(Registration)和预约保护方式 (Reservation) 来实现多路径,多系统对共享 MPIO hdisk 的访问。 每个系统要先向 SCSI-3 设备进行注册登记自己的 PR 值,然后以预约保护或共享的方式使用该设备。使用 SCSI-3 的 PR 预约保护在系统关机后保护还是有效的,这就是持续预约保护 (persistent reserve) 所在;而 SCSI-2 的保护在 AIX 系统关机后就无效了。
在 AIX 中 MPIO hdisk 的 reserve_policy 有如下几种:
无保护策略No Reserve reservation policy ( no_reserve)
如果系统中MPIO hdisk选择的是此保护策略的话,就意味该设备不受保护。任何可以识别到它的系统,都可以在任何时候进行I/O 访问。 并且 I/O可以通过多条路到达。 这是目前AIX系统内嵌的和SDDPCM多路径软件的缺省保护策略。
单路径排他保护策略 Exclusive Host Access single-path reservation policy (single_path)
它使用的是SCSI-2的保护策略。 使用该保护策略时,尽管MPIO hdisk 的 所有路径都是打开的, 但只在一条路做了SCSI-2的保护,I/O 请求只能通过这一条路径到达。 当选中的路径发生问题时,该路径保护被释放; 在其他备选路径中重新选择一条,再加上 I/O保护, 所有的I/O请求转到新路径上。多路径的特性没有被充分利用,损失了I/O 性能。
持续排他预约保护策略Persistent Reserve Exclusive Host Access reserve policy (PR_exclusive)
如果AIX系统中的 MPIO hdisk 设置的是此预约保护策略,表示该hdisk 的访问保护是由一个 SCSI-3 PR 值来控制的,任何AIX系统如果注册登记了与hdisk的当前预约保护PR值相同的话,就可以访问此它。 通常我们要为每个AIX系统的MPIO hdisk设置一个唯一的PR值,不同的系统应设置不同PR值。这样就能很容易知道当前谁在使用该hdisk. 由于MPIO hdisk的所有路径注册的PR值是相同的,这样I/O 请求就被发送到MPIO hdisk的所有路径上,可以提高数据访问的性能。这是在非并发,非集群环境中应该为MPIO hdisk选择的保护策略。 我们可以用 pcmquerypr 命令来检查hdisk 所使用的保护策略(resrvpolicy)和已注册登记的PR值(Key0)。由于该hdisk使用的是 PR_exclusive保护策略,只能注册一个PR值。
#pcmquerypr -Vh /dev/hdisk8connection type: fscsi0open dev: /dev/hdisk8Attempt to read reservation key…Attempt to read registration keys…Read Keys parameter Generation : 196 Additional Length: 8 Key0 : 0x00000000000ABCD3resrvpolicy= PR_exclusiveReserve Key provided by current host=0xabcd3 (hex)0xabcd3Reserve Key on the device: 0x00000000000ABCD3Reservation key type: 0x5Reserved by the current host with 0xabcd3
持续共享预约保护策略Persistent Reserve Shared Host Access reserve policy (PR_shared) 如果系统中的 MPIO hdisk 选择的是此保护策略,表示hdisk 是可共享访问的.无论哪个系统只要是使用了SCSI-3 PR值进行了注册登记,并且reserve_policy=PR_shared就可以访问此MPIO hdisk。 在并发的集群环境中选择此策略来设置在多个AIX系统间共享的hdisk。 我们可以用 pcmquerypr 命令来检查hdisk 所使用的保护策略(resrvpolicy)和已注册登记的PR值(Key0,Key1)。由于该hdisk使用的是 PR_shared保护策略,所以能注册多个PR值。
#pcmquerypr -Vh /dev/hdisk8connection type: fscsi0open dev: /dev/hdisk8Attempt to read reservation key…Attempt to read registration keys…Read Keys parameter Generation : 229 Additional Length: 16 Key0 : 0x00000000000ABCD3 Key1 : 0x0000000000009876resrvpolicy= PR_sharedReserve Key provided by current host = 0x9876 (hex)0x9876Device is shared by the current host with reserve_type 7
系统是否支持 SCSI-3 的 PR 保护策略,与所连接的存储设备驱动程序及多链路软件有关。在 AIX 中可以使用 lsattr 命令来检查。若命令输出中包含 no_reserve, single_path,PR_exclusive 和 PR_shared 表示此 hdisk 支持 SCSI-3 PR 和 SCSI-2 保护策略;若 lsattr 命令输出只有 no_reserve, single_path, 表示此 hdisk 只支持 SCSI-2 的保护策略。
实验环境及测试方法描述
测试环境
服务器: 2 个 p710
操作系统: AIX 7.1-TL1-SP4
存储设备: XIV
sddpcm: 2.6.3.1
测试步骤一
将来自于 XIV 上的 LUN, mapping 给两个 AIX 系统,使它们可同时看到同一块 hdisk。在其中一个 AIX 系统上创建卷组和文件系统,另一个 AIX 系统做 importvg 操作,使两边的卷组信息在开始时是一致的。
测试步骤二
通过使用 chdev 命令,修改 MPIO hdisk 的 PR_key_value, reserve_policy 和 algorithm 来验证卷组是否可同时被两个 AIX 系统读写。
测试内容
包括激活卷组,mount 文件系统,使用 dd 命令向 lv 中读、写数据
# varyvg prtestvg # mount /prfs #dd if=/dev/rprlv1 of=/dev/null # dd if=/dev/zero of=/dev/rprlv2
测试记录
两 AIX 系统的 PR_key_value 值不同
在两个 AIX 系统上为同一块 MPIO hdisk 设置不同的 PR_key_value 时,通过修改 reseve_policy 属性,观察是否有访问保护。
root@serve1/>chdev -l hdisk9 -a PR_key_value=0x1234 -a reserve_policy=PR_exclusive root@serve1/>chdev -l hdisk9 -a PR_key_value=0x1234 -a reserve_policy=PR_shared
root@server 2/>chdev -l hdisk9 -a PR_key_value=0x2345 -a reserve_policy=PR_exclusiveroot@server 2/>chdev -l hdisk9 -a PR_key_value=0x2345 -a reserve_policy=PR_shared
First node policy: 首先执行 varyonvg 命令的 AIX 系统所设置的 reserve_policy
Second node policy:随后执行 varyonvg 命令的 AIX 系统所设置的 reserve_policy
表 1.两 AIX 系统的 PR_key_value 设置为不同值时的读写情况
Second node policy First node policy | PR_exclusive | PR_shared |
PR_exclusive | 由于 PR 值不同,第二个 AIX 系统无法激活卷组 | 由于 PR 值不同,第二个 AIX 系统无法激活卷组 |
PR_shared | 由于 PR 值不同,第二个 AIX 系统无法激活卷组 | I/O 的访问不受 PR 值的限制,VG 可同时被激活。在没有 PowerHA 和并发应用软件控制的情况下,文件系统和裸设备有被破坏的可能。 |
两 AIX 系统的 PR_key_value 值相同
在两个 AIX 系统上为同一块 MPIO hdisk 设置相同的 PR_key_value 时,通过修改 reseve_policy 属性,观察是否有访问保护。
root@server1/>chdev -l hdisk9 -a PR_key_value=0x1234 -a reserve_policy=PR_exclusive root@server1/>chdev -l hdisk9 -a PR_key_value=0x1234 -a reserve_policy=PR_shared
root@server2/>chdev -l hdisk9 -a PR_key_value=0x1234 -a reserve_policy=PR_shared root@server2/>chdev -l hdisk9 -a PR_key_value=0x1234 -a reserve_policy=PR_exclusive
First node policy: 首先执行 varyonvg 命令的 AIX 系统所设置的 reserve_policy
Second node policy:随后执行 varyonvg 命令的 AIX 系统所设置的 reserve_policy
表2.两 AIX 系统的 PR_key_value 设置为相同值时的读写情况
Second node policy First node policy | PR_exclusive | PR_shared |
PR_exclusive | PR 值相同,VG 可同时被激活。在没有 PowerHA 和并发应用软件控制的情况下,文件系统和裸设备有被破坏的可能。 | PR 值相同,VG 可同时被激活。在没有 PowerHA 和并发应用软件控制的情况下,文件系统和裸设备有被破坏的可能。 |
PR_shared | VG 只能被第一个做 varyonvg 的 PR_shared 节点所访问, 直到手工将预约保护清除,PR_exclusive 才可访问 | I/O 的访问不受 PR 值的限制,VG 可同时被激活。在没有 PowerHA 和并发应用软件控制的情况下,文件系统和裸设备有被破坏的可能。 |
两 AIX 一个使用 PR, 另一个使用 single_path 或 no_reserve
在两个 AIX 系统上对同一块 MPIO hdisk, 一个 AIX 系统设置 PR_key_value,另一个系统不设或设 PR 值,通过修改 reseve_policy 属性,观察是否有访问保护。
First node policy: 首先执行 varyonvg 命令的 AIX 系统所设置的 reserve_policy
Second node policy:随后执行 varyonvg 命令的 AIX 系统所设置的 reserve_policy
表3. 两 AIX 系统的一个设置 PR_key_value, 另一使用 scsi-2 方式时的读写情况
Second node policy First node policy | PR_exclusive | PR_shared | no_reserve | single_path |
PR_exclusive | 见表 1 和表 2 | 见 表 1 和表 2 | VG 可同时在两个 AIX 上激活,但只有设置 PR_exclusive 的 AIX 才可以对此 VG 进行读写操作。设置为 No_reserve 的 AIX 不能进行任何写操作。 | VG 只能被第一个执行 varyonvg 命令的系统所访问。第二个 AIX 系统无法激活卷组 |
PR_shared | 见 表 1 和表 2 | 见 表 1 和表 2 | VG 可同时在两个 AIX 上激活,但只有设置 PR_shared 的 AIX 才可以对此 VG 进行读写操作。设置为 No_reserve 的 AIX 不能进行任何写操作。 | VG 只能被第一个执行 varyonvg 命令的系统所访问。第二个 AIX 系统无法激活卷组 |
no_reserve | VG 可同时在两个 AIX 上激活。但当 VG 被设置为 PR_exclusive 的 AIX 激活后,它就完全拥有读写权限。设置为 no_reserve 的系统对 VG 只能读,不能进行写操作,之前 mount 的文件系统会被破坏。 | VG 可同时在两个 AIX 上激活。但当 VG 被设置为 PR_shared 的 AIX 激活后,它就完全拥有读写权限。设置为 no_reserve 的系统对 VG 只能读,不能进行写操作,之前 mount 的文件系统会被破坏。 | VG 可同时被激活。在没有 PowerHA 和并发应用软件控制的情况下,文件系统和裸设备有被破坏的可能。 | VG 可同时在两个 AIX 上激活。但当 VG 被设置为 single_path 的 AIX 激活后,它就完全拥有读写权限。设置为 no_reserve 的系统对 VG 只能读,不能进行写操作,之前 mount 的文件系统会被破坏。 |
single_path | VG 只能被第一个执行 varyonvg 命令的系统所访问。第二个 AIX 系统无法激活卷组 | VG 只能被第一个执行 varyonvg 命令的系统所访问。第二个 AIX 系统无法激活卷组 | VG 只能被第一个执行 varyonvg 命令的系统所访问。第二个 AIX 系统无法激活卷组. | VG 只能被第一个执行 varyonvg 命令的系统所访问。第二个 AIX 系统无法激活卷组 |
测试结果分析
从以上 20 个场景的测试结果可以看到: 在没有 PowerHA 和并发应用软件控制的情况下, 只有将 MPIO hdisk 的 reserve_policy 设为 PR_exclusive 或 single_path 才能保证数据的完整性. 为了避免 PR_key_value 值相同可能导致的数据不一致, 请一定为每个 AIX 系统中的 hdisk 设置唯一的 PR_key_value.
测试心得
综上述测试结果,在 SAN 环境中要注意的几点:
在没有 PowerHA 和并发应用软件的需求时,不要把一块 LUN 同时 mapping 给多个 AIX 系统,避免可能带来不必要的数据丢失。
使用 lsattr 命令检查共享 hdisk 是否支持 SCSI-3 PR 的保护策略
当前 hdisk 不支持 SCSI-3 的 保护策略,命令结果如下:
$lsattr -Rl hdisk0 -a reserve_policyno_reservesingle_path
如果 hdisk 支持 SCSI-3 的 保护策略,我们会得到如下结果:
$lsattr -Rl hdisk8 -a reserve_policyno_reservesingle_pathPR_exclusivePR_shared
在配置来自于 SAN 的 hdisk 时,如果没有 PowerHA 和并发应用软件的需求,不要使用系统缺省值。尽量给它设置为 reserve_policy=PR_exclusive, PR_key_value, 值尽可能长一些,以免与其他系统的相同. 例如:
#chdev –l hdiskn –a PR_key_value=0x1234abcdef –a reserve_policy=PR_exclusive
如果只是临时做方案验证性测试, 且没有 I/O 性能要求时,也可使用 SCSI-2 的保护方式 #chdev –l hdiskn –a reserve_policy=single_path –a algorithm=fail_over
为了保证数据的一致性和完整性,可以将卷组上的文件系统做进一步的设置, 使它无法同时 mount 在多个系统上 . 例如:
root@server1/>chfs -a mountguard=yes /sharedfsroot@server1/>mount /sharedfs…root@server2/>mount /sharedfsmount: /dev/ttlv1 on /sharedfsCannot mount guarded filesystem.The filesystem is potentially mounted on another node.
如果 AIX 系统中安装了 SDDPCM 软件,也可以使用 pcmquerypr 命令来读取,重置和清除设备上 PR 注册值,以及释放设备上的注册和保护信息。
检查 hdisk 的 PR 状态
#pcmquerypr –Vh /dev/hdiskn
清除 hdisk 上的注册和保护信息
#pcmqueyrpr –ch /dev/hdiskn
重置注册和保护信息
#pcmquerypr –ph /dev/hdiskn
- 其他注意事项:
- 在使用 PR_exclusive 和 single_path 的保护方式时, 一旦对 VG 做了 varyoffvg 操作后,hdisk 上的注册和预约保护就清除了,无需做其他操作另一 AIX 系统就可以访问 VG. 而使用 PR_shared 保护方式时,hdisk 上的注册信息在 varyoffvg 后不会清除,需使用 pcmquerypr 或 chdev 命令先清除保护,才可被其他 single_path 或 PR_exclusive 的 AIX 系统访问.
- 为了使用 PR_exclusive 或 PR_shared 保护策略,在为 MPIO hdisk 设置保护属性时也要同时为其设置一个 PR 值,如:
# chdev –l hdisk9 –a PR_key_value=0xabcd1234 –a reserve_policy=PR_exclusive
-
- 只有系统中 MPIO hdisk 的 reserve_policy 设置为 PR_exclusive 或 PR_shared 或 no_reserve 时,多路径算法 才可设置为 algorithm=load_balance 或 load_balance_por 或 round_robin.
# chdev –l hdisk9 –a algorithm=load_balance –a reserve_policy=PR_shared
-
- 如果系统中 MPIO hdisk 的 reserve_policy 设置是 single_path 时,该 hdisk 的路径算法就只能选择 fail_over.
#chdev –l hdisk9 –a reserve_policy = single_path –a algorithm=fail_over
总结
为了保证数据在多个 AIX 系统中的一致性, 要为 hdisk 加把”锁”. 请将 hdisk 的 reserve_policy 设为 PR_exclusive 或 single_path.
如果遇到问题请使用 pcmquerypr 命令来检查 hdisk 的保护状态.
目前 PowerHA 不支持 PR 的保护方式,根据最新的软件配置要求来设置 hdisk 的 reserve_policy.