oracle rac中“has a disk hb, but no network hb”本质是存储io卡顿导致cssd主动停发网络心跳,根因在voting disk响应超时(await>50ms或%util>95%),而非网络本身故障。
oracle rac集群心跳本身不依赖存储链路——但asm磁盘心跳(disk heartbeat)和css投票磁盘(voting disk)io会卡住内核,间接导致网络心跳被判定失效,最终触发节点驱逐。这不是“心跳协议走存储”,而是底层io阻塞引发的连锁反应。
为什么存储中断会让CSSD报“no network HB”
CSSD进程同时依赖两类心跳:网络UDP心跳(clssnmvDHBValidateNCopy日志关键字)和磁盘心跳(通过IOCTL向ASM磁盘发探测包)。当FC链路重路由、阵列双控切换或HBA驱动异常发生时,对voting disk的IOCTL调用会在内核态挂起,超时由隐藏参数_asm_hbeatiowait控制。一旦超时,ASM将该磁盘标记为MISSING,CSSD检测到voting disk不可写后,立即停止发送网络心跳包(避免脑裂),日志里就出现node1 has a disk HB, but no network HB——表面是网络问题,根因是存储IO卡死。
OCR/voting disk所在磁盘组IO延迟过高直接绕过参数调整
就算你把_asm_hbeatiowait调到120秒,以下任一条件不满足,照样触发驱逐:
-
iostat -x 1显示voting disk所在LUN的await > 50ms或%util > 95%,说明磁盘已无法及时响应心跳IO - UDEV规则中ASM磁盘权限不对(如
MODE="0660"缺失),导致CSSD读取/dev/asm-vote01失败 - voting disk位于非冗余磁盘组(如外部冗余),单块磁盘故障即丢失多数票
HAIP通信失败会掩盖真实存储问题
很多DBA看到LMON failed to connect to CSS就去查网络,却忽略HAIP子接口是否生成。执行ifconfig -a | grep 169.254,若无eth1:1类条目,说明HAIP根本没起来;再查$GRID_HOME/log/<hostname>/cssd/ocssd.log</hostname>,若反复出现no network HB且伴随clssnmvDHBValidateNCopy: node <n> has a disk HB</n>,基本可断定是voting disk IO卡顿拖垮了整个心跳链路。此时改MTU、开防火墙都无效,必须先稳住存储链路。
真正难处理的不是参数怎么调,而是当await飙升和_asm_hbeatiowait超时同时发生时,你得在30秒内判断出是SAN交换机缓存满、阵列控制器降级,还是HBA固件bug——这些信息不会直接写在ocssd.log里,得交叉比对messages、dmesg和存储侧日志。











