一个 rac 只能启动一个节点 crs 的问题,目前怀疑是多播问题造成。
前几日在历史库测试 PSU 升级,在完成一个节点软件升级后对第二节点 GI 进行升级时, CRS 可以正常成功关闭,之后报出了 Error : The opatch Applicable check Failed ,于是尝试重新启动 CRS ,但很明显 CRS 无法正常启动。
通过日志查看,发现 CRS-5818:Aborted command 'start' for resource 'ora.cssd'. 在启动 CSSD 资源无法成功,并且从当前的进程情况可以确认 CSS 存在问题。
于是从当时的 CSSD 日志可以看出, CSSD 在启动时,在准备与远程节点的过程中创建本地通信接口时失败了,具体的日志分析如下:
-
从 gpnp profile 中获取集群的私网信息。
2. 以下开始准备和远程节点通信,并 created local interface for node 'nghis-db2', 但在进行绑定 endpoint (localAddr 'mcast://224.0.0.251:42424/192.169.1.40') 失败了,该本地地址为一个 mcast 地址。
当时看到 No buffer space available (74) ,认为是怀疑是 udp_sendspace 和 udp_recvspace 不够大,查询发现分别为 65536 和 655360 ,这实际应用是足够了。不出意料,将该两个参数调大之后重启 CRS 依然无法解决,而在 MOS 上关于该错误的大部分都指向了 BUG,11gR2 Grid Infrastructure Node May not Join the Cluster After evicted With Error sgipcnUdpSend "No buffer space available (74)" ( 文档 ID 1352887.1) 。
但当前的现象与该文档描述不符合,
当前的操作是 sgipcnMctBind
文档中的是 sgipcnUdpSend
3. 更新接口状态,依然无法创建本地接口,即无法与远程节点通信,于是执行了 disable interface 并 clean disabled insterface
4. 重新开始 add interface ,但仍然失败。
5. 之后连续每隔 1 分钟报出了 has a disk HB, but no network HB ,说明此时私网上应该出现了联通性的故障。
于是我们测试了私网地址的联通是否有问题,使用 traceroute 检查,然而并没有联通性问题。
于是就很不理解了,在心跳网卡既然没有问题,为何无法检测到网络心跳。此时问题应该还是出现在以上出现 No buffer space available (74) 的 gipcmodNetworkProcessBind 的过程,对比了节点 1 正常启动 gipchaWorkerCreateInterface 的过程,一共添加了 4 个地址:
1. udp://192.169.1.39:13034 ------ 私网地址
2. mcast://224.0.0.251:42424/192.169.1.39 ----- 多播地址
3. mcast://230.0.1.0:42424/192.169.1.39 ----- 多播地址
4. udp://192.169.1.127:42424 ------- 广播地址
很明显节点 2 在以上的过程中应该是在添加第二个地址,多播地址 mcast://224.0.0.251:42424/192.169.1.40 时出现了问题。
通过多播检测工具检测私网网卡的多播地址联通性,发现都是检测失败,而测试节点 1 的是成功的,于是怀疑问题应该是出现在节点 2 的多播地址上。
有怀疑是 HAIP 问题,于是尝试将 HAIP disable 掉,并将私网网卡上的 169 ip 依然无法解决。
禁止 haip 命令:
oracle/app/11.2.0.4/grid/bin/crsctl modify res ora.cluster_interconnect.haip -attr "ENABLED=0" -init
最后同事提议使出杀手锏 --- 重启主机,由于这套库是历史库,没有实时的业务,确定无影响后就进行了重启主机,重启主机后 CRS 能正常启动, CSS 也正常通过过了 gipchaWorkerCreateInterfac 步骤。
再次检测私网网卡的多播地址联通性,这次是成功了。
至此,问题解决了,但因为是通过重启主机解决,始终感觉这并不是最终的原因。多播检测不通,是否意味着网络确实是存在问题?这点也不敢断论。