Nacos 集群 Fail to init node 与 Raft 脑裂救火

实战复盘:Nacos 集群报错 Fail to init node 与 Raft 脑裂救火

1. 踩坑现场

今天线上搞 Nacos 集群(版本 2.3.0)遇到个特别坑的事儿。其中有一台节点(10.20.30.230)死活起不来。

进去看了眼 nacos.log,刚跑起进程就直接炸了,甩了这么一段长长的报错:

java.lang.IllegalStateException: Fail to init node, please see the logs to find the reason.
        at com.alipay.sofa.jraft.RaftServiceFactory.createAndInitRaftNode(RaftServiceFactory.java:48)
        at com.alipay.sofa.jraft.RaftGroupService.start(RaftGroupService.java:129)
        at com.alibaba.nacos.core.distributed.raft.JRaftServer.createMultiRaftGroup(JRaftServer.java:260)

2. 揪出内鬼

看到 com.alipay.sofa.jraft 这行,瞬间秒懂,这明显是底层的 JRaft 协议挂了。

老运维都知道,Nacos 为了保证集群配置绝对一致(CP 模式),底层靠的是 Raft 协议在选举和记账。如果这台机器因为宕机、硬盘慢或者 IP 变动,导致它本地硬盘里的“Raft 账本”跟集群里的老大彻底对不上了(传说中的脑裂),JRaft 一校验发现不对劲,为了防止脏数据扩散,它就直接罢工抛异常了。

3. 简单粗暴的“黑科技”救火

按常规套路,跑到 /app/nacos/data/protocol 目录下把这堆脏账本全删了,让它重启变成“白板”,再去重新抱老大的大腿拉全量数据就行了。

但我嫌全量同步太慢,而且刚好旁边就有一台日志和状态都极其健康的节点,干脆弄了个简单粗暴的“偷懒黑科技”:直接把好机器的 protocol 账本强制覆盖过去。

废话不多说,直接在好机器上敲命令,一键强刷:

rsync -avz /app/nacos/data/protocol root@10.20.30.230:/app/nacos/data/

同步跑完,立马切回 .230 那台故障机,敲 sh startup.sh
不出所料,瞬间满血复活!去 Nacos 后台一看,顺利加群!

image-pqtK.png

4. 经验总结

这种直接把健康节点的底层账本通过 rsync 塞给坏节点的野路子,实际上就是绕开了漫长的网络全量同步,搞了一次**“离线物理快照恢复”**。

因为你拷贝过去的账本进度跟集群里的老大几乎一模一样,坏机器一启动立刻就认了新账本,连上老大后只要补几条这两秒内的极少量增量日志,就成功洗白了。

以后大家再遇到集群脑裂或者某个节点假死进不去群,这招极其顺手好用。

评论