Consul集群同步失败无领导者:所有Server节点均为Follower且peers为0
我之前也碰到过类似的Consul集群选举故障,结合你的描述——consul members显示所有节点都已加入,但集群报无Leader、3台Server的peers数全为0且都是Follower状态——核心问题应该是Server节点之间没法成功建立Raft集群的同伴关系,导致没法达到法定人数(3台Server需要至少2台正常通信才能选举Leader)。下面是几个最可能的原因和对应的排查/解决方法:
1. Server节点间的关键端口被拦截
Consul Server之间要靠两个端口通信:RPC端口(默认8300,用于Raft集群通信)和Serf LAN端口(默认8301,用于节点发现和状态同步)。如果这两个端口被防火墙、安全组或者本地iptables挡住了,节点之间没法交换集群信息,自然没法识别同伴。
- 你可以这么排查:
在每台Server上,用nc命令测试和其他Server节点的这两个端口是否能连通:
如果连接失败,就去调整防火墙/安全组规则,允许集群内Server节点之间的双向通信。nc -zv <其他Server的集群IP> 8300 nc -zv <其他Server的集群IP> 8301
2. bootstrap-expect配置不匹配
3台Server的集群,必须每台Server都配置bootstrap_expect=3(告诉Consul要等够3台Server再初始化集群)。如果部分节点没设这个值,或者设成了1、2,就会导致集群没法正确触发Leader选举。
- 检查方式:
查看每台Server的Consul配置文件(比如/etc/consul.d/server.hcl),确认有这两行:
如果是用命令行启动的,要确保启动参数里包含server = true bootstrap_expect = 3-bootstrap-expect=3。
3. peers.json的内容有隐性错误
你说已经验证了peers.json,但还是要确认几个细节:
- 里面的IP必须是Server节点的绑定IP(bind_addr),不能是127.0.0.1或者仅本地可达的IP;
- 端口必须是RPC端口8300,不是Serf或HTTP端口;
- 格式必须是标准JSON数组,比如:
["192.168.0.10:8300", "192.168.0.11:8300", "192.168.0.12:8300"] - 另外,手动修改peers.json后,必须重启Consul服务才能生效,而且所有Server的peers.json内容要完全一致。
4. bind_addr配置错误
如果Server节点的bind_addr设成了127.0.0.1,其他节点根本没法通过这个IP连接到它,自然没法加入同一个Raft集群。
- 检查配置:
打开Server的配置文件,确认bind_addr是集群内可访问的IP,比如:
生产环境建议指定具体的集群IP,不要用bind_addr = "192.168.0.10"0.0.0.0(虽然也能工作,但不够严谨)。
5. 集群初始化方式不对
如果你的Server是逐个启动的,但第一台节点没正确引导集群,后续节点加入时没法和它建立同伴关系,就会导致全是Follower。
- 重置集群的正确步骤:
- 停止所有Consul Server和Client节点;
- 删除每台Server的Consul数据目录(默认是
/opt/consul/data),彻底清除旧的集群状态; - 先启动第一台Server,加上启动参数:
consul agent -server -bootstrap-expect=3 -bind=<自身集群IP> -data-dir=/opt/consul/data; - 再依次启动另外两台Server,用
-join=<第一台Server的IP>参数加入,比如:consul agent -server -join=192.168.0.10 -bind=<自身集群IP> -data-dir=/opt/consul/data; - 最后启动Client节点,用
-join=<任意Server的IP>加入集群。
验证集群状态
解决完问题后,用这几个命令确认:
# 查看所有节点状态 consul members # 查看Raft集群的同伴和Leader信息 consul operator raft list-peers # 查看节点的Raft相关指标 consul info | grep -E "(raft.leader|raft.peers)"
如果consul operator raft list-peers显示3台Server,且其中一个标注为Leader,同时每个Server的raft.peers数是2(因为自己不算在peers列表里),就说明集群正常工作了。
内容的提问来源于stack exchange,提问作者Ashutosh Narayan




