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 集群配置

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 服务。

相关推荐
萧曵 丶14 分钟前
事务ACID特性详解
数据库·事务·acid
HABuo29 分钟前
【Linux进程(四)】进程切换&环境变量深入剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
橘颂TA44 分钟前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁
kejiayuan1 小时前
CTE更易懂的SQL风格
数据库·sql
kaico20181 小时前
MySQL的索引
数据库·mysql
黄焖鸡能干四碗1 小时前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
橙露1 小时前
国产PLC与进口PLC全面对比分析:技术、市场与未来趋势
运维·网络
lbb 小魔仙2 小时前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生
清水白石0082 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔2 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql