Oracle RAC集群的节点间通信依赖私有网络,也就是大家常说的 interconnect。从11.2.0.2版本开始,Oracle引入了HAIP(Highly Available IP)机制,允许集群在最多四块私有网卡上自动虚拟出一组169.254.x.x网段的IP地址,用于承担实例间的数据块传输和缓存融合通信。HAIP的出现解决了早期版本只能靠操作系统层面的bonding来实现私有网卡冗余的问题,但在实际运维中,很多场景又需要将HAIP移除,比如私有网络更换为InfiniBand、网卡做了操作系统级别的绑定,或者集群需要迁移到新的网段。本文将系统讲解HAIP的原理、配置验证以及完整的移除步骤。

HAIP的工作原理与地址分配规则
HAIP的核心思想是利用链路本地地址段169.254.0.0/16。当Grid Infrastructure启动时,ohasd进程会为每块配置为私有网络的网卡分配一个固定编号的HAIP地址,编号从169.254.x.1开始。Oracle在内部维护了一个地址池,即使集群重启、节点重启,只要私有网卡的数量和顺序不变,每个节点的HAIP地址保持稳定,这一点非常重要,因为CSS的互联通信、GES/GCS资源都和这些地址绑定。
Oracle最多支持四块私有网卡参与HAIP,也就是说最多会虚拟出四个HAIP地址。当配置了多块私有网卡时,网格基础架构会在这些网卡之间做负载分担,某块网卡故障后,其上的HAIP会自动漂移到其他存活的网卡上,实现秒级切换。可以通过以下命令查看当前HAIP的分配情况:
# 查看集群中HAIP资源的在线状态 crsctl stat res -t -init | grep -A2 ora.cluster_interconnect.haip # 在操作系统层面查看私有网卡上的169.254地址 ip addr show eth1 # 输出中会看到类似 inet 169.254.88.1/16 scope link global eth1 # 确认各节点使用的互联地址 oifcfg getif
需要注意,169.254网段是保留的链路本地地址,不要手工去修改或删除这些地址,否则可能导致节点被驱逐。另外,通过oifcfg getif看到的cluster_interconnect网卡列表,就是HAIP赖以工作的基础,如果网卡没有被识别为私有网络,HAIP不会在其上分配地址。
HAIP的配置与验证
在标准安装的Grid Infrastructure中,安装程序的集群网络配置页面会区分Public和Private网卡,被标记为Private的网卡会自动启用HAIP,无需手工干预。如果是在安装完成后调整私有网卡,需要使用oifcfg工具。例如新增一块私有网卡eth2:
# 将eth2添加为集群私有网络 oifcfg setif -global eth2/192.168.10.0:cluster_interconnect # 删除旧的私有网卡定义(按实际情况操作) oifcfg delif -global eth1/192.168.0.0 # 使配置生效需要重启所有节点的Grid Infrastructure crsctl stop crs crsctl start crs
验证HAIP是否生效,最直接的方式是查询数据库内部的互联地址。以sysdba登录后执行下面语句,返回的IP应当是169.254开头的地址:
SELECT inst_id, name, ip_value FROM gv$cluster_interconnects ORDER BY inst_id; -- 也可以从gv$instance查看 SELECT inst_id, host_name, instance_name FROM gv$instance;
如果查询结果显示的是物理网卡的实际IP而不是169.254地址,说明HAIP没有被使用,常见原因是CLUSTER_HIGH_SPEED_IP参数中残留了旧配置,或者数据库使用了指定的互联地址。此时要检查clusterware的参数文件和数据库参数cluster_interconnects,后者一旦被显式设置,数据库会绕过HAIP,直接使用指定地址。在正常情况下不建议设置cluster_interconnects,让数据库自动使用HAIP才能获得链路故障切换能力。
HAIP移除的完整流程
当私有网络做了操作系统层的绑定,或者更换为InfiniBand等不需要HAIP的架构时,就必须将HAIP移除。移除操作要严格按顺序执行,核心步骤是:停止集群、修改存储在OCR中的HAIP配置、重启节点。在停止所有节点的Grid Infrastructure之前,先确认没有任何业务依赖:
# 在所有节点上以root执行 crsctl stop crs # 以grid用户确认所有节点已停止后,检查OCR中的HAIP配置 ocrdump -stdout -keyname SYSTEM.css | grep -A5 high_speed
接下来清除HAIP配置。最常用的方式是使用Grid Infrastructure安装介质中gridSetupCmd(老版本为runInstaller)提供的命令,也可以直接修改OCR中的CLUSTER_HIGH_SPEED_IP条目。官方推荐做法如下:
# 进入grid用户的安装目录下的crs/install cd $ORACLE_HOME/crs/install # 老版本11g中使用rootcrs.pl相关脚本前,先备配OCR ocrconfig -manualbackup # 清空HAIP的地址定义(在任一节点以root执行) # 方式一:使用crsctl修改init参数 crsctl delete css parameterfile CLUSTER_HIGH_SPEED_IP -f # 部分版本使用 crsctl delete css parameter CLUSTER_HIGH_SPEED_IP
清除配置后,还需要处理HAIP资源本身。ora.cluster_interconnect.haip是集群初始化层面的资源,正常情况下无法单独删除,当OCR中的地址定义被清空后,该资源在下次启动时会因没有可管理的地址而不再分配IP。重启第一个节点时观察alert日志和ohasd日志:
# 启动并观察日志 crsctl start crs tail -f $GRID_HOME/log/`hostname -s`/alert.log # 确认私有网卡上不再有169.254地址 ip addr show | grep 169.254
节点依次重启完成后,用gv$cluster_interconnects再次验证,此时数据库的互联地址应当变为私有网卡的物理IP。如果节点无法启动或HAIP资源报错,多半是OCR中的条目没有清理干净,可以再次执行ocrdump检查SYSTEM.css节点,必要时用ocrconfig恢复之前的备份回退重来。移除HAIP之后,私有网络的冗余就完全依赖操作系统层面的bonding或交换机堆叠,一定要提前把网卡绑定方案配置好并测试故障切换,避免出现单点故障。
常见问题与注意事项
第一个常见问题是移除HAIP后节点间无法通信导致节点被驱逐。这通常是因为私有网卡的物理IP规划有问题,比如两个节点使用了不同网段,或者防火墙拦截了新的互联端口。在重启集群之前,务必用ping和ssh双向测试所有节点的私有地址。
第二个问题是误操作HAIP导致的CSS重启失败。有人在节点在线状态下直接ifconfig删除了169.254地址,结果CSS心跳检测失败触发节点驱逐,严重时整个集群重启。切记所有HAIP的调整都必须在Grid Infrastructure完全停止的状态下进行,并且要在维护窗口内操作。
最后一点,从12c开始,如果使用了冗余互联方式或者Flex Cluster架构,Oracle更推荐通过操作系统或交换机层面的冗余替代HAIP,新版本安装时甚至不再默认启用。如果你的环境是12c之后的版本,先通过ocrdump确认环境里是否真的存在HAIP再决定是否清理,避免做无谓的操作。操作前做好OCR备份,是所有集群变更工作的底线,一旦出问题可以快速回退到变更前的状态。
Oracle RACHAIP集群私有网络修改时间:2026-09-11 07:38:38