KingbaseES V8R6流复制案例之---同步转异步测试

案例说明:
架构为单纯的一主一备流复制,没有repmgr的集群管理,测试备库数据库服务down,是否支持流复制从同步自动转换为异步。

一、相关参数配置

1、kingbase.auto.conf配置

[kingbase@node201 data]$ cat kingbase.auto.conf
primary_conninfo = 'user=system connect_timeout=10 host=192.168.1.202 port=54328  keepalives=1 keepalives_idle=10 keepalives_interval=1 keepalives_count=3 tcp_user_timeout=9000  application_name=node1'
primary_slot_name = 'repmgr_slot_1'
wal_sender_timeout = '30000'
synchronous_standby_names = '1 (node2)'
synchronous_commit = 'on'

2、参数配置

prod=# show wal_sender_timeout;
 wal_sender_timeout
--------------------
 30s
(1 row)

test=# show synchronous_standby_names;
 synchronous_standby_names
---------------------------
 1(node2)
(1 row)

3、流复制状态(sync)

test=# select * from sys_stat_replication;
 pid  | usesysid | usename | application_name |  client_addr  | client_hostname | client_port |       back
end_start        | backend_xmin |   state   | sent_lsn | write_lsn  | flush_lsn  | replay_lsn | write_lag
| flush_lag | replay_lag | sync_priority | sync_state |         reply_time
------+----------+---------+------------------+---------------+-----------------+-------------+-----------
-----------------+--------------+-----------+----------+------------+------------+------------+-----------
+-----------+------------+---------------+------------+----------------------------
 4931 |       10 | system  | node2            | 192.168.1.202 |                 |       59817 | 2024-07-08
 15:01:47.740049 |              | streaming |          | 0/29959988 | 0/29959988 | 0/29959988 |
|           |            |             1 | sync       | 2024-07-08 15:03:28.069166
(1 row)

流复制为sync模式:

二、测试脚本

[kingbase@node201 bin]$ cat ins.sh
#!/bin/bash

echo 'Insert rows test ....'

while true
do
sleep 1
/opt/Kingbase/ES/V9R1/Server/bin/ksql -U system prod -p 54328 <<EOF
insert into tb1 values(generate_series(1,1),now());
EOF
done

三、执行事务测试
在测试过程中,将备库数据库服务down,查看事务操作是否会继续执行(同步转异步):

1、执行事务

[kingbase@node201 bin]$ sh ins.sh
Insert rows test ....
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
.......

2、关闭备库数据库服务

[kingbase@node202 bin]$ ./sys_ctl stop -D /home/kingbase/db/mysql/data/
waiting for server to shut down.... done
server stopped

3、主备流复制断开

test=# select * from sys_stat_replication;
 pid  | usesysid | usename | application_name |  client_addr  | client_hostname | client_port |       back
end_start        | backend_xmin |   state   | sent_lsn | write_lsn  | flush_lsn  | replay_lsn | write_lag
| flush_lag | replay_lag | sync_priority | sync_state |         reply_time
------+----------+---------+------------------+---------------+-----------------+-------------+-----------
-----------------+--------------+-----------+----------+------------+------------+------------+-----------
+-----------+------------+---------------+------------+----------------------------

(0 row)

4、查看已写入数据
此时,事务已处于停止状态(同步状态,备库数据库服务down,事务无法commit,需要等待备库ack,如果sync自动转换为 async后,事务将继续执行),表里已经插入的数据如下:

prod=# select count(*) from tb1;
 count
-------
    25
(1 row)

---在等待2分钟后,事务仍处于停止等待状态,说明流复制没有自动从同步转为异步。

三、手工同步转异步

1、配置synchronous_commit

如下所示 ,synchronous_commit 默认为on(事务commit,需等待备库wal日志写入磁盘,并返回ack给主库后,才能完成事务的commit。):

prod=# show synchronous_commit ;
 synchronous_commit
--------------------
 on
(1 row)

配置synchronous_commit =local(事务commit,只需要将主库wal日志写入到本地磁盘后,即返回ack,完成事务commit):

prod=# alter system set synchronous_commit='local';
ALTER SYSTEM
prod=# select sys_reload_conf();
 sys_reload_conf
-----------------
 t
(1 row)

prod=# show synchronous_commit ;
 synchronous_commit
--------------------
 local
(1 row)

配置synchronous_commit =local后,发现事务仍然处于等待状态,写入数据没有变化:

prod=# select count(*) from tb1;
 count
-------
    25

2、配置synchronous_standby_names

prod=# show synchronous_standby_names ;
 synchronous_standby_names
---------------------------
 1(node2)
(1 row)

prod=# alter system set synchronous_standby_names='';
ALTER SYSTEM
prod=# select sys_reload_conf();
 sys_reload_conf
-----------------
 t
(1 row)

prod=# show synchronous_standby_names ;
 synchronous_standby_names
---------------------------

(1 row)

配置synchronous_standby_names=‘’后,事务继续执行(流复制同步转为异步):

prod=# select count(*) from tb1;
 count
-------
    48
(1 row)

四、总结
对于单纯的主备流复制架构(无集群管理),在所有备库数据库服务down后,默认流复制不支持从同步模式转换为异步模式(不受wal_sender_timeout参数控制),需要通过人为干预,强制从同步转换为异步。

posted @   天涯客1224  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示