PostgreSQL:Repmgr 管理工具,流复制的简易管理方案

文章目录

    • [一、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

生产环境建议使用 md5scram-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.signalpostgresql.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 故障转移逻辑

  • repmgrdmonitor_interval_secs(默认 2 秒)检查上游节点;
  • 若主库不可达,且满足以下条件,则触发 Failover:
    • 备库可连接;
    • 复制延迟在 replication_lag 允许范围内;
    • (若有 witness)获得多数票。

6.3 演练自动 Failover

  1. 在 node1 上停止 PostgreSQL:

    bash 复制代码
    sudo systemctl stop postgresql-14
  2. 观察 node2 日志(/var/log/repmgr/repmgr.log):

    复制代码
    [NOTICE] promoting standby to primary
    [NOTICE] STANDBY PROMOTE successful
  3. 验证新主库:

    bash 复制代码
    repmgr -f /etc/repmgr/14/repmgr.conf cluster show
    # node2 应变为 primary
  4. 应用连接需切换至 node2(或通过 VIP/Haproxy)。


七、Witness 节点(防脑裂)

在双节点环境中,若网络分区,两个节点可能都认为对方宕机,导致双主(脑裂)。引入 witness 节点(只存元数据,不存数据)可解决此问题。

7.1 配置 witness(node3)

  1. 安装 PostgreSQL 和 repmgr(无需初始化数据目录);

  2. 创建空数据目录:

    bash 复制代码
    sudo mkdir -p /var/lib/pgsql/14/witness
    sudo chown postgres:postgres /var/lib/pgsql/14/witness
  3. 配置 /etc/repmgr/14/repmgr.conf

    conf 复制代码
    node_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'
  4. 注册为 witness:

    bash 复制代码
    sudo -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
  • 关键日志级别:NOTICEWARNINGERROR
  • 监控指标:
    • 复制延迟(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 高可用集群的首选方案。

相关推荐
悟空聊架构4 小时前
基于KaiwuDB在游乐场“刷卡+投币”双模消费系统中的落地实践
数据库·后端·架构
IvorySQL4 小时前
PostgreSQL 技术日报 (3月4日)|硬核干货 + 内核暗流一网打尽
数据库·postgresql·开源
进击的丸子7 小时前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
NineData1 天前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL1 天前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
ma_king1 天前
入门 java 和 数据库
java·数据库·后端
jiayou641 天前
KingbaseES 实战:审计追踪配置与运维实践
数据库
NineData2 天前
NineData 迁移评估功能正式上线
数据库·dba
NineData2 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师2 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql