PostgreSQL 高可用架构实战:从流复制到 Patroni 集群部署 原创

温馨提示:
本文最后更新于 2026-06-25,已超过 77 天没有更新。 若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我

PostgreSQL 高可用架构实战:从流复制到 Patroni 集群部署

在现代生产环境中,数据库的高可用性是不可或缺的。PostgreSQL 作为最先进的开源关系型数据库之一,提供了多种高可用方案。本文将从基础到进阶,全面讲解 PostgreSQL 高可用架构的设计与实现。

一、高可用架构基础

1.1 为什么需要高可用

数据库单点故障可能导致:

  • 服务完全中断
  • 数据丢失风险
  • 业务连续性受损
  • 用户信任度下降

一个完善的高可用架构应满足:

  • 故障自动切换:主库宕机时自动选举新主库
  • 数据零丢失:同步复制确保数据完整性
  • 读写分离:利用从库分担读负载
  • 可扩展性:支持水平扩展

1.2 PostgreSQL 高可用方案对比

方案 特点 适用场景
流复制 + 手动切换 简单、原生支持 开发/测试环境
Patroni 自动化、自愈、分布式 生产环境
pgpool-II 连接池 + 负载均衡 读多写少场景
repmgr 管理工具、监控 中小规模集群

二、流复制基础搭建

流复制(Streaming Replication)是 PostgreSQL 高可用的基石。

2.1 主库配置

修改 postgresql.conf

listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1024    # MB
hot_standby = on

修改 pg_hba.conf 添加复制用户权限:

# 允许复制连接
host replication replicator 192.168.1.0/24 md5

2.2 从库配置

使用 pg_basebackup 初始化从库:

pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/data \
  -U replicator -P -v -R --wal-method=stream

参数说明:

  • -R:自动创建 standby.signal 和 postgresql.auto.conf
  • --wal-method=stream:使用流复制传输 WAL

2.3 验证复制状态

-- 主库查看复制状态
SELECT * FROM pg_stat_replication;

-- 从库查看恢复状态
SELECT * FROM pg_stat_wal_receiver;

三、Patroni 集群部署

Patroni 是目前最流行的 PostgreSQL 高可用管理工具,它使用分布式一致性算法(etcd/Consul/ZooKeeper)实现自动故障切换。

3.1 架构设计

一个典型的 Patroni 集群包含:

  • PostgreSQL 节点:3 个以上节点(一主多从)
  • DCS(分布式配置存储):etcd 或 Consul
  • Patroni:运行在每个节点上的管理进程
  • HAProxy:负载均衡和连接路由

3.2 安装与配置

安装 Patroni:

pip install patroni[etcd]

Patroni 配置文件 /etc/patroni/patroni.yml

scope: pg-cluster
namespace: /db/
name: pg-node1

restapi:
  listen: 0.0.0.0:8008
  connect_address: 192.168.1.10:8008

etcd:
  host: 192.168.1.100:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        wal_level: replica
        hot_standby: on
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: on

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.1.10:5432
  data_dir: /var/lib/postgresql/15/main
  bin_dir: /usr/lib/postgresql/15/bin
  authentication:
    replication:
      username: replicator
      password: secure_password
    superuser:
      username: postgres
      password: super_secure_password

3.3 启动集群

# 在每个节点启动 Patroni
systemctl start patroni

# 查看集群状态
patronictl -c /etc/patroni/patroni.yml list

# 输出示例:
# + Cluster: pg-cluster (734234234) ----+----+-----------+
# | Member    | Host          | Role    | State | Lag     |
# +-----------+---------------+---------+-------+---------+
# | pg-node1  | 192.168.1.10  | Leader  | running | 0      |
# | pg-node2  | 192.168.1.11  | Replica | running | 0      |
# | pg-node3  | 192.168.1.12  | Replica | running | 0      |
# +-----------+---------------+---------+-------+---------+

四、HAProxy 负载均衡

HAProxy 作为前端代理,将读写请求路由到正确的 PostgreSQL 节点。

global
    maxconn 1000

defaults
    mode tcp
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend pg_frontend
    bind *:5000
    default_backend pg_write

    # 读请求路由到从库
    acl read_only path_end -i /read
    use_backend pg_read if read_only

backend pg_write
    option httpchk GET /master
    server pg-node1 192.168.1.10:5432 check port 8008
    server pg-node2 192.168.1.11:5432 check port 8008
    server pg-node3 192.168.1.12:5432 check port 8008

backend pg_read
    option httpchk GET /replica
    server pg-node2 192.168.1.11:5432 check port 8008
    server pg-node3 192.168.1.12:5432 check port 8008

五、故障切换测试

5.1 模拟主库故障

# 停止主库 PostgreSQL
systemctl stop postgresql@15-main

# Patroni 自动检测并切换
patronictl -c /etc/patroni/patroni.yml list

# 输出显示新 Leader 已选举

5.2 恢复原主库

# 启动原主库
systemctl start postgresql@15-main

# Patroni 自动将其加入集群作为从库
patronictl -c /etc/patroni/patroni.yml list

六、监控与告警

# 使用 patronictl 查看详细状态
patronictl -c /etc/patroni/patroni.yml topology

# 检查复制延迟
SELECT
    application_name,
    state,
    sync_state,
    pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag
FROM pg_stat_replication;

七、总结

PostgreSQL 高可用架构从基础的流复制到 Patroni 自动化集群,提供了从开发到生产的完整解决方案。Patroni + etcd + HAProxy 的组合已经成为业界标准,能够满足绝大多数生产环境的需求。关键在于:选择合适的方案、充分测试故障切换流程、建立完善的监控体系。