Skip to content

PostgreSQL repmgr使用

核心概念

repmgr简介

repmgr是PostgreSQL的复制管理工具,用于管理和监控PostgreSQL复制集群。它提供了以下核心功能:

  • 自动故障转移:当主库故障时自动将从库提升为主库
  • 复制监控:实时监控复制状态和延迟
  • 节点管理:管理复制集群中的节点
  • 切换管理:支持手动主从切换
  • 配置管理:集中管理复制集群配置

repmgr的主要组件

  1. repmgrd:守护进程,负责监控复制集群和执行自动故障转移
  2. repmgr命令行工具:用于执行各种管理操作
  3. repmgr库:存储集群配置和状态信息的数据库

repmgr的架构

repmgr采用主从架构,包括:

  • 主节点:负责处理所有写操作
  • 从节点:通过流复制从主节点同步数据
  • 见证节点(可选):用于避免脑裂问题

安装与配置

安装repmgr

在Debian/Ubuntu系统上安装

bash
# 添加PostgreSQL官方仓库
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pgdg.gpg

# 安装repmgr
sudo apt-get update
sudo apt-get install -y repmgr-15

在RHEL/CentOS系统上安装

bash
# 添加PostgreSQL官方仓库
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 安装repmgr
sudo yum install -y repmgr15

配置PostgreSQL

修改postgresql.conf

在所有节点上修改postgresql.conf,启用流复制和repmgr所需的配置:

ini
# 启用归档
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/15/archived_wal/%f'

# 启用流复制
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on

# repmgr所需配置
track_commit_timestamp = on
shared_preload_libraries = 'repmgr'

修改pg_hba.conf

在所有节点上修改pg_hba.conf,允许repmgr用户访问:

# 允许repmgr用户本地访问
local   repmgr          repmgr                                 trust
# 允许repmgr用户远程访问
host    repmgr          repmgr          0.0.0.0/0               md5
# 允许复制用户访问
host    replication     repmgr          0.0.0.0/0               md5

创建repmgr用户和数据库

在主节点上执行:

sql
-- 创建repmgr用户
CREATE USER repmgr WITH REPLICATION LOGIN PASSWORD 'repmgr_password';

-- 创建repmgr数据库
CREATE DATABASE repmgr OWNER repmgr;

配置repmgr

在所有节点上创建/etc/repmgr.conf配置文件:

ini
# 基本配置
node_id=1
node_name='node1'
conninfo='host=node1 port=5432 user=repmgr dbname=repmgr password=repmgr_password'

# 复制配置
data_directory='/var/lib/postgresql/15/main'
pg_bindir='/usr/lib/postgresql/15/bin'

# repmgrd配置
repmgrd_service_start_command='systemctl start repmgrd'
repmgrd_service_stop_command='systemctl stop repmgrd'
repmgrd_service_restart_command='systemctl restart repmgrd'
repmgrd_service_reload_command='systemctl reload repmgrd'

# 故障转移配置
failover='automatic'
failover_validation_command='/path/to/validate_script.sh'
promote_command='repmgr standby promote -f /etc/repmgr.conf'
follow_command='repmgr standby follow -f /etc/repmgr.conf --upstream-node-id=%n'

# 监控配置
monitor_interval_secs=2
reconnect_attempts=3
reconnect_interval=5

注意:每个节点的node_idnode_name必须唯一,conninfo中的host必须指向当前节点。

集群初始化

注册主节点

在主节点上执行:

bash
repmgr primary register -f /etc/repmgr.conf

初始化从节点

在从节点上执行:

bash
# 使用pg_basebackup创建基础备份
pg_basebackup -h node1 -U repmgr -D /var/lib/postgresql/15/main -Fp -Xs -P -R

# 注册从节点
repmgr standby register -f /etc/repmgr.conf

验证集群状态

在任意节点上执行:

bash
repmgr cluster show -f /etc/repmgr.conf

集群管理

添加新节点

  1. 按照上述步骤在新节点上安装和配置PostgreSQL和repmgr
  2. 使用pg_basebackup从主节点或现有从节点创建基础备份
  3. 注册新节点:
    bash
    repmgr standby register -f /etc/repmgr.conf

移除节点

在要移除的节点上执行:

bash
repmgr node unregister -f /etc/repmgr.conf

查看节点状态

bash
# 查看集群状态
repmgr cluster show -f /etc/repmgr.conf

# 查看节点详细信息
repmgr node show -f /etc/repmgr.conf --node-id=1

# 查看复制状态
repmgr replication status -f /etc/repmgr.conf

主从切换

手动切换

  1. 确保主库正常运行
  2. 在从库上执行切换命令:
    bash
    repmgr standby switchover -f /etc/repmgr.conf --siblings-follow

自动故障转移

  1. 确保repmgrd守护进程在所有节点上运行:

    bash
    sudo systemctl enable repmgrd
    sudo systemctl start repmgrd
  2. 当主库故障时,repmgrd会自动:

    • 检测到主库故障
    • 选择最合适的从库
    • 将该从库提升为主库
    • 命令其他从库跟随新主库
  3. 查看故障转移日志:

    bash
    tail -f /var/log/syslog | grep repmgrd

监控管理

查看复制状态

bash
repmgr replication status -f /etc/repmgr.conf

查看复制延迟

bash
repmgr standby lag -f /etc/repmgr.conf

检查集群健康状态

bash
repmgr cluster check -f /etc/repmgr.conf

配置监控告警

  1. 使用repmgrd的日志输出进行监控
  2. 配置syslog将repmgrd日志发送到监控系统
  3. 使用Prometheus + Grafana监控repmgr集群

配置repmgrd日志

修改repmgr.conf

ini
# 日志配置
log_level=INFO
log_file='/var/log/repmgrd.log'
log_status_interval=300

常见操作

重新同步从库

当从库与主库数据不一致时,可以重新同步:

bash
# 停止从库PostgreSQL服务
sudo systemctl stop postgresql@15-main

# 清空数据目录
sudo rm -rf /var/lib/postgresql/15/main/*

# 从主库重新创建基础备份
pg_basebackup -h node1 -U repmgr -D /var/lib/postgresql/15/main -Fp -Xs -P -R

# 启动PostgreSQL服务
sudo systemctl start postgresql@15-main

# 重新注册从库
repmgr standby register -f /etc/repmgr.conf --force

升级repmgr

  1. 停止所有节点上的repmgrd服务:

    bash
    sudo systemctl stop repmgrd
  2. 在所有节点上升级repmgr包

  3. 运行repmgr升级命令:

    bash
    repmgr upgrade -f /etc/repmgr.conf
  4. 重启repmgrd服务:

    bash
    sudo systemctl start repmgrd

最佳实践

生产环境配置建议

  1. 使用见证节点:在3节点或以上集群中使用见证节点,避免脑裂问题
  2. 配置合理的监控间隔:根据业务需求调整monitor_interval_secs参数
  3. 设置故障转移验证脚本:确保在故障转移前验证主库确实不可用
  4. 定期测试故障转移:每月至少测试一次自动故障转移功能
  5. 备份repmgr配置:定期备份repmgr.conf和repmgr数据库

性能优化

  1. 调整WAL保留策略:确保从库有足够的WAL文件进行恢复
  2. 优化复制参数:根据硬件配置调整max_wal_sendersmax_replication_slots等参数
  3. 使用高性能存储:为WAL目录使用高性能存储

安全性建议

  1. 使用强密码:为repmgr用户设置强密码
  2. 限制网络访问:在pg_hba.conf中限制repmgr和复制用户的访问IP
  3. 加密复制连接:使用SSL加密主从之间的复制连接
  4. 定期更新repmgr:及时应用安全补丁

常见问题(FAQ)

Q1:如何查看repmgrd是否正在运行?

A1:可以使用以下命令查看repmgrd的运行状态:

bash
# 查看服务状态
sudo systemctl status repmgrd

# 查看进程
sudo ps aux | grep repmgrd

Q2:repmgrd无法启动怎么办?

A2:可以按照以下步骤排查:

  1. 检查repmgr.conf配置是否正确
  2. 检查PostgreSQL是否正在运行
  3. 检查repmgr用户是否有足够的权限
  4. 查看repmgrd日志:tail -f /var/log/repmgrd.log

Q3:如何手动触发故障转移?

A3:可以使用以下命令手动触发故障转移:

bash
repmgr standby promote -f /etc/repmgr.conf

Q4:故障转移后如何将旧主库重新加入集群?

A4:可以按照以下步骤将旧主库重新加入集群:

  1. 修复旧主库的问题
  2. 将旧主库转换为从库:
    bash
    sudo systemctl stop postgresql@15-main
    sudo rm -rf /var/lib/postgresql/15/main/*
    pg_basebackup -h new_master -U repmgr -D /var/lib/postgresql/15/main -Fp -Xs -P -R
    sudo systemctl start postgresql@15-main
  3. 重新注册为从库:
    bash
    repmgr standby register -f /etc/repmgr.conf --force

Q5:如何配置repmgr使用SSL连接?

A5:可以在repmgr.conf中配置SSL连接:

ini
conninfo='host=node1 port=5432 user=repmgr dbname=repmgr password=repmgr_password sslmode=require'

同时,确保PostgreSQL已配置SSL支持。

Q6:repmgr支持PostgreSQL的哪些版本?

A6:repmgr支持PostgreSQL 9.3及以上版本,建议使用最新版本的repmgr和PostgreSQL以获得最佳性能和安全性。

Q7:如何迁移repmgr到新的主库?

A7:当执行主从切换或故障转移后,repmgr会自动将集群信息更新到新的主库,无需手动迁移。

Q8:如何监控repmgr的性能?

A8:可以使用以下方法监控repmgr的性能:

  1. 查看repmgrd日志中的性能指标
  2. 使用PostgreSQL的监控视图查看复制性能:
    sql
    SELECT * FROM pg_stat_replication;
    SELECT * FROM pg_stat_wal;
  3. 使用Prometheus + Grafana监控repmgr和PostgreSQL的性能指标