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.22k stars 12.83k forks source link

nacos1.4.6客户端连接2.2.3服务端,集群模式三个节点,断掉一个节点,服务会时上线时下线 #11455

Closed xiaota6 closed 9 months ago

xiaota6 commented 11 months ago

nacos1.4.6客户端连接2.2.3服务端,集群模式三个节点,断掉一个节点,服务会时上线时下线

KomachiSion commented 10 months ago

断掉一个节点是怎么断的,看下nacos-cluster.log是不是不停的在更新健康节点。

xiaota6 commented 10 months ago

使用的kill -S SIGSTOP pid断掉一个节点,nacos-cluster.log只有失去连接断掉的节点,后面没有日志输出。使用2.2.4客户端就没有问题。

KomachiSion commented 10 months ago

1.4.6客户端会轮询发心跳,发到中断节点不会同步出去。因此其他节点可能会心跳超时。

2.2.4客户端是长连接, 断了就飘走了。

xiaota6 commented 10 months ago

有方法解决不,因为我们可能会存在连接1.x服务端和2.x服务端两种情况

KomachiSion commented 10 months ago

执行运维操作时规范一下就好

  1. 先摘除要下线节点的流量,比如从SLB中移除这个节点ip
  2. 然后修改整个集群的cluster.conf文件,集群中不再有这个ip
  3. 再中断停止这个ip,重启或者升级
  4. 按照顺序反转2,1步骤。
KomachiSion commented 10 months ago

正常停止节点: bin/shutdown.sh 也是可以的, nacos的其他节点会快速识别这个节点不健康,2~3s内就基于剩余节点组成新集群。

但是如果使用自己的停止命令停止时,需要考虑是否有停止缓慢等情况导致抖动。

xuyouming commented 10 months ago

正常停止节点: bin/shutdown.sh 也是可以的, nacos的其他节点会快速识别这个节点不健康,2~3s内就基于剩余节点组成新集群。

但是如果使用自己的停止命令停止时,需要考虑是否有停止缓慢等情况导致抖动。

并非运维问题,测试人员测试模拟不同的信号量给进程,即使发送的信号量不适用,但集群通过raft协议投票计算出了宕机节点,且在节点列表显示正确,只是服务列表出现上上下下的奇怪现象。发送SIGTERM信号量就没有此现象。

KomachiSion commented 10 months ago

那就需要你们在复现环境中多研究了, 我这复现不了这个问题,只要发送kill指令,节点会无法访问, 其他节点会快速识别到,并且将故障节点摘除,slb的探测也很快会发现,然后摘流。

Linzyoo commented 10 months ago

执行运维操作时规范一下就好

1. 先摘除要下线节点的流量,比如从SLB中移除这个节点ip

2. 然后修改整个集群的cluster.conf文件,集群中不再有这个ip

3. 再中断停止这个ip,重启或者升级

4. 按照顺序反转2,1步骤。

如果集群是容器化部署,关于第二步,是否直接在各容器节点上依次修改 cluster.conf 即可?

Linzyoo commented 10 months ago

手动移除cluster.conf 中某个节点,是否有可能会与管理台下线某个节点一样的引发问题 #9155 其中完成第一步应该保证了不会在有grpc长连接,应该不会造成上述问题了吧。

KomachiSion commented 10 months ago

这是两回事,cluster.conf是修改集群中有哪些节点, 客户端和服务端的连接和这个没关系。

diaodiaofly commented 10 months ago

执行运维操作时规范一下就好

  1. 先摘除要下线节点的流量,比如从SLB中移除这个节点ip
  2. 然后修改整个集群的cluster.conf文件,集群中不再有这个ip
  3. 再中断停止这个ip,重启或者升级
  4. 按照顺序反转2,1步骤。

按照这个操作顺序,我遇到了一个问题,故障节点重新启动后,再将这个ip:port加入其他2个健康节点的cluster.conf,但是健康节点会立马将这个节点剔除,这是为什么呢?烦请指导!

KomachiSion commented 10 months ago

怎么看到被剔除了, 都以cluster.conf文件为准的, 至多刚加入时识别成Down状态,不会把节点去除掉。

diaodiaofly commented 10 months ago

怎么看到被剔除了, 都以cluster.conf文件为准的, 至多刚加入时识别成Down状态,不会把节点去除掉。

宕机节点启动后,将ip:port加入到另外2个节点的cluster.conf;vi加完后,大概15s左右,这2个节点就会自动将宕机刚启动的节点从cluster.conf中移除,这个地方我很不理解到底是哪里出了问题?请帮忙分析下原因

KomachiSion commented 10 months ago

从没遇到过。。 这可能和你的环境有关了吧。 我改完之后看nacos-cluster.log 会立刻添加新节点,而且不会删。

ggsyu commented 9 months ago

昨日我也遇到了这个问题,我是用的是k8s部署的nacos集群3副本pod,其中有一个pod调度到了其他节点,恢复之后重新加入集群就会被剔除,造成所有注册在nacos的服务都会频繁的上线下线,整个业务都收到了影响,按道理说高可用集群不应该出现这种情况,现在还不知道如何来解决,有人知道吗请告诉我指点我

KomachiSion commented 9 months ago

那可能是你们的某个k8s设置,或者operator一直在篡改cluster.conf文件,导致你手动修改的cluster.conf文件过一段时间被某个脚本或程序自动移除了。

我自己的k8s环境部署是没有这个问题的。 纯docker部署的也没有遇到过。

本地直接启动的也是没问题的。