Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wuqtao opened this issue May 10, 2024 · 4 comments
Open

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

wuqtao opened this issue May 10, 2024 · 4 comments
Labels
dependencies Pull requests that update a dependency file kind/research

Comments

@wuqtao
Copy link

wuqtao commented May 10, 2024

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

@wuqtao wuqtao changed the title 部分节点加入 raft group失败,一直start prevote 部分节点加入 raft group失败,一直preVote May 10, 2024
@RokadParth
Copy link

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

@KomachiSion
Copy link
Collaborator

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

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

@KomachiSion KomachiSion added kind/research dependencies Pull requests that update a dependency file labels May 15, 2024
@CZJCC
Copy link
Contributor

CZJCC commented May 15, 2024

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

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

@wuqtao
Copy link
Author

wuqtao commented May 15, 2024

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file kind/research
Projects
None yet
Development

No branches or pull requests

4 participants