openGauss灾备集群切换介绍
发表于 2026/06/24
0
openGauss灾备集群切换介绍
切换步骤
主机群降级灾备集群:
命令: gs_sdr -t
switchover -m disaster_standby
切换时候日志打印:
--------------------------------------------------------------------------------
Streaming disaster recovery switchover edef14842ca611f1b2ed78b46a3ff63e
--------------------------------------------------------------------------------
Start streaming disaster switchover.
Waiting for cluster and all instances
normal.
Parse cluster conf from file.
Successfully parse cluster conf from file.
Got the step for action:[switchover].
Stopping the cluster.
Successfully stopped the cluster.
Starting the cluster.
Successfully started primary instance.
Please wait for standby instances.
Waiting cluster normal.
Successfully started standby instances.
Waiting for truncation.
Stopping the cluster.
Successfully stopped the cluster.
Starting the cluster.
Successfully started primary instance.
Please wait for standby instances.
Waiting cluster normal.
Successfully started standby instances.
The cluster status is Normal.
Starting drop all node replication slots
Finished drop all node replication slots
Successfully removed step file.
Successfully do streaming disaster recovery
switchover.
灾备集群升级为主集群:
命令: gs_sdr -t
switchover -m primary
日志打印:
--------------------------------------------------------------------------------
Streaming disaster recovery switchover
f4b05b022ca611f1a855f82e3f373381
--------------------------------------------------------------------------------
Start streaming disaster switchover.
Waiting for cluster and all instances
normal.
Parse cluster conf from file.
Successfully parse cluster conf from file.
Got the step for action:[switchover].
Waiting for switchover barrier.
Stopping the cluster by node.
Successfully stopped the cluster by node
for streaming cluster.
Starting the cluster.
Successfully started primary instance.
Please wait for standby instances.
Waiting cluster normal.
Successfully started standby instances.
Successfully check cluster status is:
Normal.
Successfully removed step file.
Successfully do streaming disaster recovery
switchover.
原理介绍
1. 主集群和灾备集群的参数差异
主集群:
cm_ctl set --param --agent -k
'agent_backup_open=0'
cm_ctl set --param --server -k
'backup_open=0'
gs_guc set -Iall -Nall -c
"stream_cluster_run_mode='cluster_primary'"
cm_ctl ddb --put /omm/CMServer/backup_open
0
灾备集群:
cm_ctl set --param --agent -k 'agent_backup_open=2'
cm_ctl set --param --server -k
'backup_open=2'
gs_guc set -Iall -Nall -c
"stream_cluster_run_mode='cluster_standby'"
cm_ctl ddb --put /omm/CMServer/backup_open 2
(
/omm/CMServer/backup_open 这个omm为部署的系统用户。)
CM和数据库,通过这四个组件的参数,在集群启动时候控制是启动为灾备集群还是主机群。
因此在极端场景下,可以通过手动设置这4个参数方式,将集群重启恢复为对应的角色。
2. 切换过程说明
切换过程是两个集群有交互操作,按照顺序如下步骤:
(1)主集群降备 -- 生成维护文件,重启
每个节点生成 bin/cluster_maintance 和 datadir/cluster_maintance
stop集群 + start集群
Start集群时候遇到
cluster_maintaince文件会将数据库设置为只读。此时数据库无法接受写业务。
主集群主节点调用sql:
select * from gs_streaming_dr_in_switchover()
select * from gs_streaming_dr_service_truncation_check();
SQL1 会生成带有切换标识的xlog,同时关闭掉autovacuum线程,即最后一条xlog是带有切换标识的xlog。
SQL2会一直死循环查询,确保灾备集群接收到了该标识的xlog后退出循环,继续做下面的主集群降级步骤。(等待20min超时时间)
(2)灾备集群升主 -- 等待读取主机发送的切换标识
各个节点添加维护文件 bin/cluster_maintance
一直循环,查询sql
select * from gs_streaming_dr_get_switchover_barrier();
等待灾备接收到主集群发送的切换标识文件。(当前灾备集群所有节点都要接收到,保证数据完全和主机群一致)
(3)主集群降备 -- 配置并重启
设置DCC元数据 /omm/CMServer/backup_open=2 omm为部署用户。
cm_ctl ddb
--put /omm/CMServer/backup_open 2
停止集群
配置各个实例上 cm_server.conf参数 backup_open=2
gs_guc set -Z cmserver -N all -I all -c "backup_open=2"
配置各个实例上cm_agent.conf参数agent_backup_open=2
gs_guc set -Z cmagent -N all -I all
-c "agent_backup_open=2"
配置各个实例上数据库参数
gs_guc set -Z datanode -N all -I all
-c "stream_cluster_run_mode='cluster_standby'"
临时设置cm_server参数enable_transaction_read_only=off,避免空间引起的只读影响集群状态。
设置数据库参数 default_transaction_read_only=on 保持数据库只读
(4)主机集群降备 -- 移除维护文件,启动集群
删除各个节点上,datadir/cluster_maintance, bin/cluster_maintance
启动集群,等待集群正常......
(此时主集群已经成为了灾备集群状态,但是要等待灾备升主完成后,两个集群复制关系正常后,新的灾备集群的状态才能正常。)
(5)灾备集群升主 - 升为主集群
各个节点上添加维护文件:bin/cluster_maintance
查询sql记录xlog完成回放的term位点: select term from pg_last_xlog_replay_location();
增加100后设置到dcc上面:
/omm/CMServer/status_key/term = term
+ 100
/omm/CMServer/backup_open=0
停止掉所有实例
配置各个实例上 cm_server.conf参数 backup_open=0
gs_guc set -Z cmserver -N all -I all -c "backup_open=0"
配置各个实例上cm_agent.conf参数agent_backup_open=0
gs_guc set -Z cmagent -N all -I all
-c "agent_backup_open=0"
配置各个实例上数据库参数
gs_guc set -Z datanode -N all -I all -c "stream_cluster_run_mode='cluster_primary'"
临时设置cm_server参数enable_transaction_read_only=off,避免空间引起的只读影响集群状态。
设置数据库参数 default_transaction_read_only=on 保持数据库只读
启动集群,等待集群正常......
(6)等两边集群正常后,灾备切换成功,进行临时配置和文件还原
主机群和灾备,分别
将数据库 default_transaction_read_only=off 去掉只读配置,业务可以正常写入。
将cm_server参数enable_transaction_read_only还原
主集群配置 $PGHOST/streaming_carbin/.hadr_cluster_stat 内容为archive
灾备集群配置 $PGHOST/streaming_carbin/.hadr_cluster_stat 内容为recovery
异常处理
1. 切换失败后残留临时文件,再次发起切换报错
在 $PGHOST下面,切换时候会建一些文件,streaming_lock_xxxxx,这些文件目的是标识当前已有切换任务在进行,用来拦截重复发起切换或者执行其他如升级等维护操作。正常切换后会删除该文件,如果切换过程异常终止掉,该文件还在,会影响下次切换命令,可以主动删除掉。
2. 常见临时文件残留影响数据库或者下一次执行,处理方式
1. $PGHOST/streaming_lock_xxxxxx 会影响重新执行,以及其他工具执行。(删除即可,不要重启)
2. $GASSHOME/bin/cluster_maintaince bin下面的cluster_maintaince只是标记文件,不影响集群,删除即可,不需要重启。
3. <datanode>/cluster_maintaince 数据目录下的cluster_maintaince会设置数据库只读。删除后需要重启数据库集群
4. $PGHOST/streaming_carbin/ 下面切换步骤记录临时文件:
.streaming_switchover_primary .streaming_switchover_standby 删除即可。
已知问题处理
1. 重新搭建灾备由于xlog无差异,走了增量build,但是清理了表空间数据
在切换过程中,主、灾备集群均是只读,不会新产生xlog,基本不会出现需要build的场景。
如果由于某些原因做了failover,则需要重新搭建集群。 但是由于xlog基本无差异,重新搭建走了增量build(很快就搭建结束),但是在增量build时候删除了表空间目录。因此需要重新全量拉取数据。
步骤:
1. 停止灾备集群 cm_ctl stop
2. 首备全量拉取
gs_ctl build -D `pwd` -M hadr_main_standby -U sdru1 -P opengauss@123 -b full
3. 剩余级联备拉取
gs_ctl build -D %s -M cascade_standby -b standby_full


