推选一篇自爱可生开源社区,正文如下:
1背景
在 MySQL 主备同步中,存在 stop slave;reset slave all
这样的命令来控制关闭主备线程,删除主备相关信息。
那么在分布式的 OceanBase 中是否存在类似场景?两者的命令是否相同?又有什么区别?
说明
MySQL 中是主备库同步;OceanBase 中类似场景存在于主备集群中。 OceanBase 主备集群没有 stop slave; reset slave all
的命令,但有类似场景。
下面来详细介绍 OceanBase 中的 “stop slave; reset slave all
“。
环境准备
一套 OceanBase 主备集群。
2OceanBase 中的 stop slave
下面通过几个实验,来验证 clog 是如何影响 OceanBase 主备集群状态的。
实验 1:关闭 clog,集群是否可用?
关闭 clog 同步(在主集群 sys
租户上操作)。
MySQL [(none)]> alter system disable cluster synchronization 'hwc_cluster' cluster_id=1682755173;
//hwc_clog:备集群名
//cluster_id:备集群 ID复制
查看同步状态(在主集群 sys
租户上操作)。
MySQL [(none)]> select * from oceanbase.v$ob_standby_status\G;
*************************** 1. row ***************************
cluster_id: 1682755173
cluster_name: hwc_cluster
cluster_role: PHYSICAL STANDBY
cluster_status: DISABLED
current_scn: 1688630508000921
rootservice_list: 10.186.64.63:2882:2881
redo_transport_options: ASYNC NET_TIMEOUT = 30000000
protection_level: MAXIMUM PERFORMANCE
synchronization_status: CLUSTER IS DISABLED
1 row in set (0.00 sec)
//synchronization_status:CLUSTER IS DISABLED
//主备集群断开 clog 日志同步复制
结论:关闭 clog 同步,OceanBase 主备集群关闭。
实验 2:特殊情况下,新数据是否丢失?
验证一下,当 【主备集群 clog 同步断开时间】 > 【clog 的保留时间】,再次开启主备集群间的 clog 同步,新数据是否丢失?
修改 clog 保留天数为 1 天:
MySQL [(none)]> ALTER SYSTEM SET clog_expire_days=1;
复制
1 天后,主集群插入新数据。
MySQL [lpp]> select * from test;
+------+------+
| c1 | c2 |
+------+------+
| 1 | eee |
| 2 | eee |
| 3 | eee |
+------+------+
3 rows in set (0.01 sec)
MySQL [lpp]> insert into test(c1,c2) values(4,'ddd');
Query OK, 1 row affected (0.02 sec)复制
开启 clog 同步(主集群 sys
租户上操作)。
MySQL [(none)]> alter system enable cluster synchronization 'hwc_cluster' cluster_id=1682755173;
//hwc_clog:备集群名
//cluster_id:备集群 ID复制
检查备集群是否同步到新数据?(连接串需要添加 -c
)
MySQL [lpp]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
+------+------+
| c1 | c2 |
+------+------+
| 1 | eee |
| 2 | eee |
| 3 | eee |
| 4 | ddd |
+------+------+
4 rows in set (0.00 sec)复制
结论:备集群同步到新数据。
原理:当开启主备集群 clog 同步,会自动检测数据一致性,如发现数据不一致,会自动拉取基线数据进行同步。
4:停止 clog 同步后,备集群是否可用?
clog 正常同步时,备集群查询数据(连接串需要添加 -c)。
MySQL [LPP]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
+------+------+
| c1 | c2 |
+------+------+
| 1 | eee |
| 2 | eee |
| 3 | eee |
| 4 | ddd |
+------+------+
4 rows in set (0.00 sec)复制
停止 clog 同步;备集群查询数据(连接串需要添加 -c)。
MySQL [lpp]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
ERROR 4012 (HY000): Timeout复制
结论:当停止 clog 同步时,备集群不可用。
3OceanBase 中的 reset slave all
MySQL 中通过 reset slave all
删除主备相关信息,从库可以作为一个独立的库,可读可写。
OceanBase 中通过主备集群解耦来实现删除主备集群关系,可参考官方文档[1],具体涉及生产环境,解耦步骤更为繁琐,此处不详细阐述。
4OceanBase 与 MySQL 的区别?
那么,OceanBase 主备集群与 MySQL 主备库,在关闭主备线程,删除主备相关信息上有哪些区别呢?
MySQL
命令操作位置:备库 停止同步命令: stop slave
删除主备关系: reset slave all
当 binlog 同步断开,主节点日志过期,重新打开日志同步:备库会丢数据 当 binlog 同步断开,备库是否可用:备库可用
OceanBase
命令操作位置:主集群 停止同步命令: alter system disable cluster synchronization 'hwc_cluster' cluster_id=xxxxxxxxx
删除主备关系:主备库解耦(较为繁琐,OCP V3.3.0 可以白屏化操作) 当 clog 同步断开,主节点日志过期,重新打开日志同步:备集群不会丢数据 当 clog 同步断开,备库是否可用:备集群不可用
参考资料
解耦备集群流程: https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000946147
阅读推荐
技术分享 | 一招解决 MySQL 中 DDL 被阻塞的问题