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
租户上操作)。
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 同步时,备集群不可用。
OceanBase 中的 reset slave all
MySQL 中通过 reset slave all
删除主备相关信息,从库可以作为一个独立的库,可读可写。
OceanBase 中通过主备集群解耦来实现删除主备集群关系,可参考官方文档,具体涉及生产环境,解耦步骤更为繁琐,此处不详细阐述。
OceanBase 与 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://opensource.actionsky.com/
关于 SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一文让你彻底掌握ThreadLocal
本文分享自华为云社区《【高并发】一文带你彻底搞懂ThreadLocal》,作者: 冰 河。 我们都知道,在多线程环境下访问同一个共享变量,可能会出现线程安全的问题,为了保证线程安全,我们往往会在访问这个共享变量的时候加锁,以达到同步的效果,如下图所示。 对共享变量加锁虽然能够保证线程的安全,但是却增加了开发人员对锁的使用技能,如果锁使用不当,则会导致死锁的问题。而ThreadLocal能够做到在创建变量后,每个线程对变量访问时访问的是线程自己的本地变量。 什么是ThreadLocal? ThreadLocal是JDK提供的,支持线程本地变量。也就是说,如果我们创建了一个ThreadLocal变量,则访问这个变量的每个线程都会有这个变量的一个本地副本。如果多个线程同时对这个变量进行读写操作时,实际上操作的是线程自己本地内存中的变量,从而避免了线程安全的问题。 ThreadLocal使用示例 例如,我们使用ThreadLocal保存并打印相关的变量信息,程序如下所示。 public class ThreadLocalTest { private static ThreadLocal&...
- 下一篇
加强 Kubernetes 能力:利用 CRD 定义多版本资源的实现方式
姚灿武,Rancher 中国研发工程师,拥有 7 年云计算领域经验,热衷开源技术,在云原生相关技术领域拥有丰富的开发和实践经验。 CRD,即自定义资源定义(Custom Resource Definition),是 Kubernetes API 中一个强大的扩展机制。通过 CRD,用户可以定义自己的资源类型,来扩展 Kubernetes 的 API 和资源类型。CRD 定义可以用于创建多个版本的资源,这对于 Kubernetes 集群的演变和升级非常有用。 在本文中,我们将介绍 Kubernetes CRD 的版本概念和使用方法;讨论如何在 CRD 中定义多个版本的资源,并讨论资源数据存储和数据转换的实现方式。最后,我们将介绍如何开发 CRD webhook,以便在 Kubernetes 中实现 CRD 版本兼容。 多版本 CRD 多版本 CRD 是指在 CRD 中定义多个版本的 API,每个版本的 API 可以有自己的规则,这样就可以在不影响旧版本应用程序的情况下,对新版本应用程序进行更新和升级。 要创建多版本 CRD,我们需要定义一个 Custom Resource Definit...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 2048小游戏-低调大师作品
- CentOS6,7,8上安装Nginx,支持https2.0的开启