Oracle RAC私网延迟导致脑裂的根本原因是ocssd.bin进程受CPU、内存、I/O三重挤压而调度失准,引发网络心跳超时击穿misscount,并非物理网络中断;需重点检查HAIP子接口、UDP通信、防火墙规则及disktimeout与misscount的串行失效链。

私网延迟直接触发ocssd.bin心跳超时,不是网络断了,是进程被系统拖垮
Oracle 11g RAC实例崩溃常被误判为“私网不通”,实际根本原因是ocssd.bin进程在高负载下调度失准,导致网络心跳包发出/接收严重滞后,击穿misscount阈值(默认30秒)。这不是配置错误,而是CPU、内存、I/O三重挤压下的硬性失效:
-
top -p $(pgrep ocssd)中%CPU持续>80%且TIME+每秒暴涨,说明Linux CFS调度器已无法保证ocssd.bin准时唤醒 - 内存swap严重时,
ocssd.bin堆内存被换出,恢复需毫秒级等待,数次叠加就突破misscount - Voting Disk所在ASM磁盘组I/O队列深度>10、平均延迟>150ms,
clssnmCheckDskInfo写票失败,CSSD判定“磁盘心跳不可靠”,被迫更依赖本已不稳的网络心跳
HAIP子接口未就位是静默前兆,别只信ping
ora.cluster_interconnect.haip资源反复OFFLINE,不代表物理链路中断,而是UDP通信层根本没初始化成功。关键检查点不是ping,而是确认HAIP子接口是否真实绑定:
- 执行
ifconfig -a | grep 169.254,若无eth1:1或enp0s9:1类子接口,说明HAIP连绑定都没完成 - 查
$GRID_HOME/log/<hostname>/cssd/ocssd.log,出现has a disk HB, but no network HB即锁定UDP层失败 -
arping -I eth1 -c 3 169.254.10.10失败?立即检查sysctl net.ipv4.conf.eth1.rp_filter——必须为0或2,不能是1
防火墙规则漏掉UDP端口12345–12350,私网心跳直接被静默丢弃
Windows Server上部署RAC时,防火墙默认阻止所有入站UDP,而RAC私网心跳大量依赖UDP广播/多播。现象是节点能ping通、1521端口tnsping正常,但crsctl check cluster反复失败、lsnrctl status显示监听正常却无法跨节点注册:
- 打开「高级安全 Windows 防火墙」→「入站规则」→「新建规则」
- 选「自定义」→「所有程序」→「协议类型:UDP」→「本地端口:全部端口」→「远程IP地址:此IP地址范围」→填入你的私网段(如
192.168.10.0/24) - 操作选「允许连接」,配置文件勾选实际网络类型(域/专用)
misscount与disktimeout不是并行开关,而是串行判断链中的脆弱接力
misscount和disktimeout不是两个独立参数,而是一个串行判断链:misscount先标记节点“疑似死亡”,再用disktimeout决定谁活下来。但高负载下二者常同步失守:
-
crsctl get css misscount返回30秒,但业务高峰时ocssd.bin发包间隔可能已达28秒——只剩2秒容错,一次I/O抖动就触发驱逐 -
disktimeout默认200秒看似宽松,但它只在仲裁启动后才启用;而仲裁一旦启动,Voting Disk I/O延迟若已升至180ms+,多次写票失败后CSSD会放弃等待,直接按旧投票记 - 此时
crsctl delete node -n或强制重启都无效,必须先压降负载、修复底层I/O,再手工同步OCR状态
ocssd.bin失去对集群状态的实时感知能力——它不再知道谁还活着,只能按过期规则自裁。这种“认知失效”比物理故障更难定位,也更难恢复。


















