PostgreSQL etcd 集群介绍
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 集群配置
# 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 配置
# postgresql1.yml
scope: my-pg-cluster
name: postgresql1restapi:listen: 192.168.1.20:8008connect_address: 192.168.1.20:8008etcd:hosts: ["192.168.1.10:2379", "192.168.1.11:2379", "192.168.1.12:2379"]bootstrap:dcs:ttl: 30loop_wait: 10retry_timeout: 10maximum_lag_on_failover: 1048576postgresql:use_pg_rewind: trueuse_slots: trueparameters:wal_level: replicahot_standby: "on"max_wal_senders: 10wal_keep_size: 1GBpostgresql:listen: 192.168.1.20:5432connect_address: 192.168.1.20:5432data_dir: /var/lib/postgresql/15/mainbin_dir: /usr/lib/postgresql/15/binpgpass: /tmp/pgpass
操作命令
1. 检查 etcd 集群状态
# 检查集群成员
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 集群状态
# 通过 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. 手动故障转移
# 安全地切换主节点
patronictl -c /etc/patroni.yml switchover# 重新加载配置
patronictl -c /etc/patroni.yml reload my-pg-cluster
优势特点
优点
- 高可用性:自动故障转移,服务中断时间短
- 数据一致性:基于流复制,数据同步可靠
- 易于管理:Patroni 自动化运维操作
- 可扩展性:轻松添加新的 PostgreSQL 节点
注意事项
- etcd 集群规模:建议 3 或 5 个节点(奇数个)
- 网络要求:节点间低延迟网络通信
- 资源规划:etcd 需要足够的磁盘 I/O 和内存
- 监控告警:需要监控两个集群的状态
故障排查
# 查看 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 服务。