1 参考文档
repmgr 官方文档:repmgr 5.3dev Documentation
其他文档:Configure PostgreSQL Replication With Repmgr_qq_38461429的博客-CSDN博客
2 环境
主机名 | IP | OS | 角色 | 软件包 |
---|---|---|---|---|
pg1 | 192.168.44.131 | Centos 7 | primary | postgresql 11 and repmgr |
pg2 | 192.168.44.131 | Centos 7 | standby | postgresql 11 and repmgr |
pg3 | 192.168.44.135 | Centos 7 | standby | postgresql 11 and repmgr |
备注
以下安装方式均采用在线安装方式。
3 修改hosts
1 | 192.168.44.131 pg1 |
4 配置SSH免密登陆
1 | # 生产密钥 |
注意
后面postgresql安装后,也需要配置postgres用户的SSH免密登陆。
4 所有节点安装PG软件和postgis插件
1 | # Install the repository RPM: |
如果您希望repmgr复制位于 PostgreSQL 数据目录之外的配置文件和/或测试功能,您还需要在两个服务器之间建立无密码的 SSH 连接,并且应安装rsync。
5 所有节点安装repmgr
1 | # 安装源 |
6 primary节点配置
初始化数据库
1 | # Optionally initialize the database and enable automatic start: |
修改配置postgresql.conf
1 | # 在文件末尾添加如下配置 |
一般只需要在primary节点修改配置即可,我为了方便主从切换,其他从节点可能升级为主节点,就把从节点的配置同样进行了修改。
修改配置pg_hba.conf
1 | local replication repmgr trust |
创建repmgr用户和repmgr数据库
1 | # 切换到postgres用户执行,root用户执行报错 |
或者
1 | # 登陆数据库后执行相关创建 |
重启数据库
1 | systemctl restart postgresql-11 |
7 standby测试连接primary节点数据库
1 | [root@pg2 ~]# psql 'host=pg1 user=repmgr dbname=repmgr connect_timeout=2' |
注意
standby节点不要初始化数据库,不用启动数据库,保证/var/lib/pgsql/11/data/
目录为空
8 注册Primary节点
修改配置repmgr.conf
1 | [root@pg1 ~]# vim /etc/rempgr/11/rempgr.conf |
注册Primary节点
1 | [root@pg1 ~]# su postgres |
验证集群状态
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf cluster show |
查看repmgr数据表中的信息
1 | bash-4.2$ psql -U repmgr -d repmgr -h pg1 |
9 standby节点同步主节点数据
配置repmbr.conf
1 | node_id=2 |
使用--dry-run
选项检查可克隆待机状态
1 | bash-4.2$ repmgr -h pg1 -U repmgr -d repmgr -f /etc/repmgr/11/repmgr.conf standby clone --dry-run |
如果没有报告任何问题,则可以同步到备用节点
1 | bash-4.2$ repmgr -h pg1 -U repmgr -d repmgr -f /etc/repmgr/11/repmgr.conf standby clone |
连接到主节点数据库查询
这表明先前克隆备用( pg2
显示的字段 application_name
)连接到主要的IP地址 192.168.44.132
1 | [root@pg1 ~]# su - postgres -c "psql -U repmgr -d repmgr -h pg1" |
连接从节点数据库查询
1 | repmgr=# SELECT * FROM pg_stat_wal_receiver; |
10 注册standby
注册standby节点到集群
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf standby register |
检查集群状态
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf cluster show |
备注:standby节点默认为
只读模式
,切换为主节点后才能够写入数据。
主从集群配置完成,暂时只能手动切换
修改主节点的数据库数据,即可实时同步到从节点了。
11 主从切换(只适用于主从双节点)
备注
主从节点切换,只适用于主从双节点集群;3个以上节点集群执行切换命令后原主节点会自动宕掉,需要手动对其进行故障恢复。参考第 12章节故障转移。
11.1 场景
各节点正常运行情况下,手动切换主从节点。
手动switchover,切换主从节点,提升从节点为主,主节点自动变为从节点
11.2 操作
查看集群状态
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf cluster show |
在standby节点执行命令,升级为primary节点
1 | # repmgr standby switchover |
查看集群状态
可以看到standby节点已升级为primary节点,原primary节点自动降级为standby节点。
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf cluster show |
其他standby节点指向新的primary节点
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf standby follow |
12 故障转移,手动切换
12.1 场景
主节点宕机,升级从节点为primary,恢复原primary节点,并降级为standby.
12.2 操作
查看集群状态
1 | bash-4.2$ repmgr cluster show |
关闭主节点,模拟宕机
1 | systemctl stop postgresql-11.service |
查看集群状态
pg1 已经掉线
1 | bash-4.2$ repmgr cluster show |
手动提升 pg2 节点为 primary节点
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf standby promote |
查看集群状态
pg2 已经为primary节点
1 | bash-4.2$ repmgr cluster show |
集群其他standby节点重新指向新primary
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf standby follow |
将宕机primary节点,降级为standby节点
1 | # 清空宕机节点数据目录 |
查看集群状态
原宕机节点已经降级为standby节点。
1 | bash-4.2$ repmgr cluster show |
12.3 补充
主节点注销
1 | repmgr primary unregister -f /etc/repmgr/11/repmgr.conf --node-id=3 |
从节点注销
1 | repmgr standby unregister -f /etc/repmgr/11/repmgr.conf --node-id=3 |
13 故障自动转移
13.1 编辑sudoers文件
1 | vi /etc/sudoers |
备注:
修改sudoers文件是必须的,否则standby节点在自动切换接入新primary节点时候,会报错重启postgres命令失败。
原因:postgres用户采用sudo 命令执行postgresql数据重启操作的时候需要密码验证,没有权限。
13.2 配置postgresql.conf(所有节点)
在文件内添加如下内容,
1 | shared_preload_libraries = 'repmgr' |
13.3 配置repmgr.conf文件(所有节点)
1 | # 必须项 |
13.3 启动repmgr服务(所有节点)
1 | systemctl start repmgrd11.service |
启动完成后,可以在primary或者standby节点查询集群的events,如下:
1 | [root@pg3 .ssh]# su - postgres -c "repmgr cluster event --event=repmgrd_start" |
13.4 故障模拟测试
13.4.1停止pg1节点(primary)的postgresql服务
1 | systemctl stop postgresql-11.service |
查看集群状态,gp1节点状态变为unreachable
1 | bash-4.2$ repmgr cluster show |
1分钟后,再次查看集群状态,pg2升级为primary,gp3自动连接到pg2,作为主节点。
1 | bash-4.2$ repmgr cluster show |
13.4.2 旧primary节点恢复
当旧primary故障恢复后,并不会自动转换为standby,而是以primary角色独自运行,这时就需要将其重新加入到集群中。如下:
关闭postgresql服务
1 | bash-4.2$ repmgr node service --action=stop --checkpoint |
重新加入集群
1 | bash-4.2$ repmgr -f /etc/repmgr/11/repmgr.conf -d "host=pg2 user=repmgr dbname=repmgr" node rejoin --force-rewind |
查看集群状态
1 | bash-4.2$ repmgr cluster show |
到此,postgres高可用自动故障转移方案成功,配合VIP服务,可实现自动故障转移及服务高可用。
备注
如果不能重新加入,可以将旧primary强制(-F)转换为standby。或参考 13章节,手动清除,克隆,加入standby。
repmgr -h pg2 -U repmgr -d repmgr -f /etc/repmgr/11/repmgr.conf standby clone -F
systemctl start postgresql-12.service
repmgr -f /etc/repmgr/11/repmgr.conf standby register -F
问题汇总
错误1
从节点同步主节点时,报错连接失败
bash-4.2$ repmgr -h pg1 -U repmgr -d repmgr -f /etc/repmgr/11/repmgr.conf standby clone –dry-run
NOTICE: destination directory “/var/lib/pgsql/11/data” provided
INFO: connecting to source node
DETAIL: connection string is: host=pg1 user=repmgr dbname=repmgr
DETAIL: current installation size is 31 MB
INFO: “repmgr” extension is installed in database “repmgr”
INFO: replication slot usage not requested; no replication slot will be set up for this standby
INFO: parameter “max_wal_senders” set to 10
NOTICE: checking for available walsenders on the source node (2 required)
INFO: sufficient walsenders available on the source node
DETAIL: 2 required, 10 available
NOTICE: checking replication connections can be made to the source server (2 required)
ERROR: connection to database failed
DETAIL:
致命错误: 没有来自主机 “192.168.44.132”, 用户”repmgr”, SSL 关闭的复制连接的pg_hba.conf记录ERROR: connection to database failed
DETAIL:
致命错误: 没有来自主机 “192.168.44.132”, 用户”repmgr”, SSL 关闭的复制连接的pg_hba.conf记录ERROR: unable to establish necessary replication connections
HINT: check replication permissions on the source server
解决办法:
少加了 前三条授权,添加上后问题解决。
1 | local replication repmgr trust |
错误2
同样同步时错误
bash-4.2$ repmgr -h pg1 -U repmgr -d repmgr -f /etc/repmgr/11/repmgr.conf standby clone
NOTICE: destination directory “/var/lib/pgsql/11/data” provided
INFO: connecting to source node
DETAIL: connection string is: host=pg1 user=repmgr dbname=repmgr
DETAIL: current installation size is 31 MB
INFO: replication slot usage not requested; no replication slot will be set up for this standby
NOTICE: checking for available walsenders on the source node (2 required)
NOTICE: checking replication connections can be made to the source server (2 required)
WARNING: data checksums are not enabled and “wal_log_hints” is “off”
DETAIL: pg_rewind requires “wal_log_hints” to be enabled
INFO: checking and correcting permissions on existing directory “/var/lib/pgsql/11/data”
NOTICE: starting backup (using pg_basebackup)…
HINT: this may take some time; consider using the -c/–fast-checkpoint option
INFO: executing:
pg_basebackup -l “repmgr base backup” -D /var/lib/pgsql/11/data -h pg1 -p 5432 -U repmgr -X stream
pg_basebackup: 无法得到来自服务器的预写日志终止位置: 错误: 无法打开文件 “./postgresql.conf.bak”: 权限不够
pg_basebackup: 删除数据目录 “/var/lib/pgsql/11/data” 的内容
ERROR: unable to take a base backup of the source server
HINT: data directory (“/var/lib/pgsql/11/data”) may need to be cleaned up manually
原因:
1 数据库数据目录下存在非postgres用户权限的文件,postgresql.conf.bak权限是root权限,授权为postgres用户权限即可
2 从节点的数据目录要保证为空。
错误3
1 | # repmgr standby switchover 命令 |
解决办法:
创建postgres 用户免密SSH登陆。
错误4
1 | bash-4.2$ repmgr standby switchover |
解决办法:
修改repmgr.conf
配置文件,增加 pg_bindir
参数,设置postgresql的bin
路径。
1 | pg_bindir='/usr/pgsql-11/bin' |
错误5
standby升级为primary节点后,其他低权重的standby连接新primary使出现postgresql重启错误。
1 | [2021-08-17 14:24:08] [INFO] local node 3 can attach to follow target node 2 |
解决办法:配置postgres用户sudo命令免输入密码
1 | vi /etc/sudoers |