单网卡私网配置等于给集群埋雷,因其无法防止单点故障导致私网心跳中断,引发cssd在css_misscount超时后误判脑裂并驱逐节点;必须采用双网卡+haip冗余方案,配合rp_filter=2及正确oifcfg配置,确保network heartbeat持续可用。

为什么单网卡私网配置等于给集群埋雷
Oracle RAC私网链路不是“能通就行”,而是必须冗余。单网卡或单交换机故障会直接触发cssd进程驱逐节点,日志里出现ORA-29740、CRS-1601就是典型信号。这不是网络抖动问题,是设计缺陷——私网中断后,disk heartbeat仍有效,但network heartbeat断了,CSSD在css_misscount(默认30秒)内无法确认多数节点在线,就会按脑裂逻辑驱逐“疑似失联”节点。
双网卡+HAIP才是RAC 11.2.0.2+的正确冗余姿势
别在OS层做bond0绑定(尤其禁用mode=0),Oracle GI从11.2.0.2起自带ora.cluster_interconnect.haip资源,自动管理多网卡切换。关键动作只有三步:
- 确保两块网卡(如
enp0s8、enp0s9)物理接入同一私网子网(例如10.10.10.0/24),且不跨VLAN - 运行
oifcfg setif -global enp0s8/10.10.10.0:cluster_interconnect和oifcfg setif -global enp0s9/10.10.10.0:cluster_interconnect,再用oifcfg getif确认两者都标为cluster_interconnect - 重启集群:
crsctl stop has && crsctl start has,然后检查ifconfig是否出现两个169.254.x.x子接口(如enp0s8:1、enp0s9:1)
注意:HAIP不负载均衡,只做故障切换;它也不感知业务流量,纯为cssd心跳服务。
rp_filter=2是Linux下HAIP生效的硬性前提
即使oifcfg配对、网卡连通,rp_filter=1(Linux默认)也会让HAIP失效:node1从enp0s8发包,node2从enp0s9回包,严格反向路径检查直接丢弃响应,导致LMON报No connectivity to other instances。必须全局设为2:
- 临时生效:
sysctl -w net.ipv4.conf.all.rp_filter=2 - 永久生效:在
/etc/sysctl.conf中加net.ipv4.conf.all.rp_filter = 2,并执行sysctl -p - 验证:
sysctl net.ipv4.conf.all.rp_filter输出必须是2,不能只改eth0或lo接口
验证冗余是否真生效,不能只看ping
ping -I bond0 -c 5 <peer_private_ip></peer_private_ip>这种测试没意义——你根本没用bond0。真实验证要分三层:
- 拔掉节点A的
enp0s8网线,立刻执行tcpdump -i enp0s9 port 12345,确认心跳包(源/目标端口12345)持续发出且被对端收到 - 同时拔掉节点A所连交换机的上联光纤,观察
crsctl check cluster -all是否仍显示两节点ONLINE,而非瞬间驱逐 - 查
crsctl stat res -t | grep haip,状态必须稳定为ONLINE,若反复OFFLINE/ONLINE,说明oifcfg配置与物理IP子网不一致,或rp_filter没生效
最易忽略的是:oifcfg setif里的子网必须是网络地址(如10.10.10.0),不能写成主机地址(如10.10.10.11);且所有节点必须全停后统一修改,否则PRIF-26错误会让元数据错乱。











