一、Kingbase RWC 高可用集群切机原理
1.1 原理图

1.2 流程说明
- 本地db状态检测:hamgrd先判断本地db状态,故障则休眠,正常则进入监控流程。
- 主机监控流程:主机hamgrd检测备机状态,发现备机故障则远程恢复流程。
- 备机监控流程:当hamgrd 判断自身是备机时,会检测上流节点状态。若上流节点故障且为主机,便进入切换流程。
- 备机先kil本机wal_receiver进程,随后开启备机选举。
本机节点选举成功后,ping信任网关的ip:
- 若ping 失败,判定网络不正常,退出切换升主流程。
- 若ping成功,判定网络正常,每隔1秒检测其他备机是否kill掉wal_receiver进程。
- 若检测时间超
sibling_nodes_disconnect_timeout设置的时长,默认所有备机均已成功kill该进程。
判断是否配置vip。
- 若已配置vip,ping vip:
- 若ping不通,直接在新主机加载vip。
若ping通,判断vip是否在新主机上:
- 若在新主机上,直接执行升主操作。
- 若不在新主机上,尝试远程执行卸载vip命令,每次执行耗时不得超vip_timeout(60)秒。若超时vip仍能ping通,退出切机升主操作,报错卸载vip超时;若ping不通,则在新主机加载vip,之后继续执行真正的切换命令,完成本机升主。
一句话总结:
备机的hamgrd 时刻监控着自己和上流节点,检测到上流节点故障,并且上流节点是主机时就执行切换,切换前确认所有备机都 kill掉了wal_receiver进程,然后通过ping信任网关判断即将升主的备机网络是否正常,切换过程中通过是否已配置vip,执行卸载old主机vip,加载new主机vip操作。
二、实验目的
目前KES环境为一主一备读写分离集群,两台机器均在一个生产中心。通过对数据库服务、服务器、网络等典型故障进行模拟,主要测试集群环境的高可用性,保障迁移切换后,可稳定承载业务数据库。
2.1 实验环境
| 类别 | 主机点 | 备节点 |
|---|---|---|
| IP | 172.24.0.156 | 172.24.0.157 |
| 主机名 | node1 | node2 |
| 操作系统 | 麒麟 V10 SP3 | 麒麟 V10 SP3 |
| 虚拟 VIP 地址 | 172.24.0.155 |
2.2 实验参数调整
- 每个节点[node1,node2]都需要修改高可用参数,以便于快速跟踪相关过程。这里以node1节点为例。生产环境修改参数请以实际为准。
#控制连接失败或ping网关失败后的最多重试次数。
sed -i "s/reconnect_attempts=10/reconnect_attempts=3/g" /home/application/KingbaseES/cluster/kingbase/etc/repmgr.conf
#控制每次重试之间的间隔等待时间(秒)。
sed -i "s/reconnect_interval=6/reconnect_interval=5/g" /home/application/KingbaseES/cluster/kingbase/etc/repmgr.conf- 重启集群,查看集群当前的状态
[kingbase@nodel ~]s sys_monitor. sh restart
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 13 |
2 | node2 | standby | running | node1 | default | 100 | 12 | 0 bytes
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 5587 | no | n/a
2 | node2 | standby | running | node1 | running | 3859 | no | 0 second(s) ago- 登陆主库,查看当前有哪些备库通过流复制连过来了、复制状态如何。
[kingbase@node1 ~]$ ksql -h 172.24.0.156 test system
用户 system 的口令:
授权类型: 企业版.
输入 "help" 来获取帮助信息.
test=#
test=# \x
扩展显示已打开.
test=# select * from sys_stat_replication;
-[ RECORD 1 ]----+---------------------------
pid | 6130
usesysid | 16386
usename | esrep
application_name | node2
client_addr | 172.24.0.157
client_hostname |
client_port | 14760
backend_start | 2026-07-09 15:16:41.134751
backend_xmin |
state | streaming
sent_lsn | 0/2A0017A0
write_lsn | 0/2A0017A0
flush_lsn | 0/2A0017A0
replay_lsn | 0/2A0017A0
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | quorum
reply_time | 2026-07-09 15:33:08.771341- 登陆备库,查看备库的 WAL 接收器状态,连的是哪个主库、接收 WAL 的进度如何。
[kingbase@node1 ~]$ ksql -h 172.24.0.157 test system
用户 system 的口令:
授权类型: 企业版.
输入 "help" 来获取帮助信息.
test=# \x
扩展显示已打开.
test=# select * from sys_stat_wal_receiver;
-[ RECORD 1 ]---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 6894
status | streaming
receive_start_lsn | 0/2A000000
receive_start_tli | 13
received_lsn | 0/2A0017A0
received_tli | 13
last_msg_send_time | 2026-07-09 15:44:42.434904
last_msg_receipt_time | 2026-07-09 15:44:42.433877
latest_end_lsn | 0/2A0017A0
latest_end_time | 2026-07-09 15:16:54.870799
slot_name | repmgr_slot_2
sender_host | 172.24.0.156
sender_port | 54321
conninfo | user=esrep connect_timeout=10 host=172.24.0.156 port=54321 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000 application_name=node2三、模拟数据库服务故障
3.1 备机数据库服务故障
| 测试用例 | 高可用 | |
|---|---|---|
| 测试内容 | 正常关闭备库实例,查看数据库切换时间,查询业务恢复时间,查看集群状态。 | |
| 前置条件 | 1、操作系统正常运行。2、数据库安装成功,且数据库服务已经启动。 | |
| 预期结果 | 备机服务能够自动拉起,集群状态不发生变化,不影响应用访问。 |
测试过程
- 查看集群状态node1为主,node2为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 13 |
2 | node2 | standby | running | node1 | default | 100 | 12 | 0 bytes- 正常关闭备库[node2]实例。
[kingbase@node2 ~]$ sys_ctl stop
等待服务器进程关闭 .... 完成
服务器进程已经关闭- 查看集群事件
2026-07-09 16:14:36 node2 节点无法连接;2026-07-09 16:15:03 node2 节点被自动拉起恢复
[kingbase@node1 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
1 | node1 | child_node_reconnect | t | 2026-07-09 16:15:05 | standby node "node2" (ID: 2) has reconnected after 30 seconds
2 | node2 | standby_recovery | t | 2026-07-09 16:15:04 | reconnected to local node "node2" (ID: 2), marking active
1 | node1 | node_recovery_success | t | 2026-07-09 16:15:03 | node "node2" (ID: 2) auto-recovery success
2 | node2 | standby_failure | t | 2026-07-09 16:14:36 | unable to connect to local node "node2" (ID: 2), marking inactive
1 | node1 | child_node_disconnect | t | 2026-07-09 16:14:35 | standby node "node2" (ID: 2) has disconnected- 查看集群状态,关闭后备机服务会再次被自动拉起,集群状态不发生改变。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 13 |
2 | node2 | standby | running | node1 | default | 100 | 13 | 0 bytes3.2 主机数据库服务故障
| 测试用例 | 高可用 | |
|---|---|---|
| 测试内容 | 正常关闭主库实例,查看数据库切换时间,查询业务恢复时间,查看集群状态。 | |
| 前置条件 | 1、操作系统正常运行。2、数据库安装成功,且数据库服务已经启动。 | |
| 预期结果 | 备机升级成主机对外提供服务,集群状态发生改变,旧主加入集群需要人工干预。对于有重连机制的应用不需要重启,没有重连机制的应用需要重启。切机过程1-2分钟,不需要重启的应用会有1-2分钟的断连。 |
测试过程
- 查看集群状态node1为主,node2为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 13 |
2 | node2 | standby | running | node1 | default | 100 | 12 | 0 bytes- 正常关闭主库[node1]实例。
[kingbase@node1 ~]$ sys_ctl stop
等待服务器进程关闭 .... 完成
服务器进程已经关闭- 此时备机会自动升级成主机,集群状态发生改变。
- 操作在 node2 节点上进行
[kingbase@node2 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | - failed | ? | default | 100 | |
2 | node2 | primary | * running | | default | 100 | 14 |
[WARNING] following issues were detected
- unable to connect to node "node1" (ID: 1)
[HINT] execute with --verbose option to see connection error messages
[kingbase@node2 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | - failed | ? | n/a | n/a | n/a | n/a
2 | node2 | primary | * running | | running | 3859 | no | n/a
[WARNING] following issues were detected
- unable to connect to node "node1" (ID: 1)
[HINT] execute with --verbose option to see connection error messages- 查看集群事件
2026-07-09 16:27:16 node2 备机被提升为主机
[kingbase@node2 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
2 | node2 | repmgrd_reload | t | 2026-07-09 16:27:21 | monitoring cluster primary "node2" (ID: 2)
2 | node2 | repmgrd_failover_promote | t | 2026-07-09 16:27:21 | node "node2" (ID: 2) promoted to primary; old primary "node1" (ID: 1) marked as failed
2 | node2 | standby_promote | t | 2026-07-09 16:27:16 | server "node2" (ID: 2) was successfully promoted to primary- 应用层检查业务是否正常。
对于有重连机制的应用不需要重启,没有重连机制的应用需要重启。切机过程1-2分钟,不需要重启的应用会有1-2分钟的断连。
- 原主机数据库恢复,需要人工干预加入到集群中。
⚠️: 登陆node1 服务器上操作
#重新加入到集群中
#-h 172.24.0.157 \ # 目标主库地址(rejoin 到谁那里,当前环境下node2 为主库地址)
#-U esrep \ # 复制连接用户
#-d esrep # 连接的数据库名
[kingbase@node1 ~]$ repmgr node rejoin \
-h 172.24.0.157 \
-U esrep \
-d esrep
[NOTICE] rejoin target is node "node2" (ID: 2)
[INFO] local node 1 can attach to rejoin target node 2
[DETAIL] local node's recovery point: 0/2B000028; rejoin target node's fork point: 0/2B0000A0
[INFO] creating replication slot as user "esrep"
[NOTICE] setting node 1's upstream to node 2
[WARNING] unable to ping "host=172.24.0.156 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000"
[DETAIL] KCIping() returned "KCIPING_NO_RESPONSE"
[NOTICE] begin to start server at 2026-07-09 16:37:39.011388
[NOTICE] starting server using "/home/application/KingbaseES/cluster/kingbase/bin/sys_ctl -w -t 90 -D '/home/application/KingbaseES/data' -l /home/application/KingbaseES/cluster/kingbase/bin/logfile start"
[NOTICE] start server finish at 2026-07-09 16:37:39.218932
[NOTICE] replication slot "repmgr_slot_2" deleted on node 1
[NOTICE] NODE REJOIN successful
[DETAIL] node 1 is now attached to node 2- 待集群恢复至正常状态后,查看集群状态node2为主,node1为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | standby | running | node2 | default | 100 | 13 | 0 bytes
2 | node2 | primary | * running | | default | 100 | 14 |
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | standby | running | node2 | running | 5587 | no | 1 second(s) ago
2 | node2 | primary | * running | | running | 3859 | no | n/a- 应用层再次检查业务是否正常
四、模拟服务器故障
4.1 备机数据库服务器故障
| 测试用例 | 高可用 | |
|---|---|---|
| 测试内容 | 重启备库服务器,查看数据库切换时间,查询业务恢复时间,查看集群状态。 | |
| 前置条件 | 1、操作系统正常运行。2、数据库安装成功,且数据库服务已经启动。 | |
| 预期结果 | 备机服务能够自动拉起,集群状态不发生变化,不影响应用访问。 |
测试过程
- 查看集群状态node2为主,node1为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | standby | running | node2 | default | 100 | 13 | 0 bytes
2 | node2 | primary | * running | | default | 100 | 14 |
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | standby | running | node2 | running | 5587 | no | 1 second(s) ago
2 | node2 | primary | * running | | running | 3859 | no | n/a- 正常关闭备库[node1]实例。
[kingbase@node1 ~]$ sys_ctl stop
等待服务器进程关闭 .... 完成
服务器进程已经关闭- 查看集群事件
2026-07-10 09:35:27 node1 节点无法连接;2026-07-10 09:35:55 node1 节点被自动拉起恢复
[kingbase@node2 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
2 | node2 | child_node_reconnect | t | 2026-07-10 09:35:57 | standby node "node1" (ID: 1) has reconnected after 30 seconds
1 | node1 | standby_recovery | t | 2026-07-10 09:35:55 | reconnected to local node "node1" (ID: 1), marking active
2 | node2 | node_recovery_success | t | 2026-07-10 09:35:55 | node "node1" (ID: 1) auto-recovery success
2 | node2 | child_node_disconnect | t | 2026-07-10 09:35:27 | standby node "node1" (ID: 1) has disconnected
1 | node1 | standby_failure | t | 2026-07-10 09:35:27 | unable to connect to local node "node1" (ID: 1), marking inactive- 查看集群状态,关闭后备机服务会再次被自动拉起,集群状态不发生改变。
[kingbase@node2 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | standby | running | node2 | default | 100 | 14 | 0 bytes
2 | node2 | primary | * running | | default | 100 | 14 |4.2 主机数据库服务器故障
| 测试用例 | 高可用 | |
|---|---|---|
| 测试内容 | 重启主库服务器,查看数据库切换时间,查看集群状态。 | |
| 前置条件 | 1、操作系统正常运行。2、数据库安装成功,且数据库服务已经启动。 | |
| 预期结果 | 备机升级成主机对外提供服务,集群状态发生改变,旧主加入集群需要人工干预。对于有重连机制的应用不需要重启,没有重连机制的应用需要重启。切机过程1-2分钟,不需要重启的应用会有1-2分钟的断连。 |
测试过程
- 查看集群状态node2为主,node1为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | standby | running | node2 | default | 100 | 13 | 0 bytes
2 | node2 | primary | * running | | default | 100 | 14 |
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | standby | running | node2 | running | 5587 | no | 1 second(s) ago
2 | node2 | primary | * running | | running | 3859 | no | n/a- 重启主数据库服务器。
[kingbase@node2 ~]$ su - root
[root@node2 ~]# reboot- 此时备机会自动升级成主机,集群状态发生改变。
- 操作在 node1 节点上进行
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 15 |
2 | node2 | primary | - failed | ? | default | 100 | |
[WARNING] following issues were detected
- unable to connect to node "node2" (ID: 2)
[HINT] execute with --verbose option to see connection error messages
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 5587 | no | n/a
2 | node2 | primary | - failed | ? | n/a | n/a | n/a | n/a
[WARNING] following issues were detected
- unable to connect to node "node2" (ID: 2)
[HINT] execute with --verbose option to see connection error messages- 查看集群事件
2026-07-10 09:43:57 node1 备机被提升为主机
[kingbase@node1 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
1 | node1 | repmgrd_reload | t | 2026-07-10 09:44:02 | monitoring cluster primary "node1" (ID: 1)
1 | node1 | repmgrd_failover_promote | t | 2026-07-10 09:44:02 | node "node1" (ID: 1) promoted to primary; old primary "node2" (ID: 2) marked as failed
1 | node1 | standby_promote | t | 2026-07-10 09:43:57 | server "node1" (ID: 1) was successfully promoted to primary- 应用层检查业务是否正常。
对于有重连机制的应用不需要重启,没有重连机制的应用需要重启。切机过程1-2分钟,不需要重启的应用会有1-2分钟的断连。
- 当前配置下,原主机[node2]需要人工干预才能加入集群。
- 操作在 node2 节点上进行
#备份 wal日志
[kingbase@node2 ~]$ cp -r $KINGBASE_DATA/sys_wal /tmp/sys_wal_bak_$(date +%Y%m%d_%H%M)
#关闭 kbha 守护进程 and repmgrd 守护进程,关闭数据库服务
[kingbase@node2 ~]$ sys_monitor.sh stoplocal
2026-07-10 09:52:43 Ready to stop local kbha daemon and repmgrd daemon ...
2026-07-10 09:52:47 begin to stop repmgrd on "[localhost]".
2026-07-10 09:52:48 repmgrd on "[localhost]" already stopped.
2026-07-10 09:52:48 Done.
2026-07-10 09:52:48 begin to stop DB on "[localhost]".
sys_ctl: PID file "/home/application/KingbaseES/data/kingbase.pid" does not exist
Is server running?
2026-07-10 09:52:49 DB on "[localhost]" stop success.
#重新加入到集群中
#-h 172.24.0.156 \ # 目标主库地址(rejoin 到谁那里,当前环境下node1 为主库地址)
#-U esrep \ # 复制连接用户
#-d esrep # 连接的数据库名
#--force-rewind # 强制回退旧主的分叉数据,哪怕旧主有独有写入也抹掉重来,只为让它能重新当备库。
[kingbase@node2 ~]$ repmgr node rejoin \
-h 172.24.0.156 \
-U esrep \
-d esrep \
--force-rewind
[NOTICE] rejoin target is node "node1" (ID: 1)
[NOTICE] sys_rewind execution required for this node to attach to rejoin target node 1
[DETAIL] rejoin target server's timeline 15 forked off current database system timeline 14 before current recovery point 0/2C000028
[NOTICE] executing sys_rewind
[DETAIL] sys_rewind command is "/home/application/KingbaseES/cluster/kingbase/bin/sys_rewind -D '/home/application/KingbaseES/data' --source-server='host=172.24.0.156 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000' -X stream"
sys_rewind: servers diverged at WAL location 0/2B002DA0 on timeline 14
sys_rewind: rewinding from last common checkpoint at 0/2B001EA8(redo lsn at 0/2B001E78) on timeline 14
sys_rewind: find last common checkpoint start time from 2026-07-10 09:58:03.286209 CST to 2026-07-10 09:58:03.400675 CST, in "0.114466" seconds.
sys_rewind: collect the number of WAL files to be processed:2, start time from 2026-07-10 09:58:03.400951 CST to 2026-07-10 09:58:03.533380 CST, cost "0.132429" seconds.
sys_rewind: read WAL in target server from 0/2B001EA8 to 0/2C0000A0 (endpoint 0/2C0000A0)
sys_rewind: read the local Wal file information, start time from 2026-07-10 09:58:03.400951 CST to 2026-07-10 09:58:03.534516 CST, cost "0.001112" seconds.
sys_rewind: waiting for background process to finish streaming ...
sys_rewind: file replication start time from 2026-07-10 09:58:03.534543 CST to 2026-07-10 09:58:04.685155 CST, cost "1.150612" seconds.
sys_rewind: update the control file: minRecoveryPoint is '0/2B014528', minRecoveryPointTLI is '15', and database state is 'in archive recovery'
sys_rewind: we will remove the dir '/home/application/KingbaseES/data/sys_replslot/repmgr_slot_1.rewind' and all the file/dir in it.
sys_rewind: rewind start wal location 0/2B001E78 (file 0000000E000000000000002B), end wal location 0/2B014528 (file 0000000F000000000000002B). wal data increment:73(kB). time from 2026-07-10 09:58:03.534543 CST to 2026-07-10 09:58:05.059098 CST, in "1.772889" seconds.
sys_rewind: Done!
[NOTICE] 0 files copied to /home/application/KingbaseES/data
[INFO] creating replication slot as user "esrep"
[NOTICE] setting node 2's upstream to node 1
[WARNING] unable to ping "host=172.24.0.157 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000"
[DETAIL] KCIping() returned "KCIPING_NO_RESPONSE"
[NOTICE] begin to start server at 2026-07-10 09:58:05.065516
[NOTICE] starting server using "/home/application/KingbaseES/cluster/kingbase/bin/sys_ctl -w -t 90 -D '/home/application/KingbaseES/data' -l /home/application/KingbaseES/cluster/kingbase/bin/logfile start"
[NOTICE] start server finish at 2026-07-10 09:58:06.821248
[NOTICE] NODE REJOIN successful
[DETAIL] node 2 is now attached to node 1- 待集群恢复至正常状态后,查看集群状态node1为主,node2为备节点。
[kingbase@node2 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 15 |
2 | node2 | standby | running | node1 | default | 100 | 14 | 0 bytes
[kingbase@node2 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 5587 | no | n/a
2 | node2 | standby | running | node1 | running | 5200 | no | 0 second(s) agops: 如果遇到node2 的节点的repmgrd 状态是not running , 可使用sys_monitor.sh startlocal 启动repmgrd守护进程。
- 应用层再次检查业务是否正常
五、模拟网络故障
5.1 备机数据库网络故障
| 测试用例 | 高可用 | |
|---|---|---|
| 测试内容 | 断开备机网络,查看数据库切换时间,查询业务恢复时间,查看集群状态。 | |
| 前置条件 | 1、操作系统正常运行。2、数据库安装成功,且数据库服务已经启动。 | |
| 预期结果 | 备机服务能够自动拉起,集群状态不发生变化,不影响应用访问。 |
测试过程
- 查看集群状态node1为主,node2为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 15 |
2 | node2 | standby | running | node1 | default | 100 | 14 | 0 bytes
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 5587 | no | n/a
2 | node2 | standby | running | node1 | running | 5200 | no | 0 second(s) ago- 将备机服务器网线down 掉,并检查集群状态。
- 操作在 node2 节点上进行
#切换到 root 用户下
[kingbase@node2 ~]$ su - root
#查看网卡信息
[root@node2 ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.24.0.157 netmask 255.255.255.0 broadcast 172.24.0.255
inet6 fe80::250:56ff:fea3:ad77 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:a3:ad:77 txqueuelen 1000 (Ethernet)
RX packets 75204 bytes 42562539 (40.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15227 bytes 2376908 (2.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 24092 bytes 5712359 (5.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24092 bytes 5712359 (5.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#临时down了ens32网卡
[root@node2 ~]# ip link set ens32 down- 查看集群事件
2026-07-10 10:16:00 node2 节点无法连接。
[kingbase@node1 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
1 | node1 | child_node_disconnect | t | 2026-07-10 10:16:00 | standby node "node2" (ID: 2) has disconnected
2 | node2 | repmgrd_start | t | 2026-07-10 10:02:47 | monitoring connection to upstream node "node1" (ID: 1)- 恢复网络连接
- 操作在 node2 节点上进行
#切换到 root 用户下
[kingbase@node2 ~]$ su - root
[root@node2 ~]# ip link set ens32 up
[2163.5995921 T117] e10a: ens32 NIC Link is Up 100a Mbps Ful1 Duplex, Flow Control: None
[2163.6003561I T117】 IPv6: ADDRCONF(NETDEV_CHANGE): ens32: 1ink becomes ready- 查看集群事件
2026-07-10 10:19:49 node2 节点恢复连接。
[kingbase@node1 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
1 | node1 | child_node_reconnect | t | 2026-07-10 10:19:49 | standby node "node2" (ID: 2) has reconnected after 229 seconds
2 | node2 | repmgrd_start | t | 2026-07-10 10:19:44 | monitoring connection to upstream node "node1" (ID: 1)
1 | node1 | child_node_disconnect | t | 2026-07-10 10:16:00 | standby node "node2" (ID: 2) has disconnected
2 | node2 | repmgrd_start | t | 2026-07-10 10:02:47 | monitoring connection to upstream node "node1" (ID: 1)
1 | node1 | child_node_new_connect | t | 2026-07-10 09:58:06 | new standby "node2" (ID: 2) has connected
2 | node2 | node_rejoin | t | 2026-07-10 09:58:06 | node 2 is now attached to node 1- 查看集群状态node1为主,node2为备节点,节点角色没有发生变化。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 15 |
2 | node2 | standby | running | node1 | default | 100 | 14 | 0 bytes
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 5587 | no | n/a
2 | node2 | standby | running | node1 | running | 8548 | no | 1 second(s) ago5.2 主机数据库网络故障
| 测试用例 | 高可用 | |
|---|---|---|
| 测试内容 | 断开主节点网络,查看数据库切换时间,查看集群状态。 | |
| 前置条件 | 1、操作系统正常运行。2、数据库安装成功,且数据库服务已经启动。 | |
| 预期结果 | 备机升级成主机对外提供服务,集群状态发生改变,旧主加入集群需要人工干预。对于有重连机制的应用不需要重启,没有重连机制的应用需要重启。切机过程1-2分钟,不需要重启的应用会有1-2分钟的断连。 |
测试过程
- 查看集群状态node1为主,node2为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 15 |
2 | node2 | standby | running | node1 | default | 100 | 14 | 0 bytes
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 5587 | no | n/a
2 | node2 | standby | running | node1 | running | 8548 | no | 1 second(s) ago- 将主机服务器网线down 掉,并检查集群状态。
- 操作在 node1 节点上进行。
#切换到 root 用户下
[kingbase@node1 ~]$ su - root
#查看网卡信息
[root@node1 ~]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.24.0.156 netmask 255.255.255.0 broadcast 172.24.0.255
inet6 fe80::3917:6e9e:dc35:d5fc prefixlen 64 scopeid 0x20<link>
ether 00:50:56:a3:b6:03 txqueuelen 1000 (Ethernet)
RX packets 2003440 bytes 398139781 (379.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 715078 bytes 183618860 (175.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2078478 bytes 482424595 (460.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2078478 bytes 482424595 (460.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#临时down了ens192网卡
[root@node1 ~]# ip link set ens192 down- 此时备机会自动升级成主机,集群状态发生改变。
- 操作在 node2 节点上进行
[kingbase@node2 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | - failed | ? | default | 100 | |
2 | node2 | primary | * running | | default | 100 | 16 |
[WARNING] following issues were detected
- unable to connect to node "node1" (ID: 1)
[HINT] execute with --verbose option to see connection error messages
[kingbase@node2 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | - failed | ? | n/a | n/a | n/a | n/a
2 | node2 | primary | * running | | running | 8548 | no | n/a
[WARNING] following issues were detected
- unable to connect to node "node1" (ID: 1)
[HINT] execute with --verbose option to see connection error messages- 查看集群事件
2026-07-10 10:29:50 备机被提升为主机
[kingbase@node2 ~]$ repmgr cluster event
Node ID | Name | Event | OK | Timestamp | Details
---------+-------+---------------------------+----+---------------------+----------------------------------------------------------------------------------------
2 | node2 | repmgrd_reload | t | 2026-07-10 10:29:50 | monitoring cluster primary "node2" (ID: 2)
2 | node2 | repmgrd_failover_promote | t | 2026-07-10 10:29:50 | node "node2" (ID: 2) promoted to primary; old primary "node1" (ID: 1) marked as failed
2 | node2 | standby_promote | t | 2026-07-10 10:29:45 | server "node2" (ID: 2) was successfully promoted to primary- 应用层检查业务是否正常。
对于有重连机制的应用不需要重启,没有重连机制的应用需要重启。切机过程1-2分钟,不需要重启的应用会有1-2分钟的断连。
- 恢复网络连接
- 操作在 node1 节点上进行
#切换到 root 用户下
[kingbase@node1 ~]$ su - root
[root@node1 ~]# ip link set ens192 up- 当前配置下,原主机[node1]需要人工干预才能加入集群。
- 操作在 node1节点上进行
#备份 wal日志
[kingbase@node1 ~]$ cp -r $KINGBASE_DATA/sys_wal /tmp/sys_wal_bak_$(date +%Y%m%d_%H%M)
#重新加入到集群中
#-h 172.24.0.157 \ # 目标主库地址(rejoin 到谁那里,当前环境下node2 为主库地址)
#-U esrep \ # 复制连接用户
#-d esrep # 连接的数据库名
#--force-rewind # 强制回退旧主的分叉数据,哪怕旧主有独有写入也抹掉重来,只为让它能重新当备库。
[kingbase@node1 ~]$ repmgr node rejoin \
> -h 172.24.0.157 \
> -U esrep \
> -d esrep \
> --force-rewind
[NOTICE] rejoin target is node "node2" (ID: 2)
[NOTICE] sys_rewind execution required for this node to attach to rejoin target node 2
[DETAIL] rejoin target server's timeline 16 forked off current database system timeline 15 before current recovery point 0/2C000028
[NOTICE] executing sys_rewind
[DETAIL] sys_rewind command is "/home/application/KingbaseES/cluster/kingbase/bin/sys_rewind -D '/home/application/KingbaseES/data' --source-server='host=172.24.0.157 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000' -X stream"
sys_rewind: servers diverged at WAL location 0/2B017688 on timeline 15
sys_rewind: rewinding from last common checkpoint at 0/2B017280(redo lsn at 0/2B017250) on timeline 15
sys_rewind: find last common checkpoint start time from 2026-07-10 10:47:20.885475 CST to 2026-07-10 10:47:21.024507 CST, in "0.139032" seconds.
sys_rewind: collect the number of WAL files to be processed:2, start time from 2026-07-10 10:47:21.024754 CST to 2026-07-10 10:47:21.102221 CST, cost "0.077467" seconds.
sys_rewind: read WAL in target server from 0/2B017280 to 0/2C0000A0 (endpoint 0/2C0000A0)
sys_rewind: read the local Wal file information, start time from 2026-07-10 10:47:21.024754 CST to 2026-07-10 10:47:21.103494 CST, cost "0.001235" seconds.
sys_rewind: waiting for background process to finish streaming ...
sys_rewind: file replication start time from 2026-07-10 10:47:21.103525 CST to 2026-07-10 10:47:22.464846 CST, cost "1.361321" seconds.
sys_rewind: update the control file: minRecoveryPoint is '0/2B028D30', minRecoveryPointTLI is '16', and database state is 'in archive recovery'
sys_rewind: we will remove the dir '/home/application/KingbaseES/data/sys_replslot/repmgr_slot_2.rewind' and all the file/dir in it.
sys_rewind: rewind start wal location 0/2B017250 (file 0000000F000000000000002B), end wal location 0/2B028D30 (file 00000010000000000000002B). wal data increment:70(kB). time from 2026-07-10 10:47:21.103525 CST to 2026-07-10 10:47:23.133801 CST, in "2.248326" seconds.
sys_rewind: Done!
[NOTICE] 0 files copied to /home/application/KingbaseES/data
[INFO] creating replication slot as user "esrep"
[NOTICE] setting node 1's upstream to node 2
[WARNING] unable to ping "host=172.24.0.156 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000"
[DETAIL] KCIping() returned "KCIPING_NO_RESPONSE"
[NOTICE] begin to start server at 2026-07-10 10:47:23.197980
[NOTICE] starting server using "/home/application/KingbaseES/cluster/kingbase/bin/sys_ctl -w -t 90 -D '/home/application/KingbaseES/data' -l /home/application/KingbaseES/cluster/kingbase/bin/logfile start"
[NOTICE] start server finish at 2026-07-10 10:47:23.906334
[NOTICE] NODE REJOIN successful
[DETAIL] node 1 is now attached to node 2- 待集群恢复至正常状态后,查看集群状态node2为主,node1为备节点。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | standby | running | node2 | default | 100 | 15 | 0 bytes
2 | node2 | primary | * running | | default | 100 | 16 |
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+--------+---------+--------------------
1 | node1 | standby | running | node2 | running | 179378 | no | 0 second(s) ago
2 | node2 | primary | * running | | running | 8548 | no | n/aps: 如果遇到node2 的节点的repmgrd 状态是not running , 可使用sys_monitor.sh startlocal 启动repmgrd守护进程。
- 应用层再次检查业务是否正常
六、其他案例
6.1 主备节点互换
提升node01 提升为primary 主节点,替换node2 为standby 备节点。
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | standby | running | node2 | running | 4463 | no | 0 second(s) ago
2 | node2 | primary | * running | | running | 3982 | no | n/a- 操作在 node1 节点上进行
[kingbase@node1 ~]$ repmgr standby switchover \
-h 172.24.0.156 \
-U esrep \
-d esrep \
--siblings-follow参数说明:
standby switchover→ 将备节点提升为主节点,并将原来的主节点降级为备节点。-h 172.24.0.156→ 指向即将升主的 standby(node1)--siblings-follow→ 让其他 standby 跟随新主
它会自动完成:停 node1 恢复 → promote node1 成主 → node2 降级重连为 standby → 更新 repmgr 元数据。整个过程秒级,业务短暂中断几秒。
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 7 |
2 | node2 | standby | running | node1 | default | 100 | 6 | 0 bytes
[kingbase@node1 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | * running | | running | 4463 | no | n/a
2 | node2 | standby | running | node1 | running | 3982 | no | 0 second(s) ago6.2 双主脑裂
双主集群脑裂,两个 primary 共存的原因分析:
- 集群健康状态下: node1 primary ,node2 standy。
- 主机node1 宕机,此时node2备机会自动升级成主机,集群状态发生改变。node2 提升为了 primary
- 原主机node1 在没有人工干预的情况下(rejoin),直接启动数据库。
sys_ctl start- 发生了双主集群脑裂现象,两个 primary 共存
[kingbase@node2 ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
1 | node1 | primary | ! running | | running | 4463 | no | n/a
2 | node2 | primary | * running | | running | 3982 | no | n/a
[WARNING] following issues were detected
- node "node1" (ID: 1) is running but the repmgr node record is inactive- 操作在 node1 节点上进行
#停旧主node1数据库
[kingbase@node1 ~]$ sys_ctl stop
#备份node1 数据
[kingbase@node1 ~]$ mv $KINGBASE_DATA ${KINGBASE_DATA}_bak_$(date +%Y%m%d_%H%M)
#node2(157) 克隆重建
[kingbase@node1 ~]$ repmgr standby clone -h 172.24.0.157 -U esrep -d esrep
#启动node1数据库
[kingbase@node1 ~]$ sys_ctl start
#注册到集群中
[kingbase@node1 ~]$ repmgr standby register --force- 查看集群状态
[kingbase@node1 ~]$ repmgr cluster show --compact
ID | Name | Role | Status | Upstream | Location | Prio. | TLI | LSN_Lag
----+-------+---------+-----------+----------+----------+-------+-----+---------
1 | node1 | primary | * running | | default | 100 | 9 |
2 | node2 | standby | running | node1 | default | 100 | 9 | 0 bytes
[kingbase@localhost ~]$ repmgr service status
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+-------+---------+--------------------
1 | node1 | primary | * running | | running | 14956 | no | n/a
2 | node2 | standby | running | node1 | running | 3982 | no | 1 second(s) ago七、参考
- [1] 人大金仓. 沙盘演练:读写分离集群高可用测试(V0.25)[R]. 金仓培训资料, 2026.06.13
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟