You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Consul集群同步失败无领导者:所有Server节点均为Follower且peers为0

解决Consul集群无Leader、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节点的这两个端口是否能连通:
    nc -zv <其他Server的集群IP> 8300
    nc -zv <其他Server的集群IP> 8301
    
    如果连接失败,就去调整防火墙/安全组规则,允许集群内Server节点之间的双向通信。

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,比如:
    bind_addr = "192.168.0.10"
    
    生产环境建议指定具体的集群IP,不要用0.0.0.0(虽然也能工作,但不够严谨)。

5. 集群初始化方式不对

如果你的Server是逐个启动的,但第一台节点没正确引导集群,后续节点加入时没法和它建立同伴关系,就会导致全是Follower。

  • 重置集群的正确步骤:
    1. 停止所有Consul Server和Client节点;
    2. 删除每台Server的Consul数据目录(默认是/opt/consul/data),彻底清除旧的集群状态;
    3. 先启动第一台Server,加上启动参数:consul agent -server -bootstrap-expect=3 -bind=<自身集群IP> -data-dir=/opt/consul/data
    4. 再依次启动另外两台Server,用-join=<第一台Server的IP>参数加入,比如:consul agent -server -join=192.168.0.10 -bind=<自身集群IP> -data-dir=/opt/consul/data
    5. 最后启动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

火山引擎 最新活动