作者:杭州美创科技有限公司
repmgr是一个开源工具套件,用于管理PostgreSQL服务器集群中的复制和故障转移。它通过设置备用服务器、监控复制和执行管理任务(例如故障转移或手动切换操作)的工具增强了PostgreSQL的内置热备用功能。
PostgreSQL在9.0后引入了流复制架构,并且支持hot standby特性,并且在往后的几个版本中不断完善和增强流复制架构,repmgr为PostgreSQL的流复制机制提供了高级支持,因为它们是在9.0中引入的。当前的repmgr系列,repmgr 5,支持从PostgreSQL 9.3引入的复制功能的最新发展,例如级联复制、时间线切换和通过复制协议进行的基本备份。
repmgr作为一个开源工具,旨在用于灵活、便捷地管理PostgreSQL集群。
我们从
https://dl.2ndquadrant.com/中找到对应PostgreSQL版本的RPM存储库,下载并安装,这里我们以PostgreSQL 11为例。
curl https://dl.2ndquadrant.com/default/release/get/11/rpm | sudo bash
验证存储库是否已安装sudo yum repolist,输出应该包含以下两个条目。
2ndquadrant-dl-default-release-pg11/7/x86_64 2ndQuadrant packages (PG11) for 7 - x86_64 182ndquadrant-dl-default-release-pg11-debug/7/x86_64 2ndQuadrant packages (PG11) for 7 - x86_64 - Debug 8
使用yum安装对应PostgreSQL版本的repmgr版本。
sudo yum install repmgr11
当然地,我们需要在两台服务器上都安装PostgreSQL软件和repmgr软件,都完成安装后,开始配置PostgreSQL。
配置postgresql.conf文件,添加或修改以下选项。
max_wal_senders = 10max_replication_slots = 10wal_level = 'hot_standby'hot_standby = onarchive_mode = onarchive_command = '/bin/true'
启动数据库,在数据库中创建repmgr用户和repmgr数据库,并进入该数据库创建repmgr模式,将模式添加到search path中。
ALTER USER repmgr SET search_path TO repmgr, "$user", public;
配置ph_hba.conf白名单文件,允许repmgr有连接访问和复制的权限。
local replication repmgr trusthost replication repmgr 127.0.0.1/32 trusthost replication repmgr 192.168.22.129/24 trustlocal repmgr repmgr trusthost repmgr repmgr 127.0.0.1/32 trusthost repmgr repmgr 192.168.22.129/24 trust
测试一下从节点端能否连通主节点。
psql 'host=192.168.22.128 user=repmgr dbname=repmgr connect_timeout=2'
接下来配置repmgr,在/etc/目录下编辑repmgr.conf,添加以下。
node_id=1node_name='node1'conninfo='host=192.168.22.128 user=repmgr dbname=repmgr password=repmgr connect_timeout=2'data_directory='/pgdata/data/' #对应的PG数据目录
注册主节点服务。
$ repmgr -f /etc/repmgr.conf primary registerINFO: connecting to primary database...NOTICE: attempting to install extension "repmgr"NOTICE: "repmgr" extension successfully installedNOTICE: primary node record (id: 1) registered
注册好后,我们来查看一下集群状态。
$ repmgr -f /etc/repmgr.conf cluster showID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string ----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------------------------------- 1 | node1 | primary | * running | | default | 100 | 1 | host=192.168.22.128 user=repmgr dbname=repmgr password=repmgr connect_timeout=2
可以看到已经有主节点注册进来了,紧接着在备端服务器上注册从节点服务。在备端/etc/目录下编辑repmgr.conf,添加以下。
vi /etc/repmgr.confnode_id=2node_name='node2'conninfo='host=192.168.22.129 user=repmgr dbname=repmgr password=repmgr connect_timeout=2'data_directory='/pgdata/dataano' #选择一个空目录,否则会覆盖原有数据目录
使用--dry-run参数尝试克隆备用服务器。
repmgr -h 192.168.22.128 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --dry-runNOTICE: destination directory "/pgdata/dataano" providedINFO: connecting to source nodeDETAIL: connection string is: host=192.168.22.128 user=repmgr dbname=repmgrDETAIL: current installation size is 31 MBINFO: "repmgr" extension is installed in database "repmgr"INFO: replication slot usage not requested; no replication slot will be set up for this standbyINFO: parameter "max_wal_senders" set to 10NOTICE: checking for available walsenders on the source node (2 required)INFO: sufficient walsenders available on the source nodeDETAIL: 2 required, 10 availableNOTICE: checking replication connections can be made to the source server (2 required)INFO: required number of replication connections could be made to the source serverDETAIL: 2 replication connections requiredNOTICE: standby will attach to upstream node 1HINT: consider using the -c/--fast-checkpoint optionINFO: all prerequisites for "standby clone" are met
没有问题,去掉--dry-run参数再执行命令。
repmgr -h 192.168.22.128 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone
好了,备服务器成功搭建,我们直接启动服务。
$ pg_ctl -D $PGDATA start
服务启动以后,我们去主节点查看是否建立了流复制模式,可以看到主备已经处于同步状态。
我们可以手动的使用repmgr进行主备切换,我们在备节点执行,使得备节点切换成为主节点。
$ repmgr standby switchover -f /etc/repmgr.conf --siblings-follow…NOTICE: executing STANDBY FOLLOW on 1 of 1 siblingsINFO: STANDBY FOLLOW successfully executed on all reachable sibling nodesNOTICE: switchover was successfulDETAIL: node "192.168.22.129" is now primary and node "192.168.22.128" is attached as standbyNOTICE: STANDBY SWITCHOVER has completed successfully
查看集群切换状态。
$ repmgr -f /etc/repmgr.conf cluster showID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string ----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------------------------------- 1 | node1 | standby | * running | | default | 100 | 1 | host=192.168.22.128 user=repmgr dbname=repmgr password=repmgr connect_timeout=22 | node2 | primary | * running | | default | 100 | 1 | host=192.168.22.128 user=repmgr dbname=repmgr password=repmgr connect_timeout=2
PostgreSQL的高可用方案,基本上没有原生的,大多依靠第三方的工具来实现,repmgr来自第二象限公司,其产品的稳定性和支持度也是不错的,非常适合被考虑用来做生产上的高可用方案。