当集群内一个节点,宕机时。其他节点在写入新数据时会出现注册中心数据不一致的问题。
我们已经查询到了原因,并且可以稳定复现,复现的情况符合推测。
场景:
本来有3个节点,宕机一个节点。
一段时间过后,新注册的实例在剩余节点中不一致,(临时实例,使用distro协议)
并且新注册的实例在一定时间后,还是会被正确同步。
原因:
com.alibaba.nacos.common.task.engine.NacosExecuteTaskExecuteEngine # executeWorkers 属性
com.alibaba.nacos.common.task.engine.TaskExecuteWorker#queue 属性
中 BlockingQueue
当队列处理速度>提交数据时,新的实例的同步任务加会被堵塞。 我们最高观察到queue 内堵塞 3w+的任务。
问题是向宕机节点同步的任务耗时太高,这个方法观察耗时 需要 300ms 2021-10-30 07:17:29,952 WARN [DISTRO] Sync data change failed.
com.alibaba.nacos.api.exception.NacosException: Client not connected. at com.alibaba.nacos.common.remote.client.RpcClient.asyncRequest(RpcClient.java:727) at com.alibaba.nacos.core.cluster.remote.ClusterRpcClientProxy.asyncRequest(ClusterRpcClientProxy.java:192) at com.alibaba.nacos.naming.consistency.ephemeral.distro.v2.DistroClientTransportAgent.syncData(DistroClientTransportAgent.java:95) at com.alibaba.nacos.core.distributed.distro.task.execute.DistroSyncDeleteTask.doExecuteWithCallback(DistroSyncDeleteTask.java:60) at com.alibaba.nacos.core.distributed.distro.task.execute.AbstractDistroExecuteTask.run(AbstractDistroExecuteTask.java:64) at com.alibaba.nacos.common.task.engine.TaskExecuteWorker$InnerWorker.run(TaskExecuteWorker.java:116)