在 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 日

内容

概述

AIX 技术术语介绍

实验环境及测试方法描述

测试记录

测试结果分析

测试心得

总结

参考资料

评论

概述

在 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.

 

发表评论

邮箱地址不会被公开。 必填项已用*标注