OceanBase中binlog service 功能的试用

OBLogProxy简介

OBLogProxy即OceanBase的增量日志代理服务,它可与OceanBase建立连接并读取增量日志,从而为下游服务提供了变更数据捕获(CDC)的功能。

 关于OBLogProxy的详尽介绍与具体的安装指引,您可以参考这篇官方OBLogProxy文档  。

此服务主要具备两种模式,分别为CDC模式与binlog模式。

CDC 模式需结合 OBLogClient 来完成数据订阅,此客户端能够将接收到的 clog 日志数据转换成 LogMessage 对象,用户可以使用它们来定制自己的处理逻辑。鉴于该模式需用户想自行编写一些代码来解析和使用这个相对不那么通用的 LogMessage,因此本次我并未尝试使用它。

binlog 模式会生成和 MySQL 兼容的 binlog,binlog 比上面提到的 LogMessage 要通用的多,下游 MySQL 生态的组件都可以直接消费 binlog。所以我们能够通过这个模式,以很低的成本去复用 MySQL 生态工具,避免重复造轮子,我这次要试用的就是这个模式。

要把 OceanBase 的 clog 转成 binlog 往下游发送,一共分三步:

  1. 我们首先要有一个标准的 OceanBase 的集群。
  2. 然后会起一个叫 Binlog Service 的服务,它可以跟每个租户之间建立一个连接,去拉每一个租户的 clog 日志,把 clog 日志拉过来之后,会把它解析成 binlog 文件,然后存储到磁盘上。
  3. 外部的订阅服务,如果有需求的话,就可以给 Binlog Service 发一个 binlog dump 的命令,Binlog Service就会基于这个 binlog dump 命令的参数,把 binlog 数据往下游去发送。

1705632409

安装过程

升级 observer 和 proxy 的版本

根据官网上写的 binlog 模式的使用限制,先得升级一下 observer 和 proxy 到比较新的版本。

我这边的 observer 版本是符合要求的,但是 proxy 版本比较老,需要在官网上下载一个最新版本的 proxy 4.2.1,把软件版上传到 ocp,再拿鼠标点一下升级 proxy。

1705632430

然后等升级任务完成就好了,升级 proxy 大概要花两分钟左右的样子。

1705632442

安装 OBLogProxy

详见官网链接。看官网的架构图,oblogproxy 需要和 proxy 进行交互,所以我这里直接把 oblogproxy 放到了 proxy 所在的节点上,版本是 2.0.0。

[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby]
$sudo rpm -i oblogproxy-2.0.0-101000012023121819.el7.x86_64.rpm

安装一共分三步:配置 proxy,配置 oblogproxy,运行 oblogproxy。

配置 proxy

这里不求甚解,在安装 oblogproxy 的节点上用 proxy 连接测试集群的 sys 租户,然后直接照着官网链接和洪波博客的步骤把相关的几个配置命令都执行了一遍。

obclient -h11.124.5.45 -P2883 -uroot@proxysys#obn.xiaofeng.lby.11.158.31.20 -Dtest# 查询 binlog server 地址,当前为空
show proxyconfig like 'binlog_service_ip';# 配置 binlog service 地址
alter proxyconfig set binlog_service_ip="11.124.5.45:2983";# 开启 binlog 服务
alter proxyconfig set enable_binlog_service='True';# 设置 init_sql,开启 show_ddl_in_compat_mode。
# 开启后,OceanBase 的 show create table 输出将完全兼容 MySQL 的语法。
alter proxyconfig set init_sql='set _show_ddl_in_compat_mode = 1;';# 验证配置是否正确
show proxyconfig like 'binlog_service_ip';

其中有一步是设置 _show_ddl_in_compat_mode 这个东西,感觉挺有意思。官网上说:“OceanBase 的 DDL 语法与 MySQL 的 DDL 语法存在一定的差异,即 OceanBase 具有自己的一些扩展语法,因此部分 DDL 语法可能无法解析。为了解决这种问题,OceanBase 进行了兼容性支持。我们建议在 OBProxy 中设置 init_sql 来开启_show_ddl_in_compat_mode。开启后,OceanBase 的 show create table 输出将完全兼容 MySQL 的语法。”

TODO:不是特别理解官网上的这个说法,一会儿准备试试在 OceanBase 里创建一个 OceanBase 支持,但是 MySQL 不支持的 global index,看看生成的 binlog 结果是啥。

create table t1(c1 int primary key, c2 int, c3 int);
create unique index idx3 on t1(c3) partition by hash(c3);show create table t1\G
*************************** 1. row ***************************Table: t1
Create Table: CREATE TABLE `t1` (`c1` int(11) DEFAULT NULL,`c2` int(11) DEFAULT NULL,`c3` int(11) DEFAULT NULL,KEY `idx3` (`c3`) BLOCK_SIZE 16384 GLOBALpartition by hash(c3)
(partition `p0`)
)

配置 oblogproxy

这一步直接参考官网步骤,没遇到啥问题,这里略去不提。

运行 oblogproxy

这一步直接参考官网步骤,也没遇到啥问题,这里也略去不提。成功启动 oblogprxoy 之后,可以看到多了一个叫 binlog_converter 的进程。

[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /usr/local/oblogproxy]
$ps -ef | grep 'logproxy'
root      70452 131066 12 15:53 pts/7    00:00:51 ./binlog_converter binlog_converter.conf /usr/local/oblogproxy/run/obn.xiaofeng.lby.11.158.31.20/mysql
xiaofen+ 103276  76610  0 16:00 pts/4    00:00:00 grep --color=auto logproxy
root     131066 131059  2 15:39 pts/7    00:00:25 ./bin/logproxy -f ./conf/conf.json

正确性验证

参考了洪波的博客,知道了生成的 MySQL binlog 应该在 /usr/local/oblogproxy/run/cluster_name/tenant_name/data 这个路径下。

[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /usr/local/oblogproxy/run/obn.xiaofeng.lby.11.158.31.20/mysql/data]
$ls
index.LOCK  mysql-bin.000001  mysql-bin.index

因为要求 mysqlbinlog 的版本是 3.4,所以我在 MySQL 官网上下载了一个 5.7.9 版本的 MySQL,准备用这个版本的 MySQL 里自带的 mysqlbinlog 3.4 看下对应的 SQL 能否在原生 MySQL 里执行。

1705632458

这里鸡蛋里面挑下骨头,回到上面那个 global index 的问题,执行创建全局索引的 DDL,看下生成的 mysql-bin.000001 里面是什么东西,以及能否在 MySQL 下面执行。

在 OceanBase 下面执行这几条 SQL

create table t1(c1 int primary key, c2 int, c3 int);# 估计这条 DDL 生成的 binlog 在原生 MySQL 里无法成功执行
create unique index idx3 on t1(c3) partition by hash(c3);insert into t1 values(1, 2, 3);update t1 set c1 = 2;delete from t1;

这里也不求甚解直接照着洪波的命令执行。

[xiaofeng.lby@obvos-dev-d3 /home/xiaofeng.lby/work/mysql-5.7.9-linux-glibc2.5-x86_64/bin]
$./mysqlbinlog --no-defaults --base64-output=decode-rows -vv /home/xiaofeng.lby/work/mysql-bin.000001

看到的是下面这个结果:dml 部分的 update 被记录成了 delete + insert,都能对的上;ddl 部分好像有些小问题,OceanBase 里的独有的全局索引 idx3 被记录成了 create unique index idx3 on t1(c3) partition by hash(c3)。

1705632472

MySQL 里面不支持索引相对于主表有自己独立的分区,create unique index idx3 on t1(c3) partition by hash(c3) 显然是不可能执行成功的。可能需要改成 create unique index idx3 on t1(c3)?不过这样改含义好像变化的有点儿大,可能需要相关的产品同学确定清楚这里的产品行为究竟应该是怎样。

1705632482

总结

OceanBase 里和 MySQL 兼容的基础功能看上去生成的 binlog 没啥问题,但是 OceanBase 相对于 MySQL 独有的一些扩展功能,例如我测试的全局索引之类的,可能还值得产品同学和研发同学再继续打磨一下。

今天由于时间关系只是做了一个基本的小验证,还没来得及用下游的 canal、flink-cdc 等其他 mysql 生态工具向 proxy 执行 binlog dump 命令去测试,to be continue。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535596.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离散系统描述模型及其转换

离散系统描述模型及其转换 常用离散模型 \textbf{常用离散模型} 常用离散模型系统传递函数模型 t f \bf{tf} tf零-极点增益模型 z p k \bf{zpk} zpk极点留数模型 r p k \bf{rpk} rpk二次分式模型 s o s \bf{sos} sos状态变量模型 s s \bf{ss} ss 例题 常用离散模型 \textbf{常用…

Arrays.asList转换为List集合后使用add方法抛出UnsupportedOperationException

问题场景: 将String[] 数组转为 List集合,后对list集合进行添加删除报UnsupportedOperationException 百度原因: Arrays.asList返回的集合不支持元素的添加和删除(不支持add、addAll、remove方法),否则抛出…

nginx实时流量拷贝ngx_http_mirror_module

参考: Module ngx_http_mirror_module Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 ngx_http_mirror_module用于实时流量拷贝 请求一个接口,想实时拷贝这个请求转发到自己的服务上,可以使用ngx_http_mirror_module模块。 官网好像…

Java Web实战(四)Web后端之MyBatis-基础用法详解

文章目录 1. 使用MyBatis1-1. JDBC介绍1-2. 数据库连接池1-3. Lombook 2. mybatis 基础2-2. CURD操作2-2-1. delete 操作2-2-2. 预编译sql2-2-3. 插入语句2-2-4. XML-SQL2-2-5. insert主键回显 2-3. 查询语句 3. 动态SQL3-1. <if> MyBatis是一款优秀的 持久层 框架&#…

STM32点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

前端的数据标记协议

文章目录 数据标记协议是什么数据标记协议的作用常见的数据标记协议Open Graph protocol 开放图谱协议基本元数据协议可选元数据结构化属性 —— 元数据的属性多个相同的元数据标签类型元数据的使用方法全局类型使用自定义类型使用对象类型使用歌曲对象类型视频对象类型文章对象…

C++学习路线

C学习路线思维导图&#xff0c;肝了一个星期终于搞定&#xff0c;这么硬核求个赞不过分吧&#xff1f; 思维导图的内容&#xff0c;也是本文的内容框架&#xff0c;坐稳扶好&#xff0c; C 高速快车要发车了&#xff01; 内容我会持续更新&#xff0c;点赞收藏&#xff0c;…

用户视角的比特币和以太坊外围技术整理

1. 引言 要点&#xff1a; 比特币L2基本强调交易内容的隐蔽性&#xff0c;P2P交易&#xff08;尤其是支付&#xff09;成为主流&#xff0c;给用户带来一定负担&#xff08;闪电网络&#xff09;在以太坊 L2 中&#xff0c;一定程度上减少了交易的隐蔽性&#xff0c;主流是实…

罐头鱼AI批量剪辑短视频系统|视频矩阵获客

智能化管理&#xff0c;轻松批量剪辑短视频&#xff01;AI系统助力您的视频营销提效&#xff01; 随着短视频营销的兴起&#xff0c;我们推出了一款AI批量剪辑短视频系统&#xff0c;QQ:290615413让视频制作更加智能高效。以下是系统的主要功能特点&#xff1a; 首页显示&#…

Android Gradle 开发与应用 (六) : 创建buildSrc插件和使用命令行创建Gradle插件

1. 前言 前文中&#xff0c;我们介绍了在Android中&#xff0c;如何基于Gradle 8.2&#xff0c;创建Gradle插件。这篇文章&#xff0c;我们以buildSrc的方式来创建Gradle插件。此外&#xff0c;还介绍一种用Cmd命令行的方式&#xff0c;来创建独立的Gradle插件的方式。 1.1 本…

技术派整合MyBatis-Plus

Mybatis-Plus大家都熟悉了吧&#xff1f;是一个Mybatis的增强&#xff0c;提供了一些额外功能&#xff0c;比如条件构造器、分页插件、代码生成器等以便我们更专注于业务&#xff0c;而不是SQL语句的编写 官方教程&#xff1a;简介 | MyBatis-Plus 整合MyBatis-Plus 非常简单…

【大数据开发--概念篇】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;书生♡&#xff0c;今天主要和大家分享一下大数据的相关概念&#xff0c;以及我们大数据开发的环境&#xff0c;希望对大家有所帮助。 &#x1f49e;&#x1f49e;路漫漫&#xff0c;希望大家坚持下去&#xff0…