PostgreSQL集群通过主从复制实现高可用和读写分离,repmgr作为集群管理工具可自动化故障转移。以下是在Ubuntu系统上搭建PostgreSQL物理流复制集群的详细步骤:
| 节点角色 | 主机名/IP | 说明 |
|---|---|---|
| 主库 | pg-master |
负责写操作,初始集群 |
| 从库1 | pg-standby1 |
同步主库数据 |
| 从库2 | pg-standby2 |
同步主库数据 |
在所有节点执行以下命令,安装最新稳定版PostgreSQL及contrib工具(包含实用脚本):
sudo apt update
sudo apt install -y postgresql postgresql-contrib
安装完成后,默认会创建postgres系统用户和/var/lib/postgresql/<version>/main数据目录。
编辑主库配置文件(路径:/etc/postgresql/<version>/main/postgresql.conf),调整以下参数:
# 允许远程连接
listen_addresses = '*'
# 设置WAL日志级别(物理复制必需)
wal_level = replica
# 允许的最大WAL发送进程数(从库数量+1)
max_wal_senders = 10
# 保留WAL日志文件的最小大小(避免从库滞后时日志被删除)
wal_keep_size = 1GB
# 开启热备模式(从库可执行查询)
hot_standby = on
编辑pg_hba.conf(路径:/etc/postgresql/<version>/main/pg_hba.conf),添加复制用户和普通用户的访问规则:
# 允许从库通过复制连接(IP替换为从库实际IP)
host replication replicator pg-standby1/32 md5
host replication replicator pg-standby2/32 md5
# 允许所有客户端连接(生产环境建议限制IP段)
host all all 0.0.0.0/0 scram-sha-256
sudo systemctl restart postgresql
切换至postgres用户,执行SQL创建专用于复制的用户(密码强度需符合要求):
sudo -u postgres psql
CREATE USER replicator WITH REPLICATION LOGIN PASSWORD 'YourStrongPassword123!';
\q
repmgr用于管理集群状态,需创建专用数据库和用户:
sudo -u postgres psql
CREATE DATABASE repmgr;
CREATE USER repmgr WITH SUPERUSER REPLICATION PASSWORD 'YourRepmgrPassword123!';
ALTER USER repmgr SET search_path TO repmgr, "$user", public;
\q
sudo systemctl stop postgresql
sudo rm -rf /var/lib/postgresql/<version>/main/*
通过pg_basebackup工具从主库同步数据(需替换主库IP、用户名和密码):
pg_basebackup -h pg-master -D /var/lib/postgresql/<version>/main \
-U replicator -P -R --wal-method=stream
-R:自动创建standby.signal文件(标识从库)和postgresql.auto.conf(包含主库连接信息)。--wal-method=stream:实时流式传输WAL日志,避免数据丢失。检查从库数据目录下的postgresql.auto.conf,应包含主库连接信息:
primary_conninfo = 'host=pg-master port=5432 user=replicator password=YourStrongPassword123!'
sudo systemctl start postgresql
切换至postgres用户,执行SQL查看从库状态:
sudo -u postgres psql
SELECT * FROM pg_stat_replication;
若返回结果包含主库的WAL发送进程信息,则说明复制成功。
sudo apt install -y repmgr
编辑主库的repmgr配置文件(路径:/etc/repmgr/<version>/repmgr.conf):
node_id=1
node_name='pg-master'
conninfo='host=pg-master user=repmgr dbname=repmgr'
data_directory='/var/lib/postgresql/<version>/main'
log_level=INFO
在主库上执行以下命令,注册主库到repmgr集群:
sudo -u postgres repmgr -f /etc/repmgr/<version>/repmgr.conf primary register
编辑从库的repmgr配置文件(以pg-standby1为例):
node_id=2
node_name='pg-standby1'
conninfo='host=pg-standby1 user=repmgr dbname=repmgr'
data_directory='/var/lib/postgresql/<version>/main'
failover=automatic
promote_command='repmgr standby promote -f /etc/repmgr/<version>/repmgr.conf --log-to-file'
follow_command='repmgr standby follow -f /etc/repmgr/<version>/repmgr.conf --log-to-file --upstream-node-id=%n'
在从库上执行以下命令,将自身注册到主库集群:
sudo -u postgres repmgr -f /etc/repmgr/<version>/repmgr.conf standby register
在所有节点上启动repmgr服务,用于监控集群状态:
sudo systemctl enable repmgrd
sudo systemctl start repmgrd
在主库上执行以下命令,查看集群节点信息:
sudo -u postgres repmgr -f /etc/repmgr/<version>/repmgr.conf cluster show
应返回类似以下结果,显示主库和从库的状态:
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection String
----+-------------+---------+-----------+----------+----------+----------+----------+---------------------------------
1 | pg-master | primary | * running | | default | 100 | 1 | host=pg-master user=repmgr dbname=repmgr
2 | pg-standby1 | standby | running | 1 | default | 100 | 1 | host=pg-standby1 user=repmgr dbname=repmgr
停止主库的PostgreSQL服务:
sudo systemctl stop postgresql
在从库上执行以下命令,手动触发故障转移(自动故障转移需配置repmgr的failover=automatic):
sudo -u postgres repmgr -f /etc/repmgr/<version>/repmgr.conf standby promote
在新主库(原从库)上执行以下命令,确认其角色已切换:
sudo -u postgres repmgr -f /etc/repmgr/<version>/repmgr.conf cluster show
应显示原从库已成为主库,其他从库会自动跟随。
若原主库恢复,可将其重新注册为从库:
sudo systemctl start postgresql
sudo -u postgres repmgr -f /etc/repmgr/<version>/repmgr.conf standby register
pg_basebackup或pgBackRest工具。repmgr的log_level=DEBUG或第三方工具(如Prometheus+Granafa)监控集群状态。trust认证方式,使用scram-sha-256加密密码;限制客户端IP访问范围。通过以上步骤,可在Ubuntu系统上搭建高可用的PostgreSQL物理流复制集群,结合repmgr实现自动化故障转移,保障业务连续性。