一套集群实时在线扩容为两套集群方案
解决问题:当一套集群 A 承担不了业务压力,需要在 A 集群在线情况下,扩出来一套与 A 集群完全一样的 B 集群,之后从业务层面控制 A 和 B 各自承担原 A 承担的一半业务压力。
1、配置 A 集群
1.1 A 集群创建用户并赋权
select from pg_user where ; --确定用户是否已存在,如果用户已经存在只需要赋SYSADMIN权限
CREATE USER replicator WITH PASSWORD "";
alter role replicator replication;
alter role replicator SYSADMIN;
1.2 A 配置白名单
gs_guc reload -N all -I all -h "host replication all .../0 md5"
2、配置 B 集群
2.1 B 集群搭建好
gs_om -t status --detail 查看集群状态正常
2.2 B 集群配置白名单
gs_guc reload -N all -I all -h "host replication all .../0 md5"
2.3 B 集群停库
gs_om -t stop
2.4 B 集群备份配置文件
B 集群主节点备份 postgresql.conf pg_hba.conf 之后清空 B 集群 dn 目录下所有内容,包括 pg_xlog 等软连接下的数据
cp $GAUSSDATA/postgresql.conf ~/
cp $GAUSSDATA/pg_hba.conf ~/
rm -rf B集群主节点$GAUSSDATA下所有内容
2.5 B 集群主节准备 recover.conf
vi ~/recovery.conf
standby_mode = 'on'
recovery_target_timeline = 'latest'
primary_conninfo='host=A集群监听ip port=A集群端口 user=replicator password=****'
2.6 B 集群主节点上做备份
gs_basebackup -D [B集群dn目录] -h [A集群ip] -p [A 集群port] -U replicator
需要两次输入replicator用户密码
2.7 B 集群主节点恢复配置问题件
cp ~/postgresql.conf $GAUSSDATA/
cp ~/pg_hba.conf $GAUSSDATA/
cp ~/recovery.conf $GAUSSDATA/
2.8 B 集群主节点恢复原有的软连接形态
mv $GAUSSDATA/pg_xlog/* /app/ogxlog
ln -svf /app/ogxlog $GAUSSDATA/pg_xlog
2.9 B 集群主节点已 primary 方式拉起
gs_ctl start-D $GAUSSDATA -M primary
2.10 A 集群验证流复制效果
gs_ctl query -D $GAUSSDATA
A上只会显示B主节点的复制关系
select * from pg_replication_slots ;
select * from pg_stat_replication ;
SELECT pg_current_xlog_location() ;
2.11 删除 B 集群主节点 dn 目录下 recovery.conf 文件
mv $GAUSSDATA/dn1/recovery ../
2.12 B 集群备节点拉起
gs_ctl build -D $GAUSSDATA -M standby
2.13 AB 集群验证复制效果
gs_ctl query -D $GAUSSDATA
A上只会显示B主节点的复制关系
select * from pg_replication_slots ;
select * from pg_stat_replication ;
SELECT pg_current_xlog_location() ;
3 断开业务等数据集追齐
断开全量写业务之后,在lsn追齐后校验AB集群数据完整性校验?
AB集群全量表分别做checksum(回所有输入值的CHECKSUM值。使用该函数可以用来验证openGauss数据库(不支持openGauss之外的其他数据库)的备份恢复或者数据迁移操作前后表中的数据是否相同。在备份恢复或者数据迁移操作前后都需要用户通过手工执行SQL命令的方式获取执行结果,通过对比获取的执行结果判断操作前后表中的数据是否相同)
select checksum(A集群_表1::text) from A集群_表1;
select checksum(B集群_表1::text) from B集群_表1;
4 断开流复制关系
--A集群回收replicator sysadmin权限
revoke all privileges from replicator;
--B集群回收replicator sysadmin权限
revoke all privileges from replicator;
--核对replicator用户权限
select * from pg_roles where rolname = 'replicator';
重启B集群
gs_om -t restart
至此两套数据完全一致的库可交由业务层面做业务分离