Consul 集群搭建
单台 server 只是学习玩具,生产要用多台 server 组成集群:Raft 需要多数派(quorum)才能选主与提交,因此 server 必须取奇数,官方建议最小 3 台。
集群规划
生产最小拓扑 3 台 server + 若干 client,3 台时 quorum=2,允许 1 台故障:
| 节点 | 角色 | 说明 |
|---|---|---|
| s1 / s2 / s3 | server | 参与 Raft 选举与数据存储 |
| app1 / app2 | client | 部署业务,转发注册与查询 |
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 台,这是容灾设计的最小依据。