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 高可用集群的首选方案。

相关推荐
小高不会迪斯科8 小时前
CMU 15445学习心得(二) 内存管理及数据移动--数据库系统如何玩转内存
数据库·oracle
e***8908 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
l1t8 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
失忆爆表症10 小时前
03_数据库配置指南:PostgreSQL 17 + pgvector 向量存储
数据库·postgresql
AI_567810 小时前
Excel数据透视表提速:Power Query预处理百万数据
数据库·excel
SQL必知必会11 小时前
SQL 窗口帧:ROWS vs RANGE 深度解析
数据库·sql·性能优化
Gauss松鼠会11 小时前
【GaussDB】GaussDB数据库开发设计之JDBC高可用性
数据库·数据库开发·gaussdb
+VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
识君啊12 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端
一个天蝎座 白勺 程序猿12 小时前
破译JSON密码:KingbaseES全场景JSON数据处理实战指南
数据库·sql·json·kingbasees·金仓数据库