Oracle RAC私网心跳基于UDP专用协议,对延迟、丢包、MTU、防火墙及rp_filter极度敏感;ping通不等于心跳可用,CRS-1611/1610/1607连续报错表明CSSD已判定网络质量不达标,多节点同现三连错即指向底层网络抖动或配置不一致。

私网 ping 通 ≠ 私网心跳可用。Oracle RAC 的私网心跳是基于 UDP 多播/单播的专用协议(由 ocssd.bin 驱动),它对延迟、丢包、MTU、防火墙规则、反向路径过滤(rp_filter)极度敏感,而标准 ping 完全绕过这些机制,属于“假性正常”。
ocssd.log 里 CRS-1611/1610/1607 连续出现就是铁证
这不是偶发超时,而是 CSSD 层已明确判定网络质量不达标:
-
CRS-1611:6.512 秒窗口内 75% 心跳包未收到——黄灯预警,说明丢包或延迟已超标 -
CRS-1610:90% 丢失——红灯,驱逐倒计时启动 -
CRS-1607:节点被正式驱逐,日志写明node X evicted - 若多个节点在同分钟内密集打出这三连报错,基本可排除单点故障,直接指向底层网络抖动或配置不一致
firewalld/iptables 默默拦截 UDP 端口或 HAIP 地址段
关掉 firewalld 不等于放行私网通信。RAC 私网心跳默认使用 UDP 12345–12350 端口,并且目标 IP 是 169.254.0.0/16(HAIP 地址段),这两类流量常被默认规则静默 DROP:
- 执行
iptables -L -n | grep -E "(1234[5-9]|1235[0-9]|169\.254)"查 INPUT 链是否含 DROP/REJECT - 即使
firewalld关闭,iptables可能仍启用(尤其在 CentOS/RHEL 7+ 上) - SELinux 若为
enforcing模式,也可能拦截 UDP 套接字绑定,用sestatus确认,临时设为permissive测试
MTU 不一致或巨帧未端到端生效
一个节点 MTU=1500,另一个 MTU=9000,HAIP 握手包会被静默丢弃——ping 走小包无感知,但心跳包是固定大小的 UDP 载荷:
- 确认所有节点私网网卡 MTU 一致:
ip link show eth1 | grep mtu - 交换机私网端口必须开启巨帧且 MTU ≥9000(注意:不是管理口,也不是直连跳线)
- 验证不能只看
ip link show,要用ping -M do -s 8972测试无分片直达(8972 = 9000 − 28 字节 IP+ICMP 头) - 持续增长的
netstat -s | grep "reassembles failed"是 MTU 不匹配的决定性证据
rp_filter 导致 HAIP 包被内核丢弃
Linux 默认开启反向路径过滤(rp_filter=1),当 HAIP 流量从 eth1 进、但回包路由走另一张网卡时,内核会直接丢弃入向包,ocssd 收不到响应,表现为“单向心跳失败”:
- 检查:
sysctl net.ipv4.conf.eth1.rp_filter—— 必须为0(禁用)或2(宽松模式),不能是1 - 临时修复:
sysctl -w net.ipv4.conf.eth1.rp_filter=0 - 永久修复:在
/etc/sysctl.conf中加net.ipv4.conf.eth1.rp_filter = 0并执行sysctl -p - 这个参数极易被忽略,且不会在任何日志中报错,只会让
ocssd一直等不到包
真正的问题往往藏在 ethtool -S eth1 | grep -E "(rx_discards|rx_errors|tx_fifo_errors)" 和 ocssd.log 时间戳对齐的丢包记录里,而不是 crsctl check cluster -all 显示的 “online”。网络层没稳,上层再怎么 restart resource 都只是徒劳。


















