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

相关推荐
thginWalker4 小时前
etcd实战课-实战篇(下)
etcd
thginWalker4 小时前
etcd实战课-基础篇(下)
etcd
NPE~4 小时前
[手写系列]Go手写db — — 第五版(实现数据库操作模块)
开发语言·数据库·后端·golang·教程·手写系列·手写数据库
有想法的py工程师5 小时前
PostgreSQL 测试磁盘性能
数据库·postgresql
Java 码农5 小时前
CentOS 7上安装SonarQube10
linux·centos
Zhsh-75 小时前
centos配置ES和MYSQL自动备份
mysql·elasticsearch·centos
2301_797604245 小时前
d41:MyBatisPlus入门,注解,配置,条件构造器,自定义SQL,IService
sql·mybatis
九次光5 小时前
数据处理全流程(基于PostgreSQL+PostGIS)
postgresql
宇宙第一小趴菜6 小时前
11 安装回忆相册
linux·运维·centos7·yum·回忆相册·kh_mod