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

相关推荐
Poo_Chai1 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
茶本无香1 小时前
Java调用Shell脚本执行SQL数据库操作:从入门到实战
java·sql·shell
这个DBA有点耶2 小时前
从DBA到数据架构师(五):数据架构演进中的技术债务管理
数据库·程序人生·云原生·架构·dba·数据库管理员
HiDev_2 小时前
【非标自动化】2、认识元器件(固态继电器)
运维·自动化
明达智控技术2 小时前
国产 PLC 落地立库自动化,MC5000边缘智能控制器破局
运维·自动化
小绫网络安全2 小时前
Kali Linux渗透测试入门教程:从零搭建到实战攻防
linux·运维·服务器
西安景驰电子2 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
Bruce_Liuxiaowei2 小时前
基于微步在线威胁情报的公网 IP 攻击迹象监测:threatbook_query 脚本全解析与 BruceSec 平台整合实践
数据库·tcp/ip·安全·网络安全·智能体
码农颜2 小时前
5.6.2 ⾏级锁死锁
数据库·sql·oracle
ChaHae-In3 小时前
MyBatis动态SQL与MyBatis-Plus高效开发指南
数据库·oracle·mybatis