文章目录
-
- [一、repmgr 概述](#一、repmgr 概述)
-
- [1.1 什么是 repmgr?](#1.1 什么是 repmgr?)
- [1.2 架构特点](#1.2 架构特点)
- [1.3 与 Patroni 对比](#1.3 与 Patroni 对比)
- 二、环境规划
-
- [2.1 节点信息](#2.1 节点信息)
- [三、安装 repmgr](#三、安装 repmgr)
-
- [3.1 安装 PostgreSQL(所有节点)](#3.1 安装 PostgreSQL(所有节点))
- [3.2 安装 repmgr](#3.2 安装 repmgr)
- 四、配置主库(node1)
-
- [4.1 初始化数据库](#4.1 初始化数据库)
- [4.2 修改 postgresql.conf](#4.2 修改 postgresql.conf)
- [4.3 配置 pg_hba.conf](#4.3 配置 pg_hba.conf)
- [4.4 创建 repmgr 用户和数据库](#4.4 创建 repmgr 用户和数据库)
- [4.5 创建 repmgr 配置文件](#4.5 创建 repmgr 配置文件)
- [4.6 注册主库](#4.6 注册主库)
- 五、配置备库(node2)
-
- [5.1 清理数据目录(如有)](#5.1 清理数据目录(如有))
- [5.2 使用 repmgr 克隆主库](#5.2 使用 repmgr 克隆主库)
- [5.3 启动 PostgreSQL](#5.3 启动 PostgreSQL)
- [5.4 配置 repmgr.conf(node2)](#5.4 配置 repmgr.conf(node2))
- [5.5 注册备库](#5.5 注册备库)
- 六、配置自动故障转移(repmgrd)
-
- [6.1 启动 repmgrd 守护进程](#6.1 启动 repmgrd 守护进程)
- [6.2 故障转移逻辑](#6.2 故障转移逻辑)
- [6.3 演练自动 Failover](#6.3 演练自动 Failover)
- [七、Witness 节点(防脑裂)](#七、Witness 节点(防脑裂))
-
- [7.1 配置 witness(node3)](#7.1 配置 witness(node3))
- 八、常用管理命令
-
- [8.1 手动 Switchover(计划内切换)](#8.1 手动 Switchover(计划内切换))
- [8.2 节点重新加入](#8.2 节点重新加入)
- 九、日志与监控
- 十、最佳实践与注意事项
-
- [10.1 安全建议](#10.1 安全建议)
- [10.2 性能调优](#10.2 性能调优)
- [10.3 故障恢复](#10.3 故障恢复)
- [10.4 限制](#10.4 限制)
PostgreSQL 原生流复制提供了强大的数据同步能力,但缺乏对主备节点的集中管理、自动故障转移和拓扑维护功能。 repmgr (Replication Manager)是一个开源工具,专为简化 PostgreSQL 流复制集群的部署、监控和故障切换而设计。相比 Patroni,repmgr 更轻量、配置更直观,适合中小规模或对自动化要求适中的场景。
一、repmgr 概述
1.1 什么是 repmgr?
repmgr 是一套命令行工具和守护进程(repmgrd),用于:
- 自动注册主库与备库;
- 监控复制状态与延迟;
- 执行手动或自动故障转移(Failover);
- 支持级联复制、同步复制;
- 提供集群状态查询接口。
它通过在 PostgreSQL 中创建专用元数据表(repmgr schema)记录节点信息,并依赖 SSH 或本地命令执行操作。
1.2 架构特点
- 中心化元数据 :所有节点信息存储在主库的
repmgr数据库中; - 轻量级:无需 etcd/ZooKeeper 等外部协调服务;
- 两种模式 :
- 手动模式:仅提供 CLI 工具,DBA 手动执行切换;
- 自动模式 :运行
repmgrd守护进程,自动检测故障并切换;
- 支持版本:PostgreSQL 10+(推荐 12+)。
1.3 与 Patroni 对比
| 特性 | repmgr | Patroni |
|---|---|---|
| 外部依赖 | 无(仅需 PostgreSQL) | 需 etcd/Consul/ZooKeeper |
| 自动 Failover | 支持(通过 repmgrd) | 支持(更成熟) |
| 配置复杂度 | 较低 | 中等 |
| 脑裂防护 | 依赖 witness 或投票机制 | 依赖 DCS 锁 |
| 适用场景 | 中小规模、简单 HA | 大规模、云原生、K8s |
repmgr 更适合传统 IDC 环境或对架构简洁性有要求的团队。
二、环境规划
2.1 节点信息
| 主机名 | IP 地址 | 角色 | 说明 |
|---|---|---|---|
| node1 | 192.168.10.50 | Primary | 主库 |
| node2 | 192.168.10.51 | Standby | 备库 |
| node3 | 192.168.10.52 | Witness(可选) | 仲裁节点,防脑裂 |
操作系统:CentOS 7
PostgreSQL 版本:14
repmgr 版本:5.4(与 PG 14 兼容)
注意:所有节点时间必须同步(NTP),网络互通,SSH 免密登录(用于文件同步)。
三、安装 repmgr
3.1 安装 PostgreSQL(所有节点)
bash
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql14-server postgresql14-contrib
不要初始化数据库,repmgr 将协助完成。
3.2 安装 repmgr
官方提供 YUM 仓库:
bash
# 添加 repmgr 仓库
sudo yum install -y http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install -y https://repmgr.org/downloads/repmgr-5.4-1.el7.x86_64.rpm
验证安装:
bash
repmgr --version
# repmgr 5.4
四、配置主库(node1)
4.1 初始化数据库
bash
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
4.2 修改 postgresql.conf
编辑 /var/lib/pgsql/14/data/postgresql.conf:
conf
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
hot_standby = on
archive_mode = off
4.3 配置 pg_hba.conf
允许复制连接和 repmgr 访问:
conf
# TYPE DATABASE USER ADDRESS METHOD
host replication repmgr 192.168.10.0/24 trust
host repmgr repmgr 192.168.10.0/24 trust
host all all 192.168.10.0/24 md5
生产环境建议使用
md5或scram-sha-256替代trust。
4.4 创建 repmgr 用户和数据库
sql
CREATE USER repmgr WITH SUPERUSER LOGIN ENCRYPTED PASSWORD 'repmgr123';
CREATE DATABASE repmgr OWNER repmgr;
4.5 创建 repmgr 配置文件
创建 /etc/repmgr/14/repmgr.conf:
conf
node_id=1
node_name=node1
conninfo='host=192.168.10.50 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/14/data'
pg_bindir='/usr/pgsql-14/bin'
# 故障转移设置
failover=automatic
promote_command='/usr/pgsql-14/bin/repmgr standby promote -f /etc/repmgr/14/repmgr.conf --log-to-file'
follow_command='/usr/pgsql-14/bin/repmgr standby follow -f /etc/repmgr/14/repmgr.conf --log-to-file --upstream-node-id=%n'
# 日志
log_level=INFO
log_file='/var/log/repmgr/repmgr.log'
log_status_interval=10
4.6 注册主库
bash
sudo -u postgres repmgr -f /etc/repmgr/14/repmgr.conf primary register
验证:
bash
repmgr -f /etc/repmgr/14/repmgr.conf cluster show
输出应显示 node1 为 primary。
五、配置备库(node2)
5.1 清理数据目录(如有)
bash
sudo systemctl stop postgresql-14
sudo rm -rf /var/lib/pgsql/14/data/*
5.2 使用 repmgr 克隆主库
bash
sudo -u postgres repmgr -h 192.168.10.50 -U repmgr -d repmgr -f /etc/repmgr/14/repmgr.conf standby clone
该命令会:
- 通过
pg_basebackup从主库拉取数据; - 自动生成
standby.signal和postgresql.auto.conf; - 配置复制连接。
5.3 启动 PostgreSQL
bash
sudo systemctl start postgresql-14
5.4 配置 repmgr.conf(node2)
创建 /etc/repmgr/14/repmgr.conf:
conf
node_id=2
node_name=node2
conninfo='host=192.168.10.51 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/14/data'
pg_bindir='/usr/pgsql-14/bin'
# 与主库一致的 failover 设置
failover=automatic
promote_command='/usr/pgsql-14/bin/repmgr standby promote -f /etc/repmgr/14/repmgr.conf --log-to-file'
follow_command='/usr/pgsql-14/bin/repmgr standby follow -f /etc/repmgr/14/repmgr.conf --log-to-file --upstream-node-id=%n'
log_level=INFO
log_file='/var/log/repmgr/repmgr.log'
5.5 注册备库
bash
sudo -u postgres repmgr -f /etc/repmgr/14/repmgr.conf standby register
验证集群状态:
bash
repmgr -f /etc/repmgr/14/repmgr.conf cluster show
应显示:
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string
----+--------+---------+-----------+----------+----------+----------+----------+-------------------
1 | node1 | primary | * running | | default | 100 | 1 | host=192.168.10.50...
2 | node2 | standby | running | node1 | default | 100 | 1 | host=192.168.10.51...
六、配置自动故障转移(repmgrd)
6.1 启动 repmgrd 守护进程
在所有节点(包括主库)启动 repmgrd:
bash
sudo -u postgres repmgrd -f /etc/repmgr/14/repmgr.conf --daemonize
建议配置为 systemd 服务(见附录)。
6.2 故障转移逻辑
repmgrd每monitor_interval_secs(默认 2 秒)检查上游节点;- 若主库不可达,且满足以下条件,则触发 Failover:
- 备库可连接;
- 复制延迟在
replication_lag允许范围内; - (若有 witness)获得多数票。
6.3 演练自动 Failover
-
在 node1 上停止 PostgreSQL:
bashsudo systemctl stop postgresql-14 -
观察 node2 日志(
/var/log/repmgr/repmgr.log):[NOTICE] promoting standby to primary [NOTICE] STANDBY PROMOTE successful -
验证新主库:
bashrepmgr -f /etc/repmgr/14/repmgr.conf cluster show # node2 应变为 primary -
应用连接需切换至 node2(或通过 VIP/Haproxy)。
七、Witness 节点(防脑裂)
在双节点环境中,若网络分区,两个节点可能都认为对方宕机,导致双主(脑裂)。引入 witness 节点(只存元数据,不存数据)可解决此问题。
7.1 配置 witness(node3)
-
安装 PostgreSQL 和 repmgr(无需初始化数据目录);
-
创建空数据目录:
bashsudo mkdir -p /var/lib/pgsql/14/witness sudo chown postgres:postgres /var/lib/pgsql/14/witness -
配置
/etc/repmgr/14/repmgr.conf:confnode_id=3 node_name=node3 conninfo='host=192.168.10.52 user=repmgr dbname=repmgr connect_timeout=2' data_directory='/var/lib/pgsql/14/witness' pg_bindir='/usr/pgsql-14/bin' -
注册为 witness:
bashsudo -u postgres repmgr -f /etc/repmgr/14/repmgr.conf witness register --remote-user=postgres --remote-host=192.168.10.50
故障转移时,备库需能连接 witness 才能晋升,避免双主。
八、常用管理命令
| 命令 | 说明 |
|---|---|
repmgr cluster show |
显示集群拓扑 |
repmgr node status |
查看本节点状态 |
repmgr standby switchover |
手动主备切换(计划内) |
repmgr node rejoin |
故障节点恢复后重新加入 |
repmgr service status |
检查 repmgrd 运行状态 |
8.1 手动 Switchover(计划内切换)
bash
# 在当前主库执行
repmgr -f /etc/repmgr/14/repmgr.conf standby switchover --siblings-follow
- 原主库降级为备库;
- 指定备库晋升为主库;
- 其他备库自动 follow 新主。
8.2 节点重新加入
原主库修复后:
bash
# 在原主库执行
repmgr -f /etc/repmgr/14/repmgr.conf node rejoin --force-rewind
若启用 pg_rewind,repmgr 会自动使用(需 data_checksums)。
九、日志与监控
- 日志路径:
/var/log/repmgr/repmgr.log - 关键日志级别:
NOTICE、WARNING、ERROR - 监控指标:
- 复制延迟(
repmgr node status) - 节点存活状态
- repmgrd 是否运行
- 复制延迟(
可结合 Prometheus + Exporter 实现可视化告警。
十、最佳实践与注意事项
10.1 安全建议
- 禁用
trust认证,使用密码或证书; - 限制
repmgr用户权限(实际需 superuser,但可最小化网络暴露); - SSH 免密仅用于 repmgr 内部操作,限制 IP。
10.2 性能调优
- 合理设置
wal_keep_size防止 WAL 被清理; - 监控磁盘空间(WAL 积累);
- 设置
replication_lag阈值避免提升严重滞后的备库。
10.3 故障恢复
- 自动 Failover 后,务必检查数据一致性;
- 定期演练 Failover 和 Rejoin 流程;
- 备份策略不可替代(repmgr 不是备份工具)。
10.4 限制
- 不支持多主(Multi-Master);
- 自动 Failover 在复杂网络环境下可能误判;
- 无内置负载均衡,需配合 HAProxy。
总结:repmgr 以简洁、易用的方式解决了 PostgreSQL 流复制的管理痛点:
- 一键克隆 :
standby clone自动完成基础备份; - 集中注册 :
cluster show清晰展示拓扑; - 自动切换 :
repmgrd实现无人值守 Failover; - 灵活运维:支持 Switchover、Rejoin、Witness 等高级操作。
虽然在极端高可用场景下 Patroni 更受青睐,但 repmgr 凭借其轻量、低依赖、配置直观的优势,仍是许多团队构建 PostgreSQL 高可用集群的首选方案。