-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Nacos 1.4.1 集群部署 扩缩容 导致协议失效 稳定复现 #4877
Comments
|
1.您说的这个报错是必然的,是指扩容场景下的那个错误 No leader at term xx ,还是缩容场景下的nacos-server节点状态在down 和 up之间来回跳转的错误?您能复现或者解释一下为什么进程被kill -9 之后,无论是控制台还是OpenAPI查到的节点状态都是在变化中么? 2.我的疑问在于,假如扩缩容同时进行,还没有来得及去更新ip列表,这个时候完全有可能会出现我在扩容场景描述的这个问题,整个集群跟CP协议相关的都是不可用的状态(我部署的都是1.4.1的版本),重启都不解决问题,(我还没有验证再更新ip列表能不能解决问题,我这就去试一下) |
从你的流程来看,是符合预期的。 raft协议是比较强的一致性协议。无论何时都应该保证集群可用节点大于等于一半,以保证正常选主。 你的场景中,先添加了一台机器,但原集群并没有更新和感知,然后摘除2台机器,相当于旧集群只剩下一台机器,raft是无法选主和提供服务的。即使后来你加入了一台,但是由于raft已经无主,新的地址也无法写入raft元数据。因此导致扩容失败。这是raft协议决定的。 正确的做法扩容一台(可以先不添加address),然后缩容一台,然后添加地址服务器。 |
我还需要请教您三个问题: |
|
关于问题2我再复现一下,问题3我再单独提一个issue,感谢您的解答,祝您新年快乐,祝nacos社区蒸蒸日上 :) |
@KomachiSion 您好,很容易复现这个问题
|
这个问题可能是 jraft直接从底层更新了他自己的raftMember元数据,是jraft自己的机制,nacos可能不是太好干预。 但是应该不太影响使用,如果是扩一台,然后再下线一台的话。只要能选出leader,就不会有问题。 |
注意到 nacos 只在JRaftServer.java 文件和 JRaftOps.java文件里面调用了 jraft 的 Configuration的addPeer()方法,removePeer()方法没有被nacos调用过。 |
serverMemberManager发现节点有变化后,会发出时间,JraftServer会监听时间,调用peerChange。 JraftServer.peerChange 只在节点数量和ip发生变更时才会触发,如果是up down的状态变更不会触发。 但是最终jraft group config,还是由jraft的leader统一维护下发。 比如原来A,B,C3个节点, 启动D节点时,D节点的member是ABCD,那么D会尝试调用Jraft命令写入4个节点,Jraft leader收到写入请求之后下发到各个节点, 半数以上写入成功后,就会写入到raft metadata里,不会在期间调用上层serverMemberManager来校验。 |
就是这种情况,假如在address-server或者cluster.conf没有更新的情况下,serverMemberManager只会认为合法的集群节点是ABC,但是raft集群认为ABCD都是集群的节点。 |
|
好的,非常感谢您的耐心解答 |
您好,请问nacos2.0支持自动扩缩容吗?即,节点下线后,还需要做对应的配置吗? |
背景
部署了三台机器,分别是 172.21.1.116(记为116),172.21.1.134(记为134),172.21.1.150(记为150)
启动均采用 nacos.core.member.lookup.type=address-server 模式获取集群列表
缩容场景
执行步骤:
kill - 9 134机器上的nacos进程
查看150机器上的控制台
3.刷新再查看150机器上的控制台
5.查看nacos.log文件的错误日志
注意,无论是从控制台看,还是用OpenAPI直接访问获取数据,在116、150这两台机器上看134这台机器上的状态,都是不断的在down 和 up 之间来回跳转。
问题1:对于distro协议计算权威节点或者其他涉及到要获取nacos server状态的逻辑来说,这样的情况会不会造成问题?比如说我看到就有其他issue在反馈说请求被转发到已经杀掉进程的机器上。
扩容场景
问题2:扩容是不是要严格遵循,先更改address-server里面的集群列表,再启动进程的过程?如果不是,那扩缩容同时进行就有可能出现我说的这个问题;如果是,那为什么在机器A启动的时候,发现没有自己的ip地址,没有报错终止启动?
感谢解答。
The text was updated successfully, but these errors were encountered: