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

nacos2.1.0 到 nacos2.1.0 无法同步 #307

Open
XQfelix opened this issue Aug 23, 2022 · 15 comments
Open

nacos2.1.0 到 nacos2.1.0 无法同步 #307

XQfelix opened this issue Aug 23, 2022 · 15 comments

Comments

@XQfelix
Copy link

XQfelix commented Aug 23, 2022

nacos-sync 使用版本为 0.4.8

在 nacos-sync 填写好信息之后, 发现服务列表无法同步.

问题1: 0.4.8版本是支持 nacos2.1.0版本的么?
问题2: 如果问题是回答是"OK"的话, 那有没有一个配置的示例或者说错误排查的方法呢

@chenzhiguo
Copy link

附议

@chenzhiguo
Copy link

chenzhiguo commented Oct 26, 2022

注意配置集群时的命名空间,保证配置没问题后,我升级nacos-client2.1.2可以实现同步。
但是nacos-client版本2.1.2有bug,只能同步一个实例,后面的会把前面的覆盖。

@snpyeso
Copy link

snpyeso commented Nov 9, 2022

附议 我2.1.1 到2.1.1 也不行

@chenhao26-nineteen
Copy link
Contributor

chenhao26-nineteen commented Nov 11, 2022

注意配置集群时的命名空间,保证配置没问题后,我升级nacos-client2.1.2可以实现同步。 但是nacos-client版本2.1.2有bug,只能同步一个实例,后面的会把前面的覆盖。

这个是Nacos2.x之前针对临时实例的特性,同一个客户端只允许注册一个实例 refer alibaba/nacos#5863 .在Nacos2.1.1以后,Nacos 提供了batch注册的特性,后续我会提pr,支持sync批量注册这一特性!

@1327681842
Copy link

注意配置集群时的命名空间,保证配置没问题后,我升级nacos-client2.1.2可以实现同步。 但是nacos-client版本2.1.2有bug,只能同步一个实例,后面的会把前面的覆盖。

这个是Nacos2.x之前针对临时实例的特性,同一个客户端只允许注册一个实例 refer alibaba/nacos#5863 .在Nacos2.1.1以后,Nacos 提供了batch注册的特性,后续我会提pr,支持sync批量注册这一特性!

@1327681842
Copy link

附议

@chenhao26-nineteen
Copy link
Contributor

目前Nacos-sync里面还没有高版本(2.x)批量注册的适配,nacos-client2.1.1临时实例批量注册(com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy#batchRegisterService)的功能是beta功能,临时实例批量注册的功能在2.2.0发布了正式稳定版,所以现在2.x的版本之间同步会有问题。会抽空适配这个特性,不过,也欢迎大家提pr

@zrlw
Copy link
Contributor

zrlw commented Oct 23, 2023

目前Nacos-sync里面还没有高版本(2.x)批量注册的适配,nacos-client2.1.1临时实例批量注册(com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy#batchRegisterService)的功能是beta功能,临时实例批量注册的功能在2.2.0发布了正式稳定版,所以现在2.x的版本之间同步会有问题。会抽空适配这个特性,不过,也欢迎大家提pr

近期有时间让nacos-sync适配这个特性么?或者提供一下nacos-sync修订的思路?让大家看看pr要怎么搞

@zrlw
Copy link
Contributor

zrlw commented Oct 23, 2023

如果只考虑nacos集群之间同步,是不是只修改NacosSyncToNacosServiceImpl这个类就行了

@zrlw
Copy link
Contributor

zrlw commented Oct 24, 2023

提交了两个PR ( 忘了应该要改哪个分支了,如果不是master就是develop):
#335 (for master branch)
#336 (for develop branch)
修改了NacosSyncToNacosServiceImpl和TaskAddAllProcessor两个类,用的nacos-client是当前最新的2.3.0Beta。
初步测试可同步dubbo3应用级别注册的服务名(临时实例),只是nacos2服务端ParamCheckRule.java定义了serviceName的检查规则:

public String serviceNamePatternString = "^(?!@).((?!@@)[^\\u4E00-\\u9FA5\\s])*$";

不允许出现@字符、汉字、空白字符,但nacos2服务端应答的查询服务实例结果里的各个instance对象的serviceName是“组名@@服务名”的形式,nacos-sync需要清掉组名@@前缀或者将serviceName属性重置为null再用做同步注册到目标集群的参数,否则目标集群serviceName参数检查就会失败: Param 'serviceName' is illegal

另外比较坑的是(很重要!):
nacos2新增的批量注册接口是全量更新,也就是每次更新需要构建出直接注册到源集群的全量实例(不含来自其他集群的同步实例),否则目标集群就会丢实例。批量反注册或解除注册接口最终也是调用的批量注册,就是把剩下的实例再批量注册一下。

!!注意!!
这个PR我只测试了临时实例(ephemeral=true),我没有持久实例测试环境,这个PR能否满足持久实例同步还需要进一步确认。

@zrlw
Copy link
Contributor

zrlw commented Oct 29, 2023

找到一下nacos相关issue:alibaba/nacos#9261
里面有持久实例的相关讨论:

NacosNamingService#registerInstance allows the same client to register multiple persistent instances, i

如果持久实例也有批量接口就方便了

@zrlw
Copy link
Contributor

zrlw commented Nov 2, 2023

#336 (for develop branch)
支持dubbo3应用级别服务实例同步了,无论元数据保存在注册中心(provider端的dubbo3需要配置dubbo.application.metadata-type=remote)还是默认的本地(dubbo.application.metadata-type=local)都能同步。

@zz630
Copy link

zz630 commented Dec 1, 2023

我之前是用注册持久化实例来做的同步,nacos版本是没有批量接口的2.0.3。
临时实例的问题在于,nacosSync高可用时,可能存在多个nacosSync同时处理一个任务,维持着某个实例的grpc连接。这时如果某个nacosSync到数据源nacos的网络出问题,同时实例下线了,这个nacosSync会一直维持着grpc连接。导致下线掉的实例在被同步的集群下线不了。
持久化实例起码有健康检查可以规避问题。
nacos的服务不允许同时有持久化和临时实例,所以普通注册也改为持久化实例。

@zrlw
Copy link
Contributor

zrlw commented Dec 1, 2023

nacosSync会一直维持着grpc连接

你说是nacos源注册中心集群已经挂了,NacosSync依然维持着nacos目标注册中心集群的grpc连接么(同步自源集群的实例)?

@zrlw
Copy link
Contributor

zrlw commented Dec 1, 2023

nacos已正式发布2.3.0,完善了批量接口,#336 做了同步更新,可以试试看。
如果及时感知服务端宕机或网络断开,建议将部署nacossync的linux的内核参数net.ipv4.tcp_retries2调成5,windows默认的就是5,这样当网络中断或服务端因故(比如断电)宕机时,nacosSync13秒左右就能感知到了,否则无效连接通常持续15分钟才会断开。
如果网络环境好,也可以参照redhat的建议调成3,那样3秒就能感知到了。

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

Successfully merging a pull request may close this issue.

7 participants