外观
PostgreSQL repmgr使用
核心概念
repmgr简介
repmgr是PostgreSQL的复制管理工具,用于管理和监控PostgreSQL复制集群。它提供了以下核心功能:
- 自动故障转移:当主库故障时自动将从库提升为主库
- 复制监控:实时监控复制状态和延迟
- 节点管理:管理复制集群中的节点
- 切换管理:支持手动主从切换
- 配置管理:集中管理复制集群配置
repmgr的主要组件
- repmgrd:守护进程,负责监控复制集群和执行自动故障转移
- repmgr命令行工具:用于执行各种管理操作
- 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_id和node_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集群管理
添加新节点
- 按照上述步骤在新节点上安装和配置PostgreSQL和repmgr
- 使用pg_basebackup从主节点或现有从节点创建基础备份
- 注册新节点: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主从切换
手动切换
- 确保主库正常运行
- 在从库上执行切换命令:bash
repmgr standby switchover -f /etc/repmgr.conf --siblings-follow
自动故障转移
确保
repmgrd守护进程在所有节点上运行:bashsudo systemctl enable repmgrd sudo systemctl start repmgrd当主库故障时,
repmgrd会自动:- 检测到主库故障
- 选择最合适的从库
- 将该从库提升为主库
- 命令其他从库跟随新主库
查看故障转移日志:
bashtail -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配置监控告警
- 使用
repmgrd的日志输出进行监控 - 配置syslog将repmgrd日志发送到监控系统
- 使用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
停止所有节点上的
repmgrd服务:bashsudo systemctl stop repmgrd在所有节点上升级repmgr包
运行repmgr升级命令:
bashrepmgr upgrade -f /etc/repmgr.conf重启
repmgrd服务:bashsudo systemctl start repmgrd
最佳实践
生产环境配置建议
- 使用见证节点:在3节点或以上集群中使用见证节点,避免脑裂问题
- 配置合理的监控间隔:根据业务需求调整
monitor_interval_secs参数 - 设置故障转移验证脚本:确保在故障转移前验证主库确实不可用
- 定期测试故障转移:每月至少测试一次自动故障转移功能
- 备份repmgr配置:定期备份
repmgr.conf和repmgr数据库
性能优化
- 调整WAL保留策略:确保从库有足够的WAL文件进行恢复
- 优化复制参数:根据硬件配置调整
max_wal_senders、max_replication_slots等参数 - 使用高性能存储:为WAL目录使用高性能存储
安全性建议
- 使用强密码:为repmgr用户设置强密码
- 限制网络访问:在pg_hba.conf中限制repmgr和复制用户的访问IP
- 加密复制连接:使用SSL加密主从之间的复制连接
- 定期更新repmgr:及时应用安全补丁
常见问题(FAQ)
Q1:如何查看repmgrd是否正在运行?
A1:可以使用以下命令查看repmgrd的运行状态:
bash
# 查看服务状态
sudo systemctl status repmgrd
# 查看进程
sudo ps aux | grep repmgrdQ2:repmgrd无法启动怎么办?
A2:可以按照以下步骤排查:
- 检查repmgr.conf配置是否正确
- 检查PostgreSQL是否正在运行
- 检查repmgr用户是否有足够的权限
- 查看repmgrd日志:
tail -f /var/log/repmgrd.log
Q3:如何手动触发故障转移?
A3:可以使用以下命令手动触发故障转移:
bash
repmgr standby promote -f /etc/repmgr.confQ4:故障转移后如何将旧主库重新加入集群?
A4:可以按照以下步骤将旧主库重新加入集群:
- 修复旧主库的问题
- 将旧主库转换为从库: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 - 重新注册为从库: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的性能:
- 查看repmgrd日志中的性能指标
- 使用PostgreSQL的监控视图查看复制性能:sql
SELECT * FROM pg_stat_replication; SELECT * FROM pg_stat_wal; - 使用Prometheus + Grafana监控repmgr和PostgreSQL的性能指标
