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

使用Helm部署在k8s,测试高可用,服务列表信息需要很长时间才能同步 #201

Open
HollandJc opened this issue Mar 4, 2025 · 5 comments

Comments

@HollandJc
Copy link

HollandJc commented Mar 4, 2025

r-nacos版本为v0.6.12,nacos-client的版本是2.4.2

我的系统运行在k8s环境,k8s有3个工作节点,准备使用r-nacos替换nacos,r-nacos 3个实例,一主两从,分别运行在三个K8s工作节点。

微服务使用headless的svc连接r-nacos, 配了3个实例,如:
spring.cloud.nacos.discovery.server-addr=r-nacos-0.rnacos-svc.cloud.svc.cluster.local:8848,r-nacos-1.rnacos-svc.cloud.svc.cluster.local:8848,r-nacos-2.rnacos-svc.cloud.svc.cluster.local:8848

系统可以正常运行。

但在测试高可用时,重启了主r-nacos所在的k8s节点,r-nacos切主很快,但各个r-nacos的服务列表会出现不同步,需要等待一段比较长的时间(没有观察准确的时间,起码5分钟以上),才能同步。

会导致在服务列表不同步的这段时间,微服务之间使用feign调用会报错,报找不到某些微服务的实例。

请问这种情况怎么处理?

@heqingpan
Copy link
Collaborator

问题已收到。

r-nacos 内部有两个集群协议:raft与类distor协议。
切主很快,对应的是raft协议切换很快。

服务列表需要等待较长时间,这个应该和distor协议实现机制有关。

之前也是知道主节变化切换期间,distor节点间有一小段时间内容存在不一致,不过没想到那么久。

理论上这个时间不应该这么久,5分钟这个时间应该是有提升空间的。
具体的我这边需要复现分析后才能确定。

你们测试时服务数量与服务实例数量是多少?
你是通过什么现象判断它出问题与恢复的?

@HollandJc
Copy link
Author

服务和实例的情况如下:

主实例的服务列表,信息是对的:
Image

从实例1,服务数量是对的,但是有几个服务的实例数少了,已经持续了几个小时了:
Image

从实例2,这是之前的主,把节点恢复之后(已经超过15分钟了),服务列表的数据还是没有同步:
Image

我是根据我们的一个spring cloud gateway服务里面的报错来判断是否出问题,过一段时间之后,虽然服务列表的数据不同步,但是gateway服务没有报找不到instance的错,系统访问也正常,怀疑是从rnacos上获取服务列表时,出问题。原来使用nacos时,同样的测试,30S内系统就能恢复正常:
Image

@heqingpan
Copy link
Collaborator

上面这些服务nacos-client 版本都是2.4.2吧?

这个场景的问题已经大体了解,我后面抽空看看能不能复现,如果可以复现的话会尽快处理。
快的话本周末,慢的话下周末可以发一个尝试解决此问题的版本出来。

@HollandJc
Copy link
Author

是的,nacos-client都是2.4.2。

@heqingpan
Copy link
Collaborator

在本地直接运行集群不能复现,搭建个k8s环境运行后能成功复现,目前初步调整一版本后已经在本地修复这个问题。
对其它功能回归验证通过后会发布一个新版本出来。

这个问题的原因分析:

  1. 集群节点N1重启,这个节点的grpc服务实例会掉线;
  2. 集群节点重启N1后马上到其它节点同步信息,这时只能取到这个时间点的服务实例信息;
  3. 客户端发现连不上原来的节点N1后,重新链接其它服务节点N2;节点N2会把新服务实例信息同步给其它节点(N1,N3);如果这时N1没有完成重启,它就收不到这个信息。

这个问题只会出现在使用grpc协议链接注册,因为http实例会每间隔注册一次,后续注册后信息会再次同步。

之前对集群的测试主要是通过本地集群运行,没有发现这个问题;后面对集群的调整尽量加上k8s环境测试。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants