(文档)第127讲:pg流复制管理利器repmgr应用实践


一、repmgr简介
repmgr由EDB开发并开源的应用软件,并且其他个人和组织也有贡献。多个EDB客户提供资金,使repmgr持续开发成为可能。repmgr完全由EDB的24/7小时提供支持。EDB是PostgreSQL项目的主要赞助商,继续维护repmgr。同时也欢迎其他组织和个人开发者的参与。
repmgr是款轻量型的功能全面的应用软件,可以监视主从流复制过程,自动故障切换和手动故障切换、支持分布式管理集群节点,易扩展,可以在线增加或者删除节点等等。目前有很多国产数据库厂商选择repmgr做为数据库流复制的管理工具。
二、repmgr常见术语
• 复制群集
在repmgr中,“复制集群”是指通过流式复制连接的PostgreSQL服务器网络
• 节点
节点是复制集群中的单个PostgreSQL服务器
• 上游节点
备用服务器连接到的节点,以便接收流式复制。可能是主服务器,或者在级联复制的情况下,是另一个备用服务器
• 故障转移
这是在主服务器发生故障并将适当的备用服务器升级为新主服务器时发生的操作。repmgrd守护程序支持自动故障切换,以最大限度地减少停机时间
• 切换
在某些情况下,如硬件或操作系统维护,有必要使主服务器脱机;在这种情况下,需要受控切换,从而以受控的方式提升适当的备用,并从复制集群中删除现有的主设备。repmgr命令行客户端提供了此功能
• 隔离
在故障转移情况下,在升级新的备用之后,前一个主节点不能意外地恢复在线,这将导致裂脑情况。为了防止这种情况,应将故障的主设备与应用程序隔离
• 见证服务器
repmgr提供了设置所谓的“见证服务器”的功能,以帮助在具有多个备用的故障转移情况下确定新的主服务器。见证服务器本身不是复制集群的一部分,尽管它确实包含repmgr元数据架构的副本。见证服务器的目的是提供“决定性投票”,其中复制集群中的服务器被拆分到多个位置。如果位置之间的连接丢失,见证服务器的存在或不存在将决定该位置的服务器是否升级为主服务器;这是为了防止“大脑分裂”的情况,其中隔离的位置将网络中断解释为(远程)主设备的故障,并促进(本地)备用。只有在使用repmgrd时才需要创建见证服务器
repmgr结构

repmgr组件
repmg
用于执行管理任务的命令行工具,例如:
设置备用服务器
将备用服务器升级为主服务器
切换主服务器和备用服务器
显示复制群集中服务器的状态
repmgrd
主动监视复制群集中的服务器并执行以下任务的守护程序:
监视和记录复制性能
通过检测主服务器的故障并升级最合适的备用服务器来执行故障转移
向用户定义的脚本提供关于群集中事件的通知,该脚本可以执行任务,如通过电子邮件发送警报
三、repmgr用户和元数据
为了有效地管理复制集群,repmgr需要将集群中服务器的信息存储在专用数据库模式中。此架构由repmgr扩展自动创建,该扩展在初始化repmgr管理的集群(repmgr primary register)的第一步期间安装,并包含以下对象:

repmgr元数据模式可以存储在现有数据库或其自己的专用数据库中。请注意,repmgr元数据架构不能驻留在不属于repmgr管理的复制集群的数据库服务器上。数据库用户必须可供repmgr访问此数据库并执行必要的更改。该用户不需要是超级用户,但一些操作(如repmgr扩展的初始安装)将需要超级用户连接(这可以在需要时使用命令行选项–superuser指定)。
四、repmgr配置文件简介
repmgr和repmgrd使用一个公共配置文件,默认情况下称为repmgr.conf(尽管如果明确指定,可以使用任何名称)。repmgr.conf必须包含许多必需的参数,包括本地节点的数据库连接字符串及其数据目录的位置;如果未显式提供,则将从默认值中推断其他值。
repmgr配置文件格式
• repmgr.conf是一个纯文本文件,每行有一个参数/值组合
• 空白不重要(除非在引用的参数值内),空白行被忽略。哈希标记(#)将行的其余部分指定为注释。不是简单标识符或数字的参数值应该是单引号
• 要在参数值中嵌入单个引号,请编写两个引号(首选)或反斜杠引号
repmgr配置文件章节
配置文件包含以下章节:
• 所需的配置文件设置
• 可选配置文件设置
• 日志设置
• 服务命令设置
所需的配置文件设置:
node_id=1
node_name=’pg-xc1′
conninfo=’host=pg-xc1 user=repmgr dbname=repmgr connect_timeout=2′
data_directory=’/usr/local/pg17.0/data’
pg_bindir=’/usr/local/pg17.0/bin’
可选的配置文件设置:
config_directory:如果PostgreSQL配置文件位于数据目录之外,请指定主PostgreSQL.conf文件所在的目录
replication_user:与建立复制连接的PostgreSQL用户。如果未设置默认值,则为conninfo中定义的用户
replication_type:必须是物理的(默认)
location:定义节点位置的任意字符串;这在故障转移期间用于检查当前主节点的可见性
use_replication_slots :是否使用物理复制槽
日志的配置文件设置:
log_level (string):DEBUG、INFO、NOTICE、WARNING、ERROR、ALERT、CRIT或EMERG之一。默认值为INFO。请注意,DEBUG将产生大量日志输出,在正常使用中不应启用
log_facility (string):日志格式:可能的值为STDERR(默认),或者对于syslog集成,为LOCAL0、LOCAL1…、。。。,本地7,用户
log_file (string):如果log_facility设置为STDERR,则可以将日志输出重定向到指定的文件
log_status_interval (integer):此设置使repmgrd以指定的间隔(以秒为单位,默认为300)发出状态日志行,描述repmgrd的当前状态
服务命令的配置文件设置一:
service_start_command=’/usr/local/pg17.0/bin/pg_ctl -D /usr/local/pg17.0/data start‘
service_stop_command=’/usr/local/pg17.0/bin/pg_ctl -D /usr/local/pg17.0/data -mf‘
service_restart_command=’/usr/local/pg17.0/bin/pg_ctl -D /usr/local/pg17.0/data restart‘
service_reload_command=’/usr/local/pg17.0/bin/pg_ctl -D /usr/local/pg17.0/data reload‘
repmgrd_service_start_command=’sudo systemctl start repmgr‘
repmgrd_service_stop_command=’sudo systemctl stop repmgr’
服务命令的配置文件设置二:
# failover设置
failover=’automatic’
promote_command=’/usr/local/pg17.0/bin/repmgr standby promote -f /home/postgres/conf/repmgr.conf ‘
follow_command=’/usr/local/pg17.0/bin/repmgr standby follow -f /home/postgres/conf/repmgr.conf –upstream-node-id=%n’
五、Repmgr部署实践
repmgr安装方式
• 软件包安装
• 源代码安装
• 源代码安装:
下载地址:git clone https://github.com/EnterpriseDB/repmgr
• 安装步骤(PG用户):
cd repmgr-5.5.0/
./configure
make && make install
repmgr配置文件
主节点配置文件示例:
node_id=1
node_name=’pg-xc1′
conninfo=’host=pg-xc1 user=repmgr dbname=repmgr connect_timeout=2′
data_directory=’/usr/local/pg17.0/data’
pg_bindir=’/usr/local/pg17.0/bin’
log_level=INFO
log_file=’/home/postgres/conf/repmgr.log’
node_id=2
node_name=’pg-xc2′
conninfo=’host=pg-xc2 user=repmgr dbname=repmgr connect_timeout=2′
data_directory=’/usr/local/pg17.0/data’
pg_bindir=’/usr/local/pg17.0/bin’
log_level=INFO
log_file=’/home/postgres/conf/repmgr.log’
主库配置
postgresql.conf:
listen_addresses = ‘*’
wal_level = ‘replica’
archive_command = ‘cp %p /home/postgres/archive/%f’
shared_preload_libraries =’repmgr’
wal_log_hints=on
pg_hba.conf:
host repmgr repmgr 192.168.19.0/24 trust
#必须设置,否则下一步无法克隆和切换
host replication repmgr 192.168.19.112/32 trust
host replication repmgr 192.168.19.111/32 trust
创建用户:
create user repmgr WITH REPLICATION LOGIN ENCRYPTED PASSWORD ‘repmgr’ superuser;
create database repmgr owner repmgr;
主节点注册
repmgr -f /home/postgres/conf/repmgr.conf primary register
注册操作包含安装repmgr 扩展和创建元数据对象,并添加主服务器的元数据记录。
验证集群状态:
repmgr -f /home/postgres/conf/repmgr.conf cluster show
备库克隆
在备节点执行,用此方式比手动搭建更加简单,会自动添加备库的相关参数
repmgr -h pg-xc1 -U repmgr -d repmgr -f /home/postgres/conf/repmgr.conf standby clone
备节点注册(备库要先启动):
repmgr -f /home/postgres/conf/repmgr.conf standby register
注册操作包含安装repmgr 扩展和创建元数据对象,并添加主服务器的元数据记录。
验证集群状态:
repmgr -f /home/postgres/conf/repmgr.conf cluster show
配置节点信任关系
• 为了支持节点手动和自动切换,需要配置主备节点之间的信任关系
1、分别在主备节点上使用postgres用户执行ssh-keygen 创建公钥和密钥
ssh-keygen -t rsa
2、用 ssh-copy-id 把公钥复制到对端主机上
ssh-copy-id -i /home/postgres/.ssh/id_rsa.pub postgres@192.168.19.111
ssh-copy-id -i /home/postgres/.ssh/id_rsa.pub postgres@192.168.19.112
3、主备节点相互验证
ssh 192.168.19.111
ssh 192.168.19.112
主备库切换
• 切换时需要在主备节点的PG用户的配置文件添加环境变量(~/.bashrc)
export PG_HOME=/usr/local/pg17.0
export PGDATA=$PG_HOME/data
export PGPORT=1536
export PATH=$PG_HOME/bin:$PATH:.
• 在备节点执行以下切换命令
repmgr -f /home/postgres/conf/repmgr.conf standby switchover -U repmgr –verbose
• 查看机器状态
• repmgr service status -f /home/postgres/conf/repmgr.conf –verbose

主备库自动切换配置
在主备节点的配置文件repmgr.conf添加以下内容:
failover=’automatic ‘
promote_command=’/usr/local/pg17.0/bin/repmgr standby promote -f /home/postgres/conf/repmgr.conf ‘
follow_command=’/usr/local/pg17.0/bin/repmgr standby follow -f /home/postgres/conf/repmgr.conf ‘
• 主备节点重新注册
主节点注册:
repmgr -f /home/postgres/conf/repmgr.conf primary register -F
备节点注册:
repmgr -f /home/postgres/conf/repmgr.conf standby register -F
启动repmgrd守护进程
启动守护进程方式:
• 如果是使用系统软件包安装的repmgr则可以使用repmgr daemon start调用systemctl命令启动repmgrd进程
• 如果是源代码安装,则可以使用命令手动启动repmgrd守护进程
手动启动repmgrd:
repmgrd -f /home/postgres/conf/repmgr.conf

自动切换实践
把主节点的进程给kill掉,或者正常关闭,都会导致自动切换。
查看集群状态:
repmgr service status -f /home/postgres/conf/repmgr.conf –verbose

!!出现双主现象。
• 双主问题原因
在部署集群时使用了默认参数recovery=standby,此参数表示仅恢复备库,集群中备库故障后能够进行自动恢复,保持集群状态正常。但是如果主库故障后,仅支持备库升主,但为了保证数据不丢失,原主库不会自动进行恢复。
• 解决办法
关闭原主库后执行下面命令:
repmgr node rejoin -Urepmgr -drepmgr -p1536 -h192.168.19.112 -f conf/repmgr.conf –force-rewind
见证服务器(witness)简介
见证服务器是普通的PostgreSQL实例,它不是流式复制集群的一部分;其目的是,如果发生故障转移情况,则提供不可用的主服务器本身的证据,而不是例如在不同物理位置之间的网络拆分。
见证服务器的典型用例是两节点流式复制设置,其中主服务器和备用服务器位于不同的位置(数据中心)。通过在与主服务器相同的位置(数据中心)创建见证服务器,如果主服务器变得不可用,则备用服务器可以决定是否可以在不冒“大脑分裂”风险的情况下自我升级:如果它看不到见证服务器或主服务器,则很可能存在网络级中断,它不应该自我升级。如果它可以看到见证,但不能看到主节点,这证明没有网络中断,并且主节点本身不可用,因此它可以自我提升(理想情况下,采取行动来隔离前主节点)。
Witness工作原理

Witness搭建
1、选择第三台服务器当作见证服务器,不能部署在主备节点上
2、pg实例配置文件中加上shared_preload_libraries=repmgr
3、创建repmgr用户和数据库
create user repmgr WITH REPLICATION LOGIN ENCRYPTED PASSWORD ‘repmgr’ superuser;
create database repmgr owner repmgr;
4、配置pg_hba.conf
host repmgr repmgr 0.0.0.0/0 trust
5、配置repmgr.conf文件
node_id=3
node_name=’pg-xc3′
conninfo=’host=pg-xc3 user=repmgr dbname=repmgr connect_timeout=2′
data_directory=’/usr/local/pg17.0/data’
pg_bindir=’/usr/local/pg17.0/bin’
log_level=INFO
log_file=’/home/postgres/conf/log.repmgr’
6、注册见证服务器,-h指定当前的主库主机
repmgr -f conf/repmgr.conf witness register -h pg-xc2 -d repmgr
7、启动守护进程
repmgrd -f /home/postgres/conf/repmgr.conf
8、查看集群状态
repmgr -f conf/repmgr.conf service status –verbose


PostgreSQL中文社区认证
CUUG与工信部人才交流中心合作,推出PostgreSQL初/中/高级证书培训考证服务,证书中明确指定适用于信息技术应用创新人才岗位能力评定要求。

PostgreSQL从入门到精通,
系列课程始于23年初,
在周日19:30与大家分享PG技术,
从基础的PG介绍与安装,
到后续的调优、流复制等企业应用,
涉及90多个知识点的介绍与演示,
截至25年8月9日,
系列课程已讲100期,
欢迎继续关注PostgreSQL技术大讲堂,
如果你也有意学习PostgreSQL,
可以联系客服,领取相关资料。

官宣|北京神脑资讯技术有限公司续签腾讯云知伙伴 2026 授权,云智同行再启新程!
夜雨聆风