alibaba / nacos

an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
https://nacos.io
Apache License 2.0
30.01k stars 12.8k forks source link

部分节点加入 raft group失败,一直preVote #12079

Open wuqtao opened 4 months ago

wuqtao commented 4 months ago

nacos版本:2.2.1、2.3.0、2.3.2 image 上述raft信息统计是直接调用每个pod的ip,通过/nacos/v2/core/cluster/node/self接口获取的节点信息,通过整合统计出来的raft任期信息;如图所示,pod故障重启后,高概率出现上述情况,部分pod无法加入某些raft组; 故障节点alipay-jraft.log相关日志如下: image 另一个节点日志如下: image 当前主节点日志如下: image

RokadParth commented 4 months ago

上述raft信息统计是直接调用每个pod的ip,通过/nacos/v2/core/cluster/node/self接口获取的节点信息,通过整合统计出来的raft任期信息;如图所示,pod故障重启后,高概率出现上述情况,部分pod无法加入某些raft组; 故障节点alipay-jraft.log相关日志如下:

KomachiSion commented 4 months ago

之前排查过, 应该是jraft的bug, jraft的处理请求的线程池和处理leader心跳的线程池是同一个, 当线程池满了之后,leader的心跳任务可能会加入线程池失败,而失败后没有重试机制,导致心跳任务停止了; 此时丢失心跳的follower开始重新选主,但是旧leader认为还在任期,所以一直拒绝,就无限循环了。

这个问题大概率出现在某个follower和leader之间的网络出现问题,或者follower挂掉重启之后出现。 需要jraft尝试解决一下,比如心跳任务不能因为线程池加入失败而停止,或者拆分两个线程池来处理等等。

CZJCC commented 4 months ago

这个问题在jraft社区反馈过,现象就是异常发生时某个节点一直无法加入不断的在发送prevote请求,具体的现象和分析写在这个issue了 https://github.com/sofastack/sofa-jraft/issues/1042

最后和jraft 作者探讨确定的原因就是,leader因为线程池的reject异常直接跳出了心跳append entry的逻辑且后续无重试,导致某个follow node无法加入,目前jraft社区还没有比较好的解法,大家可以提pr来解决这个问题

wuqtao commented 4 months ago

这个问题在jraft社区反馈过,现象就是异常发生时某个节点一直无法加入不断的在发送prevote请求,具体的现象和分析写在这个issue了 sofastack/sofa-jraft#1042

最后和作者探讨确定的原因就是,leader因为线程池的reject异常直接跳出了心跳append entry的逻辑且后续无重试,导致某个follow node无法加入,目前jraft社区还没有比较好的解法,大家可以提pr来解决这个问题

感谢回复,我们目前的处理方式只能是通过operator检测raft信息,通过主动删除pod的方式触发重新选主来修复,但是效果不太理想,期待社区大佬早日修复~