Oracle RAC心跳机制不依赖ping或TCP连通性,而是由cssd通过私网UDP心跳包判定节点存活,需连续丢失7次(默认misscount=30秒)才驱逐节点,且必须结合Voting Disk仲裁,避免脑裂。
Oracle RAC 的心跳机制不是靠“网络连通性”判断故障
oracle rac 不依赖 ping 或 tcp 连通性来判定节点存活,而是靠 cssd(cluster synchronization services daemon)通过专用心跳网络(通常是私网,如 eth1 或配置的 private interconnect)收发 udp 心跳包。网络抖动若未导致连续丢失多个心跳周期(默认 5 秒 × 7 次 = 35 秒),cssd 就不会宣告节点死亡。
常见误解是“ping 不通就该切”,但实际 cssd 有自己的超时策略,且心跳包不走 OS 网络栈常规路径(例如绕过 netfilter),抖动影响可能被底层驱动或 NIC offload 缓冲掩盖。
- 默认心跳间隔为
misscount=30秒(对应 7 次丢失),可通过crsctl get css misscount查看 - 修改需谨慎:
crsctl set css misscount 15会缩短检测窗口,但易引发误驱逐(eviction),尤其在高延迟私网中 - 私网若混用业务流量或启用了 LRO/GRO,抖动时 UDP 包乱序/合并可能导致心跳被丢弃而不报错
节点驱逐(eviction)触发前还有 CSS 和 CRS 两级仲裁
即使 cssd 判定某节点“疑似失联”,也不直接切换服务——它先尝试与 Voting Disk 协调,确认该节点是否真的不可达,还是仅自己“看丢”了对方。这个过程叫 reboot eviction 或 panic eviction,取决于是否能访问多数 Voting Disk。
典型卡点:当私网抖动 + Voting Disk 路径也短暂异常(比如 ASM diskgroup IO 延迟突增),CSS 可能进入 wait for disk heartbeat 状态,此时节点仍在线但不响应 VIP 切换请求。
- Voting Disk 至少需要
(n/2 + 1)个副本可写才能做出驱逐决定(n 为 voting disk 数量) -
crsctl query css votedisk可查当前投票盘状态;ocrcheck和crsctl check cluster -all应配合排查 - 若使用 NFS 作为 voting disk,NFS client 的
hard mount+timeo参数会显著拖慢仲裁响应
SCAN VIP 和 service failover 不等于实例切换
用户感知的“没切换”,往往其实是客户端连接没重定向,而非 RAC 内部没动作。RAC 实例本身不自动迁移(不像 Data Guard 的角色转换),VIP 漂移和 service 重定位由 ora.scan*.vip 和 ora.*.svc 资源管理,依赖 ohasd 和 crsd 的资源状态机推进。
抖动期间,crsd 可能因资源依赖未就绪(如依赖的 ASM 实例尚未 ONLINE)而暂缓启动 service,表现为 VIP 已漂到新节点,但 TNS 连接仍超时。
- 检查
srvctl status scan和srvctl status service -d <db></db>确认 service 当前运行节点 - 客户端若用 EZConnect(如
jdbc:oracle:thin:@scan:1521/orcl)且未配retry_count和retry_delay,首次连接失败后不会自动重试新地址 - 监听器日志(
$GRID_HOME/log/<node>/client/listener.log</node>)里搜TNS-12545或no listener可定位 VIP 是否真正生效
真正影响“感知切换速度”的其实是客户端重连逻辑
RAC 层面完成 VIP 漂移和 service 启动通常只需 10–20 秒(取决于 misscount 和资源依赖),但应用能否立刻连上,取决于连接池是否主动探测、JDBC 是否启用 Fast Connection Failover (FCF)、以及 TNS 配置里有没有 ENABLE=BROKEN 或 RETRY_DELAY。
很多“没切换”的 case,本质是连接池拿着旧的连接句柄死等,或应用代码 catch 了 SQLException 却没做重试,而不是 RAC 没动。
- JDBC thin driver 需显式开启 FCF:
DataSource.setFastConnectionFailoverEnabled(true),且数据库端要启用DBMS_SERVICE.START_TRACE - TNS alias 中加入
(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=3)(DELAY=1))才对 SELECT 类语句生效 - Oracle Client 19c+ 默认禁用
BROKEN检测,老版本若没配SQLNET.EXPIRE_TIME,僵死连接可能挂住几分钟











