PostgreSQL 是一个功能强大的开源关系型数据库系统,其高可用性和可扩展性一直是企业级应用的重要需求。为了确保数据库服务的持续可用性,部署 PostgreSQL 高可用集群是非常关键的一步。本文将详细介绍如何设计和部署一个 PostgreSQL 高可用集群,并深入解析相关技术概念。
在讨论 PostgreSQL 高可用集群之前,我们需要了解一些基本概念:
一个典型的 PostgreSQL 高可用集群通常由以下组件组成:
主节点负责处理写操作(如 INSERT
、UPDATE
、DELETE
),并将其修改通过流复制同步到一个或多个从节点。从节点可以用于读操作,分担主节点的压力。
哨兵服务用于监控主节点状态,并在主节点不可用时触发故障转移。常见的哨兵工具包括:
负载均衡器(如 HAProxy 或 PgBouncer)用于分发客户端请求到主节点或从节点,优化资源利用。
使用共享存储(如 NFS、Ceph)或本地存储结合同步机制,确保数据一致性。
假设我们有三台服务器:
安装 PostgreSQL 并配置基础环境:
sudo apt update
sudo apt install postgresql postgresql-contrib
编辑主节点的配置文件 /etc/postgresql/14/main/postgresql.conf
,启用流复制:
wal_level = replica
max_wal_senders = 3
wal_keep_size = 1GB
archive_mode = on
archive_command = 'test ! -f /var/lib/postgresql/wal_archive/%f && cp %p /var/lib/postgresql/wal_archive/%f'
listen_addresses = '*'
编辑 /etc/postgresql/14/main/pg_hba.conf
,允许从节点连接:
host replication all 192.168.1.0/24 md5
重启主节点服务:
sudo systemctl restart postgresql
在从节点上创建基础备份:
sudo -u postgres pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/14/main -U replicator -v -P --wal-method=stream
创建 recovery.conf
文件(PostgreSQL 12 及以上版本为 postgresql.auto.conf
):
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.10 port=5432 user=replicator password=yourpassword'
trigger_file = '/tmp/failover.trigger'
启动从节点服务:
sudo systemctl start postgresql
安装 Patroni 和 etcd:
pip install patroni
sudo apt install etcd
编写 Patroni 配置文件(patroni.yml
):
scope: my_cluster
name: postgres0
restapi:
listen: 192.168.1.10:8008
connect_address: 192.168.1.10:8008
etcd:
host: 127.0.0.1:2379
postgresql:
name: postgres0
scope: my_cluster
data_dir: /data/postgres
parameters:
wal_level: replica
max_wal_senders: 3
archive_mode: on
replication:
username: replicator
password: yourpassword
启动 Patroni:
patroni /path/to/patroni.yml
当主节点发生故障时,Patroni 会自动选择一个健康的从节点晋升为主节点。以下是故障转移的逻辑流程图:
sequenceDiagram participant Monitor as Sentinel/Patroni participant Master as 主节点 participant Standby as 从节点 participant Client as 客户端 Note over Monitor: 检测到主节点不可用 Monitor->>Standby: 触发选举逻辑 Standby-->>Monitor: 返回健康状态 Monitor->>Standby: 晋升为主节点 Standby-->>Client: 开始接收写请求
流复制提供了两种模式:
使用 Prometheus 和 Grafana 监控 PostgreSQL 集群的运行状态,设置关键指标(如延迟、连接数)的告警规则。
定期进行全量备份和增量备份,结合 PITR 实现灾难恢复能力。