PostgreSQL 使用 etcd 集群主要是为了实现高可用性(HA)和自动故障转移,通常与 Patroni 这样的工具配合使用。
架构概述
+------------+ +------------+ +------------+
| PostgreSQL | | PostgreSQL | | PostgreSQL |
| Node 1 | | Node 2 | | Node 3 |
+------------+ +------------+ +------------+
| | |
+-----------------+-----------------+
|
+---------------------+
| etcd Cluster |
| (3 or 5 nodes) |
+---------------------+
核心组件作用
1. etcd 的角色
- 分布式配置存储:存储集群状态、成员信息
- 领导者选举:协调哪个 PostgreSQL 节点是主节点
- 分布式锁:确保同一时间只有一个主节点
- 服务发现:客户端可以查询当前的主节点信息
2. PostgreSQL 集群
- 一主多从:一个主节点(可读写),多个备节点(只读)
- 流复制:数据从主节点实时同步到备节点
- 自动故障转移:主节点故障时自动提升备节点为主节点
部署配置示例
1. etcd 集群配置
yaml
# etcd 1 配置
name: etcd1
listen-client-urls: http://192.168.1.10:2379
advertise-client-urls: http://192.168.1.10:2379
initial-cluster: etcd1=http://192.168.1.10:2380,etcd2=http://192.168.1.11:2380,etcd3=http://192.168.1.12:2380
initial-cluster-token: pg-cluster
initial-cluster-state: new
2. Patroni 配置
yaml
# postgresql1.yml
scope: my-pg-cluster
name: postgresql1
restapi:
listen: 192.168.1.20:8008
connect_address: 192.168.1.20:8008
etcd:
hosts: ["192.168.1.10:2379", "192.168.1.11:2379", "192.168.1.12:2379"]
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
hot_standby: "on"
max_wal_senders: 10
wal_keep_size: 1GB
postgresql:
listen: 192.168.1.20:5432
connect_address: 192.168.1.20:5432
data_dir: /var/lib/postgresql/15/main
bin_dir: /usr/lib/postgresql/15/bin
pgpass: /tmp/pgpass
操作命令
1. 检查 etcd 集群状态
bash
# 检查集群成员
etcdctl --endpoints=192.168.1.10:2379 member list
# 检查集群健康状态
etcdctl --endpoints=192.168.1.10:2379,192.168.1.11:2379,192.168.1.12:2379 endpoint health
2. 检查 PostgreSQL 集群状态
bash
# 通过 Patroni API 检查
curl http://192.168.1.20:8008
curl http://192.168.1.21:8008
curl http://192.168.1.22:8008
# 或使用 patronictl
patronictl -c /etc/patroni.yml list
3. 手动故障转移
bash
# 安全地切换主节点
patronictl -c /etc/patroni.yml switchover
# 重新加载配置
patronictl -c /etc/patroni.yml reload my-pg-cluster
优势特点
优点
- 高可用性:自动故障转移,服务中断时间短
- 数据一致性:基于流复制,数据同步可靠
- 易于管理:Patroni 自动化运维操作
- 可扩展性:轻松添加新的 PostgreSQL 节点
注意事项
- etcd 集群规模:建议 3 或 5 个节点(奇数个)
- 网络要求:节点间低延迟网络通信
- 资源规划:etcd 需要足够的磁盘 I/O 和内存
- 监控告警:需要监控两个集群的状态
故障排查
bash
# 查看 Patroni 日志
journalctl -u patroni -f
# 检查 etcd 领导状态
etcdctl --endpoints=192.168.1.10:2379 endpoint status
# 验证 PostgreSQL 复制状态
psql -h 192.168.1.20 -c "SELECT * FROM pg_stat_replication;"
这种架构非常适合生产环境,能够提供企业级的高可用 PostgreSQL 服务。