1.    适用场景

集群在运行过程中,出于运维目的数据库管理员可能需要手工对DN或GTM做主备切换。例如发现DN或GTM主备自动failover后想恢复原有的主备角色。

2.    前提条件

1) GaussDB A集群安装成功,且处于主备不均衡状态。

2) 操作时间取得客户同意,并且确认为业务低峰期

3.    对系统影响

由于过程中会短暂实例服务不可用,故需要选择业务低峰期进行操作,从而减少因数据库主备切换对客户业务的影响。

4.    变更步骤

4.1检查集群状态处于不均衡状态

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤3 执行以下命令,查看GaussDB A集群当前状态

cm_ctl query

结果如下,balanced显示为No,则说明需要进行主备均衡,否则不需要执行此方案

[   Cluster State   ]

 

cluster_state  :  Normal

redistributing : No

balanced       : No

4.2检查当前为业务低峰期

若存在大量业务进行切换时会导致主实例等待业务进程退出长时间无法将备,集群持续不可用,因此执行均衡操作前需要确保处于业务低峰期。

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤3 执行以下命令,查看当前业务情况

gsql -d postgres -p 25308 -c ” select * from pgxc_stat_activity where usename!=’omm’ and state=’active’; “

如下查询无结果或少于20条记录,则为正常,若大于20条记录联系客户停止当前运行业务或另找业务低峰期进行。

coorname | datname | usename | pid | application_name | client_addr | backend_start | xact_start | query_start | state_change | waiting | enqueue | state | query_id | query

———-+———+———+—–+——————+————-+—————+————+————-+————–+———+———+——-+———-+——-

(0 rows)

 

4.3查看是否有主备追赶

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤3 执行以下命令,确保Catchup视图无主备追赶

gsql -d postgres -p 25308 -c “select * from pgxc_get_senders_catchup_time()”

如下查询无结果,则为正常

nodename | lwpid | local_role | peer_role | state | sender | catchup_start | catchup_end

———-+——-+————+———–+——-+——–+—————+————-

(0 rows)

如果查询有结果,且结果持续没有变化,并且确认为业务低峰期,则联系华为工程师处理。

4.4检查不均衡备DN redo进度

备机需要redo追齐主机才能升主成功,若备机redo进度与当前主实例相差较大执行均衡命令后,需要等备机redo完才能正式成为主机接管业务,在此之前集群持续不可用,因此在切换必须保证主备相差不大,缩短均衡时间。

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤3 执行以下命令,查找不均衡DN实例

cm_ctl query -Csdipv

结果如下,6001和6002实例发生了主备切换

[  Datanode State   ]

 

node     node_ip         instance        state            | node     node_ip         instance        state

———————————————————————————————————————-

1  host1 192.168.0.1  6001 25330      P Standby Normal | 2  host2 192.168.0.2  6002 25490      S Primary Normal

当前的主(Primary)实例为6002,6002所在节点为host2254906002进程的端口号

步骤 4 登录第一个cn节点创建redo查询视图

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

gsql -d postgres -p 25308 -r

连接到CN执行如下命令创建redo查询视图:

CREATE OR REPLACE FUNCTION public.get_redo_info(OUT node_name name, OUT sender_replay_location text, OUT sender_flush_location text, out redoing bool)

RETURNS SETOF RECORD

LANGUAGE plpgsql

AS $$

DECLARE

V_SQL text;

query_str text;

rec record;

result record;

a text;

b text;

c text;

d text;

BEGIN

V_SQL := ‘select node_name from pgxc_node where node_type = ”D” and hostis_primary = ”f”’;

FOR rec IN EXECUTE(V_SQL) LOOP

query_str := ‘EXECUTE DIRECT ON(‘ || rec.node_name || ‘) ”select sender_replay_location,sender_flush_location,receiver_replay_location,receiver_flush_location from pg_stat_get_wal_senders() where peer_role = ””Standby”” ”’;

EXECUTE query_str into result;

node_name := rec.node_name;

sender_replay_location := result.receiver_replay_location;

sender_flush_location := result.receiver_flush_location;

a := split_part(sender_replay_location, ‘/’, 1);

b := split_part(sender_flush_location, ‘/’, 1);

c := split_part(sender_replay_location, ‘/’, 2);

d := split_part(sender_flush_location, ‘/’, 2);

IF a = b THEN

redoing = ‘f’;

ELSE

redoing = ‘t’;

END IF;

RETURN NEXT;

END LOOP;

RETURN;

END$$;

步骤 5  登录第一个cn节点查询redo进度

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

gsql -d postgres -p 25308 -c ” select * from get_redo_info(); “

结果如下,0/1188D4B8为16进制数字,所有实例查询结果redoing项为f即为正常。

  node_name   | sender_replay_location | sender_flush_location | redoing

————–+————————+———————–+———

dn_6001_6002 | 0/1188D4B8             | 0/1188D4B8            | f

(1 row)

4.5连接CN执行checkpoint

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤3 执行以下命令,做checkpoint

gsql -d postgres -p 25308 -c “checkpoint”

执行结果如下

CHECKPOINT

若超过5分钟未结束,则联系华为工程师处理。

4.6检查当前集群是否有备份任务

该步骤只需要在8.1.1(2021年330之后版本)以上版本进行判断,其余版本非均衡情况下不支持备份任务。若当前集群存在备份任务,进行集群均衡会导致备份失败。

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令判断是否存在备份任务

ps -ef|grep gs_roach|grep -v grep

若输出为空则无备份任务,集群进行均衡操作,否则与客户沟通后停止备份集再进行均衡操作。

步骤3 执行以下命令,停止备份任务

python $GPHOME/script/GaussRoach.py -t stop -F

4.7执行主备均衡

步骤1 以omm用户登录GaussDB A集群的第一个cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤使用如下命令进行主备均衡

cm_ctl switchover -a

结果如下,则为正常

cm_ctl: cmserver is rebalancing the cluster automatically.

….

cm_ctl: switchover successfully.

4.8均衡操作是否成功

1)后台集群状态验证

步骤1 以omm用户登录GaussDB A集群的第一个正常的cn节点

步骤2 执行以下命令,启用环境变量

source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile

步骤3 执行以下命令,查看GaussDB A集群当前状态

cm_ctl query

如下则为正常

[   Cluster State   ]

 

cluster_state  :  Normal

redistributing : No

balanced       : Yes

2)客户业务验证

验证方案需包括DDL和DML语句