Consul 集群搭建

单台 server 只是学习玩具,生产要用多台 server 组成集群:Raft 需要多数派(quorum)才能选主与提交,因此 server 必须取奇数,官方建议最小 3 台。

集群规划

Consul 集群拓扑 生产最小拓扑 3 台 server + 若干 client,3 台时 quorum=2,允许 1 台故障:

节点角色说明
s1 / s2 / s3server参与 Raft 选举与数据存储
app1 / app2client部署业务,转发注册与查询

server 配置

三台配置几乎相同,只改 node_name 与 bind_addr;每台放 /etc/consul.d/server.json:

{
  "node_name": "s1",
  "server": true,
  "bootstrap_expect": 3,
  "data_dir": "/opt/consul/data",
  "ui_config": { "enabled": true },
  "bind_addr": "192.168.1.11",
  "retry_join": ["192.168.1.11", "192.168.1.12", "192.168.1.13"]
}
配置项含义
server以 server 角色运行
bootstrap_expect期望的 server 数,达到后才自动选举 leader
retry_join启动后反复尝试加入的节点列表,容忍启动顺序颠倒
data_dir持久数据目录,唯一需要备份的数据

启动顺序与验证

依次启动 s1、s2、s3:前两台会等待,第三台起来达到 bootstrap_expect 后自动选出 leader:

# 每台都执行:consul agent -config-dir=/etc/consul.d
consul agent -config-dir=/etc/consul.d
# 任一台机器上查看成员:
consul members
# 输出:s1 192.168.1.11:8301 alive server ...   s2 ... alive server   s3 ... alive server
# 查看当前 leader:
consul operator raft list-peers
# 输出:Node  ID                     Address           State     Voter  RaftProtocol
# 输出:s1    8f8c...               192.168.1.11:8300  leader    true   3

节点离线与选举

任意一台 server 掉线,只要仍满足 quorum,集群照常服务并自动重新选举 leader 继续写入;故障台数达到多数时集群进入只读保护,恢复一台后自动回稳。因此 server 应跨机架、跨交换机部署,避免单点物理故障一次带走多台。

加入 client agent

业务机器以 client 角色加入集群,client 不选举不存数据,只负责转发:

consul agent -data-dir=/opt/consul/data \
  -retry-join=192.168.1.11 -retry-join=192.168.1.12 -retry-join=192.168.1.13
consul members
# 输出里应看到该 client 节点 Status 为 alive

小结

集群三步走:准备三份基本相同的 server 配置(bootstrap_expect=3、retry_join 互指)→ 依次启动自动选主 → members 与 raft list-peers 验证。记住 quorum 语义:3 台可挂 1 台、5 台可挂 2 台,这是容灾设计的最小依据。

笔记加载中…