Oracle-RAC集群数据库实例相互驱逐问题

问题背景:

        用户一套Oracle RAC两节点集群,出现数据库实例相互驱逐问题,集群只能运行一个节点的数据库实例,第二个节点数据库实例加入会导致另一个节点的实例被驱逐。

问题分析:

        通过节点二的数据库alert日志,可以看到实例二在启动之后,2024-05-10T09:16:33开始进行实例节点重配置。

        但重配置一直没有显示完成,接近3分钟,然后在2024-05-10T09:19:27,实例二发起了对实例一的驱逐。

        查看节点一实例的alert日志,也可以看到,在2024-05-10T09:16:34开始进行重配置,但重配置在3分钟内没有完成,后面就出现实例二驱逐实例一的操作。

        从alert日志的信息来看,实例二启动加入集群后, 执行重配置期间触发了实例的驱逐操作,问题的原因很有可能是重配置出现了超时,进一步分析与重配置操作有关的lmon、lmd、lms进程日志。

        查看lmon进程的trc日志。在实例重配置期间,lmd进程由于超过173秒没有接收到实例一的信息(kjfcdarmrfg: waited 173 secs for lmd to receive all ftdones, requesting memberkill of instances w/o ftdones),节点二认为实例一存在异常,发起了对实例一的memberkill节点驱逐。

        查看节点二lmd0进程的trc文件,可以看到接收信息的超时错误(Timeout waiting for receiver sync for indirect messaging, waited=164 seconds),日志进一步指向lms0进程消息进程接收队列存在问题(WARNING detected problem between inst 1 and rcvr 1 on MSG QUEUE 0 of LMS0)。

        检查节点二的lms0进程的trc文件,可以看到有IPC消息传输等待,节点二(169.254.x.xx:24596)正在等待从节点一(169.254.xx.xx:11834)的seq:1867796260消息。

        检查节点一的lms0进程的trc文件,可以看到lms0进程的发送队列处于挂起的状态Pending send queue,有大量的队列发送等待,包括seq: 1867796260的信息。

        再检查节点一的lmd进程trc文件里面的lms进程ticket使用信息。可以看到lms0进程的消息队列ticket有效剩余为0,集群之间的消息传递,是通过ticket来保持消息传输平衡的,在发送消息会带一个ticket到接收的目标端,此时,本地的ticket会减一,而目标端的ticket会加一,如果ticket的有效剩余为零,那么LMD/LMS进程的消息队列会进入等待,直到目标端发送信息带来ticket,本地的消息队列才能重新使用ticket继续发送。

        所以,节点一lms0进程消息队列进入等待的原因为进程的ticket剩余为零,导致没有ticket可以用于发送。

        ticket剩余使用为零,主要的可能原因为

        1 Oracle bug导致。

        2 集群的ticket配置过小默认配置为1000,如果SGA配置内存过大可能导致ticket无法满足需要。

        3 lmd、lms进程由于CPU、网络等资源问题无法及时处理消息队列,导致ticket没有及时被循环复用。

        通过OSW检查集群之间的网络通信情况,发现节点二在问题时间段9点16分-20分区间,IpReasmFails网络接收重组包失败的次数增涨迅猛,次数从0涨到1424787。这说明节点一到节点二之间的网络包传输可能存在丢包重传的情况,这可能导致lms进程队列网络包消息的处理不及时,进而导致ticket数量的不足。

原因总结:

        1 通过对集群日志的分析确认节点二实例加入集群会导致节点一的实例被驱逐的原因为,节点二实例加入集群时会进行集群实例重配置操作,重配置操作期间节点二lms0进程没有在正常的时间内接收到节点一的信息,导致节点二认为节点一实例存在异常,发起了对节点一的驱逐。

        2节点二lms0进程没有在正常的时间内接收到节点一的信息原因:

        ①节点一的LMS0进程的有效剩余ticket为0,导致lms0没有ticket,消息队列进入等待无法在正常时间内发送信息给节点二。

        ②节点一到节点二的网络包传输存在重组包失败的问题,这可能导致集群节点之间的网络包消息发送出现传输缓慢、失败超时、频繁重发的问题,而lmd、lms进程队列网络包消息的处理不及时,也会导致ticket数量的不足。

问题修复建议:

        1 调大操作系统网络包分片缓存的大小,避免网络包分片重组失败。

        net.ipv4.ipfrag_high_thresh = 16777216

        net.ipv4.ipfrag_low_thresh = 15728640

        2 增大数据库ticket的数量

        根据Oracle官方文档Best Practices and Recommendations for RAC databases with SGA size over 100GB (Doc ID 1619155.1)和Resolving ORA-481 and "terminating the instance due to error 481" (Doc ID 1950963.1),针对ticket数量不足的问题,可以通过_lm_tickets参数调大ticket的数量,对于12.2及以下版本的SGA配置超过100G的数据库,Oracle建议将默认值1000调整为5000,参数需要重启数据库,支持轮询重起节点方式。

问题修复:

        后续我们针对问题集群数据库,实施了建议1调大操作系统网络包分片缓存的大小,问题就没有再发生,多次重启测试,节点都可以正常加入集群。

Tip:欢迎关注公众号:勇敢牛牛的笔记,超100+的原创内容,每周不定期更新数据库技术文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值