目录
- Repmgr管理PostgreSQL服务器集群笔记
- 一、概述
- (一)主要工具
- (二)用户和元数据
- 二、准备工作
- (一)基本环境
- (二)PostgreSQL用户创建、目录规划
- (三)互信配置
- (四)pg12编译安装
- 三、搭建PG主备(异步流复制)
- (一)修改HA1的配置
- (二)机器HA2使用pg_basebackup做基础备份
- (三)机器HA2修改postgresql.conf
- (四)机器HA2配置standby.signal
- (五)启动HA2
- 四、repmgr安装配置
- (一)主库创建repmgr库存储元数据
- (二)主库pg_hba配置repmgr策略
- (三)所有服务器安装repmgr
- (四)停备库并删除数据文件
- (五)免密配置
- (六)主库创建配置文件repmgr.conf
- (七)使用repmgr命令注册主库
- (八)使用repmgr命令克隆备库
- 1. 配置备库参数
- 2. 检查是否可以完成repmgr搭建备库
- 3. 正式克隆
- 4. 修改备库host指向
- (九)查看日志确认
- (十)使用repmgr命令注册备库
- (十一)查看集群状态
- 五、切换测试
- (一)HA2执行有计划的switchover
- (二)HA1执行有计划的switchover
Repmgr管理PostgreSQL服务器集群笔记
一、概述
Repmgr是一套开源工具,用于管理PostgreSQL服务器集群中的复制和故障转移。它支持并增强了PostgreSQL的内置流复制,提供单个读/写主服务器和一个或多个只读备用数据库,备用数据库包含主服务器数据库的近实时副本。
(一)主要工具
- repmgr:用于执行管理任务的命令行工具,可设置备用服务器、将备用服务器升级为主服务器、切换主服务器和备用服务器、显示复制群集中的服务器状态。
- repmgrd:一个守护程序,主动监视复制集群中的服务器,可监控和记录复制性能、通过检测主服务器故障并提升最合适的备用服务器来执行故障转移,还能将有关群集中事件的通知提供给用户定义的脚本,该脚本可执行诸如通过电子邮件发送警报等任务。
(二)用户和元数据
为有效管理复制集群,repmgr需在专用数据库中存储有关集群中服务器的信息。此模式由repmgr扩展自动创建,包含以下对象:
- 表
repmgr.events
:记录感兴趣的事件。repmgr.nodes
:存储复制群集中每个服务器的连接和状态信息。repmgr.monitoring_history
:repmgrd编写的历史备用监视信息视图。
- 视图
repmgr.show_nodes
:基于表repmgr.nodes
,另外显示服务器上游节点的名称。repmgr.replication_status
:启用repmgrd的监视时,显示每个备用数据库的当前监视状态。
repmgr元数据可存储在现有的数据库或自己的专用数据库,但不能存储在不属于repmgr管理的复制集群的数据库服务器上。数据库用户必须可供repmgr访问此数据库并执行必要的更改,此用户不需要是超级用户,但某些操作(如repmgr扩展的初始安装)将需要超级用户连接(可使用命令行在需要时指定superuser)。
二、准备工作
(一)基本环境
主机名 | IP地址 | 软件版本 |
---|---|---|
HA1 | 10.10.10.21 | Repmgr5.2.0 + PG12.4 |
HA2 | 10.10.10.23 | Repmgr5.2.0 + PG12.4 |
(二)PostgreSQL用户创建、目录规划
# 创建系统用户和组
groupadd postgres -g 1001
useradd postgres -g 1001 -u 1001
# 安装文件目录
mkdir -p /opt/pg12
chown -R postgres:postgres /opt/pg12
chmod 0700 /opt/pg12
ln -s /opt/pg12 /opt/pgsql
# 数据目录
mkdir -p /opt/data6000
chown -R postgres:postgres /opt/data6000
chmod 0700 /opt/data6000
# 归档目录
mkdir -p /opt/archive6000
chown -R postgres:postgres /opt/archive6000
chmod 0700 /opt/archive6000
(三)互信配置
# HA1
cat .ssh/id_rsa.pub > .ssh/authorized_keys
scp .ssh/authorized_keys postgres@10.10.10.21:/home/postgres/.ssh
# HA2
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
scp .ssh/authorized_keys postgres@10.10.10.23:/home/postgres/.ssh/authorized_keys
(四)pg12编译安装
# 解压到/opt目录下
tar -zxvf postgresql-12.4.tar.gz
cd postgresql-12.4/
# 编译
./configure --prefix=/opt/pg12 --with-pgport=6000
# 安装
gmake world && gmake install-world
# 配置开机自启动
su root
cp contrib/start-scripts/linux /etc/init.d/postgres
chmod +x /etc/init.d/postgres
chkconfig postgres on
vi /etc/init.d/postgres
# 删除源文件
cd /opt
rm -rf postgresql-12.4
# 初始化数据目录
su postgres /opt/pgsql/bin/initdb -D /opt/data6000 -E UTF8 -U postgres -W
# 服务启停
service postgres start | stop
/opt/pgsql/bin/pg_ctl -D /opt/data6000 start | stop
三、搭建PG主备(异步流复制)
(一)修改HA1的配置
vi postgresql.conf
listen_addresses = '*'
port = 6000
wal_level = replica
archive_mode = on
archive_command = 'cp %p /opt/archive6000/%f'
max_wal_senders = 10
wal_keep_segments = 512
hot_standby = on
primary_conninfo = 'host=10.10.10.23 port=6000 user=repuser'
logging_collector = on
log_destination = csvlog
log_directory = '/opt/data6000/pg_log'
log_filename = 'pg_log_%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
log_min_messages = warning
log_min_duration_statement = 30s
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_lock_waits = on
log_statement = DDL
vi pg_hba.conf
host all all 0.0.0.0/0 md5
host replication all 0.0.0.0/0 trust
/opt/pgsql/bin/psql -p6000 -h127.0.0.1 -U postgres
create user repuser replication login connection limit 5 encrypted password '123456';
create table t(id int, info text);
insert into t values(1, now()),(2, now()),(3, now());
# 重启HA1
service postgres restart
(二)机器HA2使用pg_basebackup做基础备份
/opt/pgsql/bin/pg_basebackup -D /opt/data6000/ -Fp -Xs -v -P -h10.10.10.21 -p6000 -Urepuser
(三)机器HA2修改postgresql.conf
vi postgresql.conf
listen_addresses = '*'
port = 6000
wal_level = replica
archive_mode = on
archive_command = 'cp %p /opt/archive6000/%f'
max_wal_senders = 10
wal_keep_segments = 512
hot_standby = on
primary_conninfo = 'host=10.10.10.21 port=6000 user=repuser'
logging_collector = on
log_destination = csvlog
log_directory = '/opt/data6000/pg_log'
log_filename = 'pg_log_%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
log_min_messages = warning
log_min_duration_statement = 30s
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_lock_waits = on
log_statement = DDL
(四)机器HA2配置standby.signal
touch /opt/data6000/standby.signal
(五)启动HA2
/opt/pgsql/bin/pg_ctl -D /opt/data6000 start &
至此,异步流复制搭建完成,主库为HA1(10.10.10.21),备库为HA2(10.10.10.23)。
四、repmgr安装配置
(一)主库创建repmgr库存储元数据
/opt/pgsql/bin/psql -p6000 -U postgres postgres
create user repmgr superuser connection limit 10 password '123456';
create database repmgr owner repmgr;
(二)主库pg_hba配置repmgr策略
local repmgr repmgr trust
host repmgr repmgr 127.0.0.1/32 trust
host repmgr repmgr 0.0.0.0/0 trust
local replication repmgr trust
host replication repmgr 127.0.0.1/32 trust
host replication repmgr 0.0.0.0/0 trust
(三)所有服务器安装repmgr
chmod 755 repmgr-5.2.tar.gz
chown postgres:postgres repmgr-5.2.tar.gz
tar -zxvf repmgr-5.2.tar.gz
./configure PG_CONFIG=/opt/pgsql/bin/pg_config
make && make install
(四)停备库并删除数据文件
service postgres stop
rm -rf archive6000/*
rm -rf data6000/*
(五)免密配置
cd /home/postgres
chown -R postgres:postgres /home/postgres/
chmod -R 0700 /home/postgres/
usermod -d /home/postgres postgres
su - postgres
touch .pgpass
chmod 0600 .pgpass
vi .pgpass
# 添加以下内容
10.10.10.21:6000:repmgr:repmgr:123456
10.10.10.23:6000:repmgr:repmgr:123456
(六)主库创建配置文件repmgr.conf
# HA1(10.10.10.21)
vi /opt/repmgr.conf
node_id = 1
node_name = 'node1'
conninfo = 'host=10.10.10.21 port=6000 user=repmgr dbname=repmgr connect_timeout=2'
data_directory = '/opt/data6000'
replication_user = 'repmgr'
repmgr_bindir = '/opt/pgsql/bin'
pg_bindir = '/opt/pgsql/bin'
monitoring_history = yes
monitor_interval_secs = 5
log_level = 'debug'
log_file = '/opt/data6000/repmgr.log'
chown -R postgres:postgres repmgr.conf
chmod 0600 repmgr.conf
# HA2(10.10.10.23)测试repmgr是否能免密访问主库(postgres)
psql -p 6000 -h10.10.10.21 -U repmgr
(七)使用repmgr命令注册主库
# HA1(10.10.10.21) root下执行
repmgr -f /opt/repmgr.conf primary register --force
(八)使用repmgr命令克隆备库
1. 配置备库参数
# HA2(10.10.10.23)
vi /opt/repmgr.conf
node_id = 2
node_name = 'node2'
conninfo = 'host=10.10.10.23 port=6000 user=repmgr dbname=repmgr connect_timeout=2'
data_directory = '/opt/data6000'
replication_user = 'repmgr'
replication_type = 'physical'
repmgr_bindir = '/opt/pgsql/bin'
pg_bindir = '/opt/pgsql/bin'
monitoring_history = yes
monitor_interval_secs = 5
log_level = 'debug'
log_file = '/opt/data6000/repmgr.log'
chown -R postgres:postgres repmgr.conf
chmod 0600 repmgr.conf
2. 检查是否可以完成repmgr搭建备库
repmgr -h 10.10.10.21 -p6000 -U repmgr -d repmgr -f /opt/repmgr.conf standby clone --dry-run
3. 正式克隆
repmgr -h 10.10.10.21 -p6000 -U repmgr -d repmgr -f /opt/repmgr.conf standby clone
4. 修改备库host指向
# HA2(10.10.10.23)修改配置文件,primary_conninfo里host修改指向HA1
vi /opt/data6000/postgresql.conf
primary_conninfo = 'host=10.10.10.21 port=6000 user=repuser'
# 启动备库
service postgres start
(九)查看日志确认
# 主库查看postgres进程
ps -ef | grep postgres
# 备库查看postgres进程
ps -ef | grep postgres
# 主库查看复制状态
/opt/pgsql/bin/psql -p6000 -U postgres -c "SELECT * FROM pg_stat_replication;"
(十)使用repmgr命令注册备库
# HA2(10.10.10.23)
repmgr -f /opt/repmgr.conf standby register --force
(十一)查看集群状态
# HA1和HA2查看状态一致
repmgr -f /opt/repmgr.conf cluster show
五、切换测试
(一)HA2执行有计划的switchover
repmgr -f /opt/repmgr.conf standby switchover -U repmgr --verbose
从日志可以看到切换过程:检查主库为node1,ssh到主库node1,检查归档文件和wal,触发checkpoint,快速关闭主库node1,检查主库node1是否关闭,主库node1关闭clean后开始提升备库node2,节点node2调用pg_promote()
函数提升备库为主库,等待60秒(promote_check_timeout
)以便promotion完成,节点node2完成promotion,node1满足rejoin到node2,node1执行pg_ctl
启动服务,rejoin,attached node2,switchover完成。
# 查看集群状态
repmgr -f /opt/repmgr.conf cluster show
(二)HA1执行有计划的switchover
repmgr -f /opt/repmgr.conf standby switchover -U repmgr --verbose
从日志可以看到切换过程:检查主库为node2,ssh到主库node2,检查归档文件和wal,触发checkpoint,快速关闭主库node2,检查主库node2是否关闭,主库node2关闭clean后开始提升备库node1,节点node1调用pg_promote()
函数提升备库为主库,等待60秒(promote_check_timeout
)以便promotion完成,节点node1完成promotion,node2满足rejoin到node1,node2执行pg_ctl
启动服务,rejoin,attached node1,switchover完成。
# 查看集群状态
/opt/pgsql/bin/repmgr -f /opt/repmgr.conf cluster show
经过两次switchover已经恢复为HA1为主库,HA2为备库。