HACMP(High Availability Cluster Multiprocessing)是AIX平台上常见的高可用集群方案,在较新的版本中也称为PowerHA SystemMirror。双节点HACMP的核心逻辑并不复杂:两个节点共享磁盘资源,通过心跳网络互相感知状态,任意一个节点故障时,另一个节点接管服务地址、共享卷组和应用启动脚本。真正影响配置成功率的,往往不是软件安装本身,而是节点解析是否一致、心跳路径是否冗余、共享卷组是否可以被正确激活,以及应用脚本返回码是否符合规范。

内容按照实际部署顺序组织,先讲规划准备,再讲核心配置、同步启动和切换验证,最后把容易出现的错误和运维注意事项单独展开。
一、配置前先理清四类对象
HACMP配置通常会涉及节点、网络、共享存储和应用脚本四类对象。节点方面要确认每个节点的AIX主机名、集群节点名以及/etc/hosts中的解析条目保持一致,尤其是boot地址的解析不能依赖外部DNS,否则同步阶段很容易出现节点名不一致错误。网络方面至少要区分服务网络、心跳网络和管理网络,服务地址用于业务对外连接,心跳网络用于节点间状态通讯。共享存储需要两节点都能识别到相同的磁盘PVID和卷组信息,应用脚本则要放在两节点相同的绝对路径下,并提前进行手工启停测试。
以双节点为例,可以先做一个规划表。节点1和节点2分别配置两块物理网卡绑定boot地址,服务地址单独配置在可飘移的网卡上,心跳网段使用独立交换机或直连网线。共享磁盘建议采用多路径方式接入,避免单个HBA卡故障导致集群无法切换。规划完成后,可以先在两节点检查hostname、lspv、lsdev -Cc disk等输出,确认磁盘和网络基础状态一致。
这里给出一个/etc/hosts基础配置示例,实际使用时需要替换为现场地址:
# /etc/hosts 示例 192.168.1.11 node1_boot node1 192.168.1.12 node2_boot node2 10.0.0.11 node1_svc 10.0.0.12 node2_svc 10.10.0.11 node1_hb 10.10.0.12 node2_hb
心跳地址建议单独规划网段,不要在服务网络里复用。否则业务流量突增时可能把心跳打成阻塞,导致集群出现误切换。节点间还需要提前配置rsh或ssh信任,HACMP同步和远程执行命令时会依赖这一层通信,很多同步失败最后查下来都是远程信任没有配好。
二、定义集群、网络和资源组
基础环境准备好后,进入核心配置。通常可以在AIX上执行smitty hacmp打开集群管理菜单。第一次配置时建议使用扩展配置模式,这种方式可以更细致地控制节点、网络和资源组。先通过Extended Configuration下的节点管理功能,把两个节点添加进集群,添加时需要填写集群名、节点名和节点对应的boot地址。注意集群节点名和AIX主机名最好完全一致,不要出现大小写混用或简称,否则后续同步会反复报节点定义不一致。
网络配置部分要定义每一条网络和IP标签,服务网络、心跳网络、管理网络分开创建。服务IP需要标记为可以飘移,boot IP和心跳IP则属于节点固定地址。心跳网络建议至少配置两条,一条走以太网,另一条可以走串口心跳或第二块心跳网卡。只有一条心跳路径的集群在交换机故障时,两个节点都会认为对方已经宕机,容易产生脑裂,这是生产环境非常忌讳的。
资源组配置先把共享卷组和应用脚本绑定起来。资源组类型通常选择cascading或rotating,cascading表示主节点故障后切到备节点,原主节点恢复后再根据策略决定是否回切;rotating则按节点顺序轮转。每个资源组需要指定参与节点、服务IP标签、共享卷组以及应用启停脚本。脚本必须放在两节点相同路径,并具有执行权限。下面是一个简单的应用启停脚本示例:
#!/bin/ksh
case "$1" in
start)
/usr/local/bin/start_app.sh
exit $?
;;
stop)
/usr/local/bin/stop_app.sh
exit $?
;;
*)
exit 1
;;
esac
这类脚本最关键的是返回码。start和stop分支执行成功后必须返回0,HACMP会根据返回码判断动作是否成功。如果应用内部脚本没有正确返回0,集群会认为资源组启停失败,进而继续尝试切换或者把资源组置于错误状态。配置完资源组后建议先在两节点手工测试脚本,不要等到切换时才发现脚本有问题。
三、执行同步并进行启动验证
所有配置项完成后,先不要直接启动集群,应该先执行同步验证。可以执行/usr/es/sbin/cluster/utilities/clmgr sync cluster,也可以从smitty hacmp菜单选择Extended Verification and Synchronization。同步过程会检查拓扑、资源组、节点配置和远程通信,把配置分发到对端节点。同步完成后如果出现ERROR,需要先解决所有错误再启动,带错误启动的集群在切换时会出现不可预测的行为。
同步通过后启动集群服务,使用smitty clstart或者命令行方式启动。启动完成后,用clRGinfo查看资源组当前所在节点和状态,用clstat查看集群整体运行情况。下面命令可以连续执行,确认资源组已经正常上线:
/usr/es/sbin/cluster/utilities/clmgr start cluster clRGinfo clstat -o
切换验证不要一上来就重启服务器或拔电源,可以从移动资源组开始。通过smitty hacmp里的资源组管理菜单选择Move Resource Group to Another Node,观察服务IP是否成功飘到备节点、共享卷组是否在备节点被自动varyon、应用脚本是否在备节点执行成功。这个过程中如果某个环节失败,日志里会保留具体报错,更适合作为排错依据。
四、常见错误及对应排查方法
第一个高频错误是同步阶段提示node name not defined或者拓扑不一致。多数原因是两节点/etc/hosts中节点名、地址不一致,或者集群节点名和AIX主机名不完全相同。可以先在两节点执行hostname、clshowres、cltopinfo查看集群定义和本机信息,确认完全一致后再重新同步。
第二个常见问题是心跳网络中断导致两个节点互相判断对方故障。尤其在生产环境只配置了一条心跳路径,交换机或网线故障时就会出现脑裂风险。解决思路是至少配置两条独立心跳路径,并定期检查心跳网卡状态和丢包情况。已经配置了串口心跳的集群,还要确认串口线两端参数一致,避免串口心跳长期处于不可用状态。
第三个问题是共享卷组在切换后无法激活。这种情况经常和磁盘PVID不一致、卷组在两节点都已被varyon、或者磁盘reserve策略错误有关。可以分别在两节点执行lspv和lsdev -Cc disk,确认两边看到的是同一组PVID。对于非并发卷组,把磁盘的reserve_policy设置为no_reserve,避免主备节点争抢磁盘锁。测试时不要在两节点同时手工varyonvg,否则集群接管时可能发现卷组已经被占用。
第四个问题是应用启停脚本返回非零。HACMP对脚本返回码非常敏感,脚本内部即使应用已经启动,只要最后一条命令返回非零,集群就会认为启动失败。建议脚本里显式捕获内部命令返回码,必要时写入/var/tmp下的日志文件,例如echo "start script executed" >> /var/tmp/app_ha.log。日志里要记录时间、动作和结果,这样切换失败时不用重新复现,直接看脚本输出就能判断是哪一步出错。
第五个问题是资源组切换后一直pending,或者在clRGinfo里看不到明确的在线节点。这种问题需要查看/var/hacmp/log/hacmp.out和/var/hacmp/log/clstrmgr.debug。日志里通常会记录心跳丢失、脚本超时或卷组激活失败的具体原因。排查时结合切换时间点来看日志,比只看当前状态更容易定位。
五、配置与日常运维注意事项
HACMP配置完成后,每一次修改都不能省掉同步验证这一步。很多现场问题都是因为改了一个IP标签或资源组参数后没有再次同步,导致两个节点配置不一致,切换时一边按新配置执行,另一边还按旧配置运行。配置修改建议先在维护窗口中进行,修改前使用AIX快照或备份方式保存当前配置和ODM信息,便于回退。
日常运维中要定期检查集群状态,关注clstat输出中的节点状态、心跳状态和资源组位置。对于硬件变更、操作系统补丁升级、多路径软件调整等操作,最好先移动资源组到另一节点,再对空闲节点进行维护。维护完成后不要立即回切,先观察资源组运行和应用日志,确认稳定后再根据需要决定是否切回。
还有一点容易忽略的是脚本路径和版本管理。应用启停脚本不要只放在主节点,备节点上的脚本内容、权限、路径必须完全一致。脚本中如果调用了第三方命令或数据库工具,也要确认备节点具备同样的环境和用户权限。否则切换虽然成功,应用却无法真正对外提供服务,这类故障往往比集群本身的问题更隐蔽。