Consul 多数据中心
单集群扛不住跨地域容灾与就近访问需求时,Consul 支持把多个数据中心(DC)联邦起来:每个 DC 内部独立自治,DC 之间通过 WAN gossip 互相发现并转发请求。
WAN gossip 与联邦
联邦发生在 server 之间:把一个 DC 的 server 用 WAN 地址加入另一个 DC,两边经 8302 端口交换成员信息:
# 在 dc2 的 server 上执行,把 dc1 的 server 加入 WAN 成员:
consul agent -server -datacenter=dc2 -retry-join-wan=192.168.1.11
# 任一节点查看 WAN 成员,应看到两个 DC 的 server:
consul members -wan
# 输出:s1.dc1 192.168.1.11:8302 alive server ... s4.dc2 192.168.1.41:8302 alive server ...
只有 server 参与跨 DC 联邦,client 永远只属于本地 DC;各 DC 内部仍各自维护 LAN gossip。
请求自动转发
任意 agent 收到非本 DC 的请求会自动转发给目标 DC 的 server,业务无感知,也可显式指定 DC:
curl "http://127.0.0.1:8500/v1/catalog/services?dc=dc2"
# 输出:返回 dc2 的服务目录(本地 dc1 节点代转发)
数据中心命名与 DNS 发现
每个 DC 的名称在配置里声明,默认 dc1;多 DC 部署时务必显式命名:
{ "datacenter": "dc2", "node_name": "s4", "server": true }
跨 DC 服务发现走 DNS 的 <name>.service.<dc>.consul 形式:
dig @127.0.0.1 -p 8600 web.service.dc2.consul
# ANSWER SECTION 里返回 dc2 中 web 服务的健康实例 IP
容灾语义
联邦不等于数据同步:每个 DC 都是独立的 Raft 集群,KV 与服务数据只在本 DC 内复制,跨 DC 默认不复制任何数据。多 DC 的价值在请求级故障转移与就近访问,而不是数据备份:
| 方式 | 数据语义 | 适用 |
|---|---|---|
| 同 DC 多 server | 强一致复制 | 单机房高可用 |
| 多 DC 联邦 | 各自独立、请求互转 | 跨地域容灾与就近 |
| 异地数据备份 | 需 snapshot 主动完成 | 防整个 DC 毁灭(见第 16 章) |
小结
多数据中心要点:server 间用 -retry-join-wan 建联邦、请求可自动跨 DC 转发、DNS 用 <name>.service.<dc>.consul 跨 DC 解析。切记 KV 不跨 DC 复制,跨地域的数据安全要靠快照备份兜底。