单网卡或单交换机是脑裂高发源头,因其导致私网心跳中断而disk heartbeat仍有效,引发仲裁失败;必须配置双网卡跨物理隔离交换机、多路径voting disk及≥3个分散投票盘并启用nohang模式。
为什么单网卡或单交换机是脑裂高发源头
oracle rac 的脑裂(split-brain)本质是节点间失去通信后,各自认为对方已死、继续独占共享存储写入。而绝大多数生产环境的脑裂,并非因为存储故障,而是私网(interconnect)链路中断——比如单网卡、单交换机、vlan配置错误或物理线路松动。此时 network heart beat 断连,但 disk heart beat 仍可访问 voting disk,两个节点都觉得自己“有投票权”,平局导致仲裁失败。
关键点在于:css_misscount 默认值通常为 30 秒(即连续 30 秒收不到心跳就驱逐),但网络抖动、ARP延迟、交换机 STP 收敛都可能在 10–25 秒内触发误判。不冗余,等于把集群命运押在一根网线或一个交换机上。
- 必须为每个节点配置至少 2 块独立网卡接入私网,绑定模式建议
mode=1 (active-backup)或mode=4 (802.3ad),禁用mode=0 (balance-rr)(RAC 不支持乱序包) - 两台交换机必须物理隔离:不同品牌、不同供电回路、不同上联链路;严禁堆叠或虚拟化成逻辑单设备
- 私网子网不能与公网、存储网重叠,推荐使用
192.168.100.0/24或10.10.10.0/24等专用段,且关闭该子网的 ICMP 重定向和代理 ARP - 验证命令:
oifcfg getif查看私网接口是否被正确识别;ping -I bond0 -c 5 <peer_node_private_ip>测试直连通性,丢包率必须为 0
多路径网络 ≠ 多网卡绑定,必须跨设备验证
很多团队配了双网卡、连了双交换机,却仍在网络闪断时出现脑裂——问题出在“未真正跨设备故障切换”。常见陷阱是:两块网卡实际连到同一台交换机(只是不同端口),或交换机虽为两台但共用同一电源/上联光模块。
实操中必须做三类验证:
- 拔掉节点 A 的 eth1(连交换机 A),确认流量自动切到 eth2(连交换机 B),且
cssd进程无CRS-1601或ORA-29702报错 - 同时拔掉交换机 A 的上联光纤,观察集群是否维持 2 节点在线(
crsctl check cluster -all),而非直接驱逐节点 A - 用
tcpdump -i bond0 port 12345(CSSD 默认端口)抓包,确认心跳包始终从活跃链路发出,且对端能稳定收到
注意:oifcfg setif 配置的私网接口名必须与操作系统实际绑定名一致(如 bond0),否则 CSSD 会静默降级为单路径模式,日志里几乎不报错,但 crsctl stat res -t | grep network 会显示 OFFLINE 状态。
voting disk 路径也必须多路径,且不能与 OCR 共盘
网络冗余只是防住了 network heart beat 中断,但若 voting disk 的 I/O 路径唯一(比如只有一条光纤、一个 HBA 卡、一个存储控制器),disk heart beat 同样会超时。更危险的是:当私网和 voting disk 路径同时单点故障(例如同一台光纤交换机宕机),两个心跳全断,节点无法区分是网络分区还是存储离线,极易触发强制驱逐或 hang。
正确做法:
- 所有 voting disk 必须放在 ASM 磁盘组中,且该磁盘组启用
ASM_DISKSTRING多路径发现(如'ORCL:*','/dev/mapper/mpath*') - 用
ls -l /dev/mapper/确认每个 voting disk 对应至少 2 条底层路径(如mpathb-part1→sdb1,sdc1) -
voting disk和OCR必须分属不同物理 LUN,严禁放在同一 RAID 组或同一块 SSD 上——否则一块盘故障,集群元数据 + 仲裁同时丢失,整个 RAC 无法启动 - 检查命令:
crsctl query css votedisk输出的路径应全部可被asmcmd lsdsk列出,且状态为ONLINE
特别提醒:disk_repair_time 参数对 voting disk 必须设为 0(ALTER DISKGROUP <dg> SET ATTRIBUTE 'disk_repair_time'='0m';),否则 ASM 临时剔除盘会导致 CSSD 误判 quorum 丢失。
2 节点集群必须配 ≥3 个 voting disk,且启用 nohang 模式
2 节点是最脆弱的 RAC 架构。一旦私网中断,两边各持 1 票,voting disk 若只有 2 个副本,永远无法形成多数(quorum)。此时哪怕存储路径完全正常,集群也会因“无法达成多数派”而主动分裂——不是没防住脑裂,而是设计上就允许脑裂发生。
解决方案明确且强制:
- 部署至少 3 个 voting disk,物理分散:节点 A 本地盘 + 节点 B 本地盘 + 第三方共享盘(如 NAS 或第三台服务器上的 iSCSI target)
- 执行
crsctl replace votedisk +DG_NAME添加新盘后,用crsctl query css votedisk确认总数为 3,且状态全为ONLINE - 在
grid_home/crs/install/s_crsconfig_<hostname>env.sh中追加:export CSS_NOHANG=1,防止 CSSD 在仲裁僵持时无限等待 - 绝对不要依赖“偶数投票+force flag”:
crsctl start crs -f强制启库可能绕过仲裁,但后续写入会破坏数据一致性,DBA 日志里不会报错,业务数据却已在 silent corruption 中
最易被忽略的一点:第三方 voting disk 的延迟必须 ≤500ms。超过此阈值,CSSD 读写超时,等效于该盘离线——3 票变 2 票,又回到平局。所以异地 RAC 的 third-site voting disk 必须走专线,绝不能走公网。


















