最近,我遇到了一个有趣的AIX逻辑卷管理器(LVM)问题。 一位客户报告说,他无法将卷组(VG)备份映像还原到可用的存储区域网络(SAN)磁盘。 restvg
命令显示一条I / O失败消息,并且LVM日志显示错误代码47 EWRPROTECT
,这表明该磁盘已被写保护 。 但是,当他与SAN存储服务器管理员检查了此问题时,他们确认根本没有对存储服务器的磁盘设置任何写保护限制。
这个问题使我和顾客感到困惑。 我花了几天的时间进行调查,最终确定了此问题的根本原因。 这是由于IBM PowerHA SystemMirror 7.1的新功能,即存储框架磁盘防护 ,它阻止了对该磁盘的写访问。
我意识到此新功能是PowerHA SystemMirror 7.1的一个重大更改,但似乎仅在PowerHA SystemMirror 7.1公告信和IBMRedbooks®中提到过。 所以,我想在这里分享我的研究。
比较卷组被动模式和存储框架磁盘防护
在PowerHA 6.1和早期版本中,在快速磁盘接管模式下使用增强的并发卷组时,在拥有资源组的节点上,VG处于完全读/写(活动)模式。 任何备用节点的VG在只读(被动)模式下均处于打开状态。 被动模式相当于磁盘防护的LVM。
被动模式仅允许读取卷组描述符区域和每个逻辑卷的前4 KB。 它不允许对文件系统或逻辑卷的读/写访问。 它还不支持LVM操作。 但是,低级命令(例如dd
)可以绕过LVM并直接写入磁盘。 而且,当增强的并发卷组发生变化时,磁盘上将不再具有写保护限制。
PowerHA SystemMirror 7.1使用存储框架磁盘防护,并防止从AIX SCSI磁盘驱动程序层进行磁盘写访问,从而使较低级别的操作(例如dd
)成功的可能性无效。 这项新功能可防止由于意外从多个节点访问共享磁盘而导致数据损坏,即使在增强的并发卷组发生变化后,它也可以保护磁盘。
PowerHA SystemMirror 7.1如何使用存储框架磁盘防护
存储框架磁盘防护功能是AIX节点本地的。 因此,PowerHA集群中的每个节点都为PowerHA SystemMirror 7.1管理的每个增强型并发卷组设置并维护了隔离区组。
PowerHA SystemMirror 7.1使用三个实用程序: cl_vg_fence_init
, cl_set_vg_fence_height
和cl_vg_fence_term
来初始化,管理和终止存储框架篱笆组和磁盘防护。 当磁盘被只读访问EWPROTECT
时,AIX SCSI磁盘驱动程序拒绝磁盘写访问并返回EWPROTECT
错误。
hacmp.out文件中的以下PowerHA日志显示了PowerHA SystemMirror 7.1如何使用此功能。
- 当PowerHA节点启动时,
node_up
事件调用cl_vg_fence_init
来为所有增强的并发卷组添加一个存储框架篱笆组,并将增强的并发卷组中的所有磁盘设置为只读篱笆高度。 这样可以防止对磁盘的写访问。Dec 27 15:52:55 EVENT START: node_up hacmp93 ... :node_up[256] : Setup VG fencing. This must be done prior to any potential disk access. :node_up[258] node_up_vg_fence_init ... :node_up:havg1[node_up_vg_fence_init:104] : Volume group havg1 is an HACMP resource :node_up:havg1[node_up_vg_fence_init:110] fence_height=ro ... :cl_vg_fence_redo[112] cl_vg_fence_init -c havg1 ro hdisk2 ... cl_vg_fence_init[279]: sfwAddFenceGroup(havg1, 1, hdisk2) cl_vg_fence_init[385]: creat(/usr/es/sbin/cluster/etc/vg/havg1.uuid) cl_vg_fence_init[393]: write(/usr/es/sbin/cluster/etc/vg/havg1.uuid, 16) cl_g_fence_init[427]: sfwSetFenceGroup(vg=havg1, height=ro(2) uuid=7b139a551bc137c92bd7e1a28905a901): ... cl_vg_fence_redo[113] RC=0
用于AIX存储框架的篱笆组和磁盘防护的
sfwAddFenceGroup()
和sfwSetFenceGroup()
接口,并且AIXkdb
命令可以显示存储框架中篱笆组和磁盘防护的详细信息。(0)> sfw_info sfw_info_t *sfw_info = 0x60D02C0 struct anchor { int cfg_cnt = 0x2 lock_t lock = 0xFFFFFFFFFFFFFFFF; void *entrypts = 0xF1000A0000A8A800 sfwobjhdr_t *cluster_head = 0xF1000A1FC0BD6200 sfwobjhdr_t *cluster_tail = 0xF1000A1FC0BD6200 sfwobjhdr_t *node_head = 0xF1000A1FC0BD6D80 sfwobjhdr_t *node_tail = 0xF1000A1FC0BD6D80 sfwobjhdr_t *fgrp_head = 0xF1000A1FC0BD7A80 <- Fence group sfwobjhdr_t *fgrp_tail = 0xF1000A17D0F37200 sfwobjhdr_t *disk_head = 0xF1000A0031042500 <- Disk Fencing sfwobjhdr_t *disk_tail = 0xF1000A17D0F34880 ... (0)> sfwobjhd -l 0xF1000A1FC0BD7A80 struct object_header { uint type = 0x7 uint subtype = 0x0 char name = "havg1" <- Set fence group name to VG name char uuid = 0x7B139A551BC137C92BD7E1A28905A901 void *dptr = 0xF1000A1FC0B00420 struct object_header *next = 0xF1000A17D0F37200 struct object_header *link = 0xF1000A0031042500 } object_header.dptr=0xF1000A1FC0B00420 struct sfw_fencegroup_obj { uint height = 0x2 sfwobjhdr_t *head = 0x0 } (0)> sfwobjhd -l 0xF1000A0031042500 struct object_header { uint type = 0x3 uint subtype = 0x0 char name = "hdisk2" char uuid = 0x80EE86210C6F8A0CAC83D697E5041B6C void *dptr = 0xF1000A0031042580 struct object_header *next = 0xF1000A0031042600 struct object_header *link = 0x0 } object_header.dptr=0xF1000A0031042580 struct sfw_disk_obj { dev_t devno = 0x8000001800000001 uint state = 0x8017 uint type = 0x1 uint height = 0x2 ... (0)> scsidisk hdisk2 ... ulong64_t state = 0x0000000000080002; ONLINE FENCED <- FENCED state prevents write access from SCSI disk driver ... struct sfw_dattrs_t &sfw = 0xF1000A0150736B50 { uint64_t state = 0x10017; uint local_state = 0x00000000; uchar dtype = 0x1; uchar fheight = 0x2; uchar rmode = 0x201; uchar orig_rmode = 0x201; uchar raw_devsn = 0xA059329A; }; ...
- 在更改增强型并发卷组之前,VG的篱笆高度由
cl_set_vg_fence_height
设置为读写 。 然后,varyonvg
命令可以工作,并且在被动变通后它会返回到“只读”,以防止再次进行磁盘写访问。:cl_pvo(0.123):havg1[849] varyonp havg1 ... :cl_pvo(0.124):havg1[varyonp:271] : Make sure the volume group is not fenced. Varyon requires read write access. :cl_pvo(0.124):havg1[varyonp:274] cl_set_vg_fence_height -c havg1 rw :cl_pvo(0.128):havg1[varyonp:275] RC=0 ... :cl_pvo(0.128):havg1[varyonp:289] : Try to vary on the volume group in passive concurrent mode :cl_pvo(0.128):havg1[varyonp:291] varyonvg -c -P -O havg1 :cl_pvo(0.717):havg1[varyonp:292] rc=0 ... :cl_pvo(0.717):havg1[varyonp:345] : Restore the fence height to read only, for passive varyon :cl_pvo(0.718):havg1[varyonp:347] cl_set_vg_fence_height -c havg1 ro :cl_pvo(0.718):havg1[varyonp:348] RC=0
- 当PowerHA资源组联机时,增强的并发卷组将在活动模式下打开,并且它们的围栅高度设置为读写 ,并授予对磁盘的写访问权限。
+rg1:cl_activate_vgs(0.103):havg1[vgs_chk:91] clvaryonvg -n havg1 ... +rg1:clvaryonvg(0.038):havg1[807] : require read/write access. So, set any volume group fencing appropriately. +rg1:clvaryonvg(0.038):havg1[809] cl_set_vg_fence_height -c havg1 rw +rg1:clvaryonvg(0.041):havg1[810] RC=0 ... +rg1:clvaryonvg(0.255):havg1[1037] varyonvg -n -c -A -O havg1 +rg1:clvaryonvg(0.773):havg1[1038] varyonvg_rc=0
- 增强的并发卷组的篱笆高度保持在读写模式下,直到资源组降落到另一个节点为止。 发生跌倒时,增强的并发卷组会发生变化,并且它们的围栏高度会更改为只读 。
Dec 28 03:52:03 EVENT START: rg_move hacmp94 1 RELEASE +rg1:cl_deactivate_vgs:havg1[712] vgs_varyoff havg1 32 ... +rg1:cl_deactivate_vgs(1.515):havg1[vgs_varyoff:281] (( 0 == 0 )) +rg1:cl_deactivate_vgs(1.515):havg1[vgs_varyoff:284] : successful varyoff, set the fence height to read-only +rg1:cl_deactivate_vgs(1.516):havg1[vgs_varyoff:287] cl_set_vg_fence_height -c havg1 ro +rg1:cl_deactivate_vgs(1.519):havg1[vgs_varyoff:288] RC=0
并且,接管资源组的节点中增强型并发卷组的篱笆高度从只读更改为读写 ,并且始终仅对活动节点授予对磁盘的写访问权限。
+rg1:process_resources[3091] eval JOB_TYPE=DISKS ACTION=ACQUIRE HDISKS='"hdisk3"' RESOURCE_GROUPS='"rg1' '"' VOLUME_GROUPS='"havg1"' ... +rg1:clvaryonvg(0.030):havg1[807] : require read/write access. So, set any volume group fencing appropriately. +rg1:clvaryonvg(0.030):havg1[809] cl_set_vg_fence_height -c havg1 rw +rg1:clvaryonvg(0.033):havg1[810] RC=0
- 当在所有节点上停止PowerHA服务时,所有增强型并发卷组的篱笆高度都将设置为在所有节点上均为读写状态 。
:node_down_complete[356] : The last node out turns off fencing on all nodes :node_down_complete[358] node_down_vg_fence_term ... :node_down_complete:havg1[node_down_vg_fence_term:81] cl_on_cluster -P 'cl_set_vg_fence_height -c havg1 rw' :node_down_complete:havg1[node_down_vg_fence_term:89] return 0
如果安装了AIX APAR IV65140,则将
cl_vg_fence_term
命令以终止所有节点中的磁盘防护。
存储框架磁盘防护的LVM操作问题
PowerHA SystemMirror 7.1对磁盘写访问实施严格的控制。 它使用rw
选项调用cl_set_vg_fence_height
命令,以允许对其所有需要写入磁盘的命令进行磁盘写入访问,并且当这些命令完成后,它将再次禁止磁盘写入访问。 它要求您对PowerHA C-SPOC菜单中的PowerHA增强的并发卷组执行所有LVM更改操作,否则您将遇到与我在本文开头提到的类似的LVM操作失败。
但是,并非所有LVM操作都可以在PowerHA C-SPOC内完成(例如,我提到的restvg
命令)。 因此,有时您可能必须从PowerHA中删除增强的并发卷组,或者停止所有节点中的PowerHA服务来执行此操作。 现在,您可以使用cl_set_vg_fence_height
命令打破磁盘防护,这是另一种方法,如下所示:
# cl_set_vg_fence_height
Usage: cl_set_vg_fence_height [-c] <volume group> [rw|ro|na|ff]
# cl_set_vg_fence_height -c havg1 rw
然后使用cl_getdisk
检查磁盘防护状态。
# cl_getdisk hdisk3
Disk name: hdisk3
Disk UUID: 4248df415c0e31c8 1f4d3e193d4548e9
Fence Group UUID: 25251b0a37f7a5cd f9c3e9bd4a7f2d8e (vg1)
Disk device major/minor number: 19, 5
Fence height: 0 (Read/Write)
Reserve mode: 513 ( )
Disk Type: 0x01 (Local access only)
Disk State: 32785
如果要终止磁盘防护组,则可以使用cl_vg_fence_term
命令。
# cl_vg_fence_term
Usage: cl_vg_fence_term [-c] <volume group>
# cl_vg_fence_term -c havg1
# cl_getdisk hdisk3
Disk name: hdisk3
Disk UUID: 4248df415c0e31c8 1f4d3e193d4548e9
Fence Group UUID: 0000000000000000 0000000000000000 - Not in a Fence Group
Disk device major/minor number: 19, 5
Fence height: 0 (Read/Write)
Reserve mode: 513 ( )
Disk Type: 0x01 (Local access only)
Disk State: 17
局限性
现在,仅多路径I / O(MPIO)磁盘支持存储框架磁盘防护功能。 对于其他磁盘类型,PowerHA SystemMirror 7.1使用此防护功能可能会导致错误消息。 您可以忽略这些类型的错误消息。
翻译自: https://www.ibm.com/developerworks/aix/library/au-aix-storage-powerha-system-mirror71/index.html