repmgr是PGSQL比较常用的一个高可用插件了,主要是部署简单,管理方便,并且对数据库本身的侵入也是比较小的。目前和Patroni以及pgpool-II算是比较主流的高可用方式,下面我们来看看如何使用它。
repmgr官网:https://www.repmgr.org/
环境介绍
角色 | IP | 组件 |
---|---|---|
Leader | 172.22.138.220 | postgresql v14、repmgr v5.3.3 |
standby1 | 172.22.138.219 | postgresql v14、repmgr v5.3.3 |
standby2 | 172.22.138.218 | postgresql v14、repmgr v5.3.3 |
repmgr与postgresql兼容版本
环境准备
搭建repmgr高可用架构,需要先部署好postgresql,无需部署流复制,因为流复制需要通过repmgr进行搭建。所以需要先在三个节点创建出postgresql实例。如果不知道如何搭建postgresql,可以查看我另外一篇文章,这里不再做搭建postgresql的操作。
https://blog.csdn.net/h_3369/article/details/141358564?spm=1001.2014.3001.5501
1.创建相关目录,并安装依赖包(所有节点执行)
root # mkdir /data/repmgr -p
root # chown -R postgres. /data/repmgr
root # yum check-update
root # yum install -y yum-utils openjade docbook-dtds docbook-style-dsssl docbook-style-xsl
root # yum install -y cmake make gcc zlib gcc-c++ perl readline readline-devel zlib
root # yum -y install yum-builddep flex libselinux-devel libxml2-devel libxslt-devel openssl-devel pam-devel readline-devel
2.通过官网下载repmgr源码包,并进行解压(所有节点执行)
root # cd /opt
root # wget https://www.repmgr.org/download/repmgr-5.3.3.tar.gz
root # tar xf repmgr-5.3.3.tar.gz
3.使用postgres用户编译安装repmgr(所有节点执行)
root # chown -R postgres. /opt/repmgr-5.3.3
root # su - postgres
postgres # cd /opt/repmgr-5.3.3
postgres # ./configure
postgres # make && make install
#默认会安装到pgsql的bin目录下,安装完成后使用以下命令查看是否安装成功
postgres #repmgr --help
repmgr: replication management tool for PostgreSQL
Usage:
repmgr [OPTIONS] primary {register|unregister}
repmgr [OPTIONS] standby {register|unregister|clone|promote|follow|switchover}
repmgr [OPTIONS] node {status|check|rejoin|service}
repmgr [OPTIONS] cluster {show|event|matrix|crosscheck|cleanup}
repmgr [OPTIONS] witness {register|unregister}
repmgr [OPTIONS] service {status|pause|unpause}
repmgr [OPTIONS] daemon {start|stop}
...
4.配置postgres用户的互信,三台节点相互配置。
#leader节点
postgres # ssh-keygen -t rsa
postgres # ssh-copy-id postgres@172.22.138.218
postgres # ssh-copy-id postgres@172.22.138.219
#standby1节点
postgres # ssh-keygen -t rsa
postgres # ssh-copy-id postgres@172.22.138.218
postgres # ssh-copy-id postgres@172.22.138.220
#standby2节点
postgres # ssh-keygen -t rsa
postgres # ssh-copy-id postgres@172.22.138.219
postgres # ssh-copy-id postgres@172.22.138.220
配置PGSQL
1.创建repmgr的用户和数据库,并授予管理员权限。(leader节点执行)
postgres=# create user repmgr with superuser password 'repmgr' connection limit 20;
postgres=# create database repmgr owner repmgr;\
postgres=# alter user repmgr set search_path to repmgr, "$user", public;
2.修改postgresql.conf文件,增加shared_preload_libraries参数。这个参数用于指定在pgsql启动时预加载的共享库。这些共享库通常包含一些扩展模块,我们这里需要加载repmgr共享库。max_wal_senders是wal日志发送的最大进程数,影响着主库像从库投递wal日志时的性能。wal_log_hints这个参数,能够在wal日志中写入更多信息(记录特定提示位(hint-bit)的变化)。都是repmgr需要用到的参数。(leader节点执行)
postgres # vim /data/pgsql/data/postgresql.conf
...
shared_preload_libraries = 'repmgr'
max_wal_senders = 6
wal_log_hints = on
...
3.配置访问控制文件,在文件中加入repmgr用户(leader节点执行)
postgres # vim /data/pgsql/data/pg_hba.conf
local repmgr repmgr trust
host repmgr repmgr 127.0.0.1/32 trust
host repmgr repmgr 0.0.0.0/0 trust
4.为repmgr用户编写.pgpass密码文件,实现免密登录。(所有节点执行)
postgres # vim /home/postgres/.pgpass
172.22.138.218:5432:repmgr:repmgr:repmgr
172.22.138.219:5432:repmgr:repmgr:repmgr
172.22.138.220:5432:repmgr:repmgr:repmgr
4…重启pgsql使配置文件生效。
root # systemctl restart postgresql
配置repmgr
1.编写repmgr配置文件,每个节点按照实际情况配置(所有节点按实际情况执行)
postgres # vim /data/repmgr/repmgr.conf
# leader节点
node_id=1
node_name='node1'
conninfo='host=172.22.138.220 port=5432 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/data/pgsql/data'
failover='automatic'
promote_command='/data/pgsql/base/bin/repmgr standby promote --config-file=/data/pgsql/remgr/remgr.conf --log-to-file'
follow_command='/data/pgsql/base/bin/repmgr standby follow --config-file=/data/pgsql/remgr/remgr.conf --log-to-file --upstream-node-id=%n'
monitoring_history=yes
connection_check_type=ping
reconnect_attempts=6
reconnect_interval=10
standby_disconnect_on_failover=true
repmgrd_pid_file='/data/repmgr/repmgrd.pid'
repmgrd_service_start_command='/data/pgsql/base/bin/repmgrd -f /data/pgsql/remgr/remgr.conf start'
repmgrd_service_stop_command='kill -9 `cat /data/pgsql/remgr/repmgrd.pid`'
log_level=INFO
log_file='/data/repmgr/repmgrd.log'
log_status_interval=10
# standby1节点
node_id=2
node_name='node2'
conninfo='host=172.22.138.219 port=5432 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/data/pgsql/data'
failover='automatic'
promote_command='/data/pgsql/base/bin/repmgr standby promote --config-file=/data/pgsql/remgr/remgr.conf --log-to-file'
follow_command='/data/pgsql/base/bin/repmgr standby follow --config-file=/data/pgsql/remgr/remgr.conf --log-to-file --upstream-node-id=%n'
monitoring_history=yes
connection_check_type=ping
reconnect_attempts=6
reconnect_interval=10
standby_disconnect_on_failover=true
repmgrd_pid_file='/data/repmgr/repmgrd.pid'
repmgrd_service_start_command='/data/pgsql/base/bin/repmgrd -f /data/pgsql/remgr/remgr.conf start'
repmgrd_service_stop_command='kill -9 `cat /data/pgsql/remgr/repmgrd.pid`'
log_level=INFO
log_file='/data/repmgr/repmgrd.log'
log_status_interval=10
# standby2节点
node_id=3
node_name='node3'
conninfo='host=172.22.138.218 port=5432 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/data/pgsql/data'
failover='automatic'
promote_command='/data/pgsql/base/bin/repmgr standby promote --config-file=/data/pgsql/remgr/remgr.conf --log-to-file'
follow_command='/data/pgsql/base/bin/repmgr standby follow --config-file=/data/pgsql/remgr/remgr.conf --log-to-file --upstream-node-id=%n'
monitoring_history=yes
connection_check_type=ping
reconnect_attempts=6
reconnect_interval=10
standby_disconnect_on_failover=true
repmgrd_pid_file='/data/repmgr/repmgrd.pid'
repmgrd_service_start_command='/data/pgsql/base/bin/repmgrd -f /data/pgsql/remgr/remgr.conf start'
repmgrd_service_stop_command='kill -9 `cat /data/pgsql/remgr/repmgrd.pid`'
log_level=INFO
log_file='/data/repmgr/repmgrd.log'
log_status_interval=10
2.注册主节点,将leader节点postgresql,接管到repmgr。(leader节点执行)
postgres # repmgr -f /data/repmgr/repmgr.conf primary register
# 验证是否接管成功,查看集群状态。
postgres # repmgr -f /data/repmgr/repmgr.conf.conf cluster show
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+---------------------------------------------------------------------------
1 | node1 | primary | * running | | default | 100 | 1 | host=172.22.138.220 port=5432 user=repmgr dbname=repmgr connect_timeout=2
3.注册standby节点前需要先将从库的数据目录清空。才能从主库重新克隆。(standby节点执行)
root # systemctl stop postgresql
postgres # mkdir /tmp/bak
postgres # mv /data/pgsql/data/* /tmp/bak
4.通过leader节点,克隆standby节点。(standby节点执行)
#检测是否有警告或者报错,如果没有去掉--dry-run执行。
postgres # repmgr -h 172.22.138.220 -U repmgr -d repmgr -f /data/repmgr/repmgr.conf standby clone --dry-run
#执行克隆
postgres # repmgr -h 172.22.138.220 -U repmgr -d repmgr -f /data/repmgr/repmgr.conf standby clone
#克隆完成,没有问题,启动postgresql从库实例
root # systemctl start postgresql
5.验证主从状态是否正常。(分节点执行)
#主库pgsql执行
postgres=# select * from pg_stat_replication;
#从库执行
postgres=# select * from pg_stat_wal_receiver;
6.使用repmgr命令注册从库所有节点。接管到高可用repmgr集群。(standby节点执行)
postgres # repmgr -f /data/repmgr/repmgr.conf.conf standby register
#查看集群状态
postgres # repmgr -f /data/repmgr/repmgr.conf.conf cluster show
repmgr后台启动
repmgr默认没有启动进程的状态下,是只搭建了一个流复制的,是没办法做到高可用的,所以我们需要再进行启动一下repmgr的进程。让他在后台进行检测。
#启动命令
repmgr -f /data/repmgr/repmgr.conf.conf daemon start
#停止命令
repmgr -f /data/repmgr/repmgr.conf.conf daemon stop