oracle rac通过三重心跳+quorum算法+io fencing主动预防脑裂,仅加一块私网网卡无法阻止脑裂,因真正决定节点去留的是多数派原则:需同时满足访问超半数voting disk且网络心跳确认多数节点在线。
oracle rac 本身不“处理”脑裂,而是通过三重心跳机制 + quorum 算法 + io fencing 主动预防脑裂发生;冗余私网只是其中一环,单独配置它无法阻止脑裂。
为什么仅加一块私网网卡不能防脑裂
私网中断只是触发条件之一。真正决定节点去留的是「多数派原则」:集群必须能访问到超过半数的 Voting Disk,同时能通过网络心跳确认多数节点在线。如果只依赖私网,当交换机故障导致网络分区、但所有节点仍能访问共享存储时,disktimeout(默认 200 秒)会比 misscount(默认 30 秒)晚得多才触发判断——这中间的时间窗口就是脑裂高发期。
常见错误现象:
- 两个节点各自认为对方宕机,都试图接管 VIP 和服务
-
crsctl check cluster -all显示部分节点状态为CRS-4638: Oracle High Availability Services is online,但crsctl stat res -t中ora.cluster_interconnect.haip资源反复 OFFLINE/ONLINE - 告警日志出现
ORA-29740: evicted by member或cssd(ocssd.bin) terminating node due to lost network heartbeat
所以冗余私网的目标不是“让心跳不断”,而是降低单点故障概率,给磁盘心跳和 Quorum 判定争取时间。
配置双私网网卡并启用 HAIP 的实操要点
Oracle 11.2.0.2+ 默认启用 HAIP(Highly Available IP),它会在所有标记为 cluster_interconnect 的网卡上自动分配一个 169.254.x.x 的浮动地址,无需手动配置 VIP。但必须确保:
- 两块网卡(如
enp0s8和enp0s9)已物理连入同一私网交换机(或主备交换机),且 IP 段相同(如都是10.10.10.0/24) - 执行
oifcfg setif -global enp0s9/10.10.10.0:cluster_interconnect后,用oifcfg getif确认两块网卡都被识别为cluster_interconnect - 重启
has(crsctl stop has && crsctl start has)后,ifconfig应看到两个网卡下都出现了169.254.x.x的子接口(如enp0s8:1和enp0s9:1) - 不要在操作系统层做 bond(如 mode=1 主备),HAIP 会自行管理链路切换;若已做了 bond,需先解绑再交由 HAIP 管理
注意:HAIP 不提供负载均衡,只做故障切换;它也不感知业务流量,纯粹服务于 CSSD 进程间通信。
必须同步调整的三个关键参数
misscount、disktimeout 和 reboottime 是 Quorum 决策链上的三道闸门,缺一不可:
-
misscount:网络心跳容忍丢失秒数。默认 30,建议设为 60(crsctl set css misscount 60),给私网短暂抖动留出缓冲 -
disktimeout:Voting Disk 心跳超时秒数。默认 200,必须 >misscount,建议设为 240(crsctl set css disktimeout 240),避免磁盘延迟误判 -
reboottime:节点被驱逐后强制重启等待秒数。默认 3,太短会导致频繁重启,建议设为 10(crsctl set css reboottime 10)
这三个值一旦修改,需在所有节点执行并重启 cssd(crsctl stop crs && crsctl start crs)。修改前务必确认 Voting Disk 在 ASM 中状态正常(asmcmd lsdg 查看 state = MOUNTED)。
最容易被忽略的 IO Fencing 配置
即使 Quorum 正确驱逐了节点,若该节点仍在运行并写入共享存储(比如 OCR 或数据文件),脑裂就已完成。这时必须靠 IO Fencing 强制其停止——而 Oracle RAC 默认依赖 SCSI Reserve/Release,前提是:
- 所有 Voting Disk 和 OCR 所在的 LUN 必须支持 SCSI-3 Persistent Reservation(PR)
- 存储多路径软件(如 DM-Multipath)必须启用
features "1 queue_if_no_path"并禁用no_path_retry,否则 reserve 会被路径切换打断 - 检查是否生效:
sg_persist -n -i /dev/mapper/mpatha应返回PR generation=xxx,而非SCSI status: Reservation Conflict
没配好 IO Fencing 的集群,就像装了刹车却没连油管——Quorum 可以喊停,但车轮还在转。











