OceanBase 是如何关闭主备线程的?

本文总结了 OceanBase 与 MySQL 在主备同步命令和数据保护上的区别。

作者:何文超

爱可生南区交付服务部 DBA 团队成员,主要负责 MySQL 故障处理,MySQL 高可用架构改造,OceanBase 相关技术支持。爱好足球,羽毛球。

本文来源:原创投稿

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

背景

在 MySQL 主备同步中,存在 stop slave;reset slave all 这样的命令来控制关闭主备线程,删除主备相关信息。

那么在分布式的 OceanBase 中是否存在类似场景?两者的命令是否相同?又有什么区别?

说明

  • MySQL 中是主备库同步;OceanBase 中类似场景存在于主备集群中。
  • OceanBase 主备集群没有 stop slave; reset slave all 的命令,但有类似场景。

下面来详细介绍 OceanBase 中的 "stop slave; reset slave all"。

环境准备

一套 OceanBase 主备集群。

OceanBase 中的 stop slave

下面通过几个实验,来验证 clog 是如何影响 OceanBase 主备机群状态的。

实验 1:关闭 clog,集群是否可用?

关闭 clog 同步(在主集群 sys 租户上操作)。

shell 复制代码
MySQL [(none)]> alter system disable cluster synchronization 'hwc_cluster' cluster_id=1682755173;
//hwc_clog:备集群名
//cluster_id:备集群 ID

查看同步状态(在主集群 sys 租户上操作)。

shell 复制代码
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 天:

shell 复制代码
MySQL [(none)]> ALTER SYSTEM SET clog_expire_days=1;

1 天后,主集群插入新数据。

shell 复制代码
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 租户上操作)。

shell 复制代码
MySQL [(none)]> alter system enable cluster synchronization 'hwc_cluster' cluster_id=1682755173;
//hwc_clog:备集群名
//cluster_id:备集群 ID

检查备集群是否同步到新数据?(连接串需要添加 -c

shell 复制代码
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)。

shell 复制代码
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)。

shell 复制代码
MySQL [lpp]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
ERROR 4012 (HY000): Timeout

结论:当停止 clog 同步时,备集群不可用。

OceanBase 中的 reset slave all

MySQL 中通过 reset slave all 删除主备相关信息,从库可以作为一个独立的库,可读可写。

OceanBase 中通过主备集群解耦来实现删除主备集群关系,可参考官方文档,具体涉及生产环境,解耦步骤更为繁琐,此处不详细阐述。

OceanBase 与 MySQL 的区别?

那么,OceanBase 主备集群与 MySQL 主备库,在关闭主备线程,删除主备相关信息上有哪些区别呢?

MySQL

  1. 命令操作位置:备库
  2. 停止同步命令:stop slave
  3. 删除主备关系:reset slave all
  4. 当 binlog 同步断开,主节点日志过期,重新打开日志同步:备库会丢数据
  5. 当 binlog 同步断开,备库是否可用:备库可用

OceanBase

  1. 命令操作位置:主集群
  2. 停止同步命令:alter system disable cluster synchronization 'hwc_cluster' cluster_id=xxxxxxxxx
  3. 删除主备关系:主备库解耦(较为繁琐,OCP V3.3.0 可以白屏化操作)
  4. 当 clog 同步断开,主节点日志过期,重新打开日志同步:备集群不会丢数据
  5. 当 clog 同步断开,备库是否可用:备集群不可用

更多技术文章,请访问:opensource.actionsky.com/

相关推荐
Runing_WoNiu3 小时前
Mysql与Ooracle 索引失效场景对比
数据库·mysql·oracle
哈基米喜欢哈哈哈6 小时前
Uber的MySQL实践(一)——学习笔记
数据库·笔记·后端·mysql
哥哥还在IT中6 小时前
MVCC 实现之探析
数据库·mysql·tidb
野蛮人6号8 小时前
MySQL笔记
数据库·笔记·mysql
苹果醋39 小时前
Deep Dive React 4 How does React State actually work
java·运维·spring boot·mysql·nginx
Ai财富密码10 小时前
【Python爬虫】正则表达式入门及在数据提取中的高效应用
数据库·mysql·php
tq108612 小时前
MySQL definer does not exist 问题分析
mysql
叁沐14 小时前
MySQL 25 MySQL是怎么保证高可用的?
mysql
惊骇世俗王某人19 小时前
MySQL数据库索引及底层数据结构
数据结构·数据库·mysql
神仙别闹1 天前
基于Python+Vue+Mysql实现(物联网)智能大棚
vue.js·物联网·mysql