-
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
多个节点的数据不一致了 #8099
Comments
[sys_su@ip-10-21-40-240 logs]$ grep '2022-04-07 11:05' naming-server.log | grep 'disconnect, remove instances and subscribers' | wc -l |
进一步问题跟进: |
2022-04-07 00:00:02,186 WARN Node <naming_persistent_service_v2/10.21.42.19:7848> can't do preVote as it is not in conf <ConfigurationEntry [id=LogId [index=76, term=7], conf=10.21.42.90:7848,10.21.41.212:7848, oldConf=]>. 集群下线是一个 “玩死” 操作,整个集群挂掉, 死循环下线,整个集群的状态 不断抖动 (ACTIVE\DOWN\XX), 这个时候整个集群问题不大(也不太健康,但是业务上没有大规模泛滥),可以正常对外提供服务! 当时进一步 “玩死”操作,1. 关闭了一个节点,此时集群变成了3节点 2. 下线剩余的两个节点(控制台操作)(高危)3.下线的两个节点仍然对外服务=> 当时害怕一个节点扛不住,以为这个时候只有新注册地实例才有可能不一致====》但是结果是致命的,下线的两个节点 大面积的临时实例下线(吐血)(故障) 4. 重新上线恢复的整个集群 从第二天的集群检查结果来看,集群恢复的还是有些问题,其中 19节点的raft 组显示异常,并且有上面地warn 日志 又一次 聪明的 敢死队 操作!自以为聪明的,先摘掉流量,然后删除数据重启,导致的两个实例大面积下线实例。 连续两天=> 被逼跑路~~ 事后 看日志,发现是 19点在raft 组里面找不到自身,导致投票无法成功! 这里必然证明了 在控制台操作下线 是多么的危险和不靠谱!!! |
19 节点 最后一次成员变更日志 2022-04-06 11:16:42,659 WARN [serverlist] updated to : |
我找了一个问题实例, 大规模下线实例的日志 ,下面的日志来自于240 grep 所有日志 从上面地日志可以看到,1649329373866_10.2.95.178_36534 来自90 这个实例,同时保存时间为3分钟左右,初步判定是90 在这几分钟内没有发送 心跳 verifydata事件=====> 进一步排查中~~~~ 使用搜索Ip 命令 grep '10.2.95.178' *log 3分钟以后,两个client 都完成下线~ 又发现了这样的日志 这个日志刷新了30次,怀疑是挤压了,正常5s搞一次,对应2分半,是不是堆积了2分半呢 通过 命令查看 线上集群 本身并不均匀, 客户端大部门连接的都是 90 这台机器,所以 90的同步压力会很大, |
90 这个实例的最后一个 member 变更-> 5节点,表现正常 2022-04-06 11:16:09,216 WARN [serverlist] updated to : [Member{ip='10.21.41.199', port=8848, state=UP, extendInfo={raftPort=7848}}, Member{ip='10.21.42.19', port=8848, state=UP, extendInfo={raftPort=7848}}, Member{ip='10.21.42.90', port=8848, state=UP, extendInfo={lastRefreshTime=1649243582689, raftMetaData=com.alibaba.nacos.consistency.ProtocolMetaData@3d57bb9b, raftPort=7848, version=2.0.3}}, Member{ip='10.21.40.240', port=8848, state=UP, extendInfo={raftPort=7848}}, Member{ip='10.21.41.212', port=8848, state=UP, extendInfo={raftPort=7848}}] |
难道结论是?: 重启一个节点 要控制在3min 内,理由,这段期间临时实例不会下线,即使同步有拥堵也不会有这个问题, |
有点意思,mark 一下 |
跟我碰到的问题是一样的。 临时实例的注册和同步情况跟 raft没有关系 (nacos 的 raft协议感觉经常出问题),各种raft的错误日志是有节点不正常导致的。建议把重点放到distro协议上,关注一下protocol-distro日志,里面是否出现了大量的failed。 说一下我的复现步骤: |
你的这个复现场景 属于典型的积压导致~ 线上遇到的问题是 重启单个节点(5分钟停歇) 导致了大规模的实例下线 |
正好在你开的另外一个issue也看到了,你的客户端是2.0.3的版本还是1.x的版本? 另外,积压跟实例下线是相伴相生的,因为verify的task得不到执行,节点就会把不是跟自己直接建立连接的客户端及其注册的服务和监听踢掉,这样集群内不同节点的服务数据不一致,也会出现你看到的大规模实例下线的状况了。 我猜这个时候下线的实例并不是在所有的节点注销了,而是只在自己建连得节点上能看到,是这个样子吗? |
没记错的话,临时实例走distro协议(弱一致性),持久化实例才走raft协议.然后distro协议,同步信息给其他节点,如果同步失败,会进行重试,而同步时使用的服务实例地址则来自你的配置(address-server或者config-file).. |
|
结论是对的! 的确是因为19宕机导致的拥堵 |
结论无raft状态无关~~ protocol-distro.log.2022-04-06.0:2022-04-06 11:04:52,748 WARN task com.alibaba.nacos.core.distributed.distro.task.verify.DistroVerifyExecuteTask@71418d55 takes 41936ms |
为啥 单点宕机 这么立杆剪影了,整个集群立马跪~~~
这里一次阻塞100ms, 3次 重试,也就是300ms! 当时90有多少数据需要同步呢 |
如果某个节点宕机超过3分钟,就死~~ |
目前nacos 没有找到指标 某个节点到底负责了多少了临时节点~ |
这个指标是有的 #6572 |
是否是使用了go-sdk-2.0.0版本? |
OK~ 这个需要升级,内部使用的是 2021.07 的版本 |
不是的,线上大部分服务使用的 都是 java 2.x的版本~ |
单节点宕机, 向宕机节点数据同步的时候单条需要300ms, 会卡主线程 我理解 这里需要解决阻塞的问题,因为nacos 内部代码很多使用了异步逻辑,本质上不会阻塞 |
Describe the bug
版本 2.0.3
生产环境部署了5节点,其中一个节点的raft状态有问题,通过前端 Nginix 将有问题的节点 摘除流量,然后删除raft 数据重启,raft状态恢复正常!但是导致一段时间内 多个节点的 临时实例的 个数不一致了,导致 推送给客户端大量的删除事件->故障#
一共5节点部署,其中两个实例 注册地实例数量 跌到了1/3到1/2
The text was updated successfully, but these errors were encountered: