体验OceanBase 的binlog service

news2024/12/23 9:44:22

OceanBase对MySQL具备很好的兼容性。目前,已经发布了开源版的binlog service工具,该工具能够将OceanBase特有的clog模式转换成binlog模式,以便下游工具如canal、flink cdc等使用。今天,我们就来简单体验一下这个binlog service的功能,并利用mysql binlog工具进行解析,看看转换是否准确无误。

binlog service 依赖oblogproxy,是 oblogproxy 提供的一种服务模式,当 binlog_mode = true 时,则提供兼容原生 mysql binlog 的服务,包含相关sql、binlog文件生成及binlog dump服务,因此想要使用binlog service功能,需要下载oblogproxy,可在OceanBase官网进行下载:下载中心,找到 OceanBase日志代理服务 (OBLogProxy)

关于binlog service相关文档可以先在github上查看:binlog service文档

相关介绍

  • obproxy: ob 代理服务,sql 和 binlog 都将通过 obproxy 作为统一入口来访问 ob,其中的 binlog 包含了 binlog 相关的命令(如:show binlog events;)、binlog replication(即binlog复制协议)
  • oblogproxy: ob 日志代理服务,提供了 mysql binlog 的兼容能力(包含了 binlog 相关命令和 binlog replication)
  • bc: oblogproxy 中 binlog converter 子进程,通过 libobcdc 拉取和解析 clog,转换为 binlog 文件
  • bd: oblogproxy 中 binlog dumper 子进程,对下游(canal or flinkcdc or ...) binlog dump 请求提供 binlog events 订阅服务
  • bcm: oblogproxy 中 bc 进程的管理模块
  • bdm: oblogproxy 中 bd 进程的管理模块

整个架构图如下:oblogproxy通过连接集群的obproxy,获取集群日志信息,通过oblogproxy将其转换为binlog模式。下游的canal、flink cdc等,也是通过连接obproxy组件来消费binlog。

1702608197

相关限制

  • 目前binlog service功能,要求observer版本至少 >= 4.2.1,obproxy >= 4.2.1;
  • OB针对enum、set所实现的拓展语义不支持,比如set定义数支持超过64个、支持重复、enum支持插入未定义数据(比如'')等
  • varchar(65536)定义不支持
  • 不支持gis类型
  • 另外对于MySQL的一些DDL,存在一定的差异,可能导致解析出的binlog在MySQL不兼容,不过为解决这种问题observer做了兼容性支持,建议obproxy设置 init_sql 开启 _show_ddl_in_compat_mode ,开启后observer show create table输出会完全兼容mysql的语法,建议设置为租户级别

环境介绍

这里总共4台机器,分别安装一套3节点OceanBase集群,1个oblogproxy服务

IP角色
172.24.255.54oblogproxy
172.24.255.56OBServer、OBProxy
172.24.255.57OBServer
172.24.255.58OBServer

安装及配置

OBProxy配置

从上面的基本架构图可以看出,不论是oblogproxy还是canal、flink cdc,都是与obproxy进行交互,canal、flink cdc等不感知 oblogproxy(即真正提供的 binlog service 服务的组件),下游的请求是由 obproxy 转发给 observer 或 oblogproxy,

因此在 obproxy 上需要配置 oblogproxy 的服务地址。

# 连接到obproxy上,通过obproxy连接集群或者直连obproxy
[root@OB1 ~]# obclient -h172.24.255.56 -P2883 -uroot@sys#myoceanbase -pxxx -Doceanbase -A

# 查询binlog server 地址,当前为空
obclient [oceanbase]> show proxyconfig like 'binlog_service_ip';
+-------------------+-------+-----------------------------------------+-------------+---------------+
| name              | value | info                                    | need_reboot | visible_level |
+-------------------+-------+-----------------------------------------+-------------+---------------+
| binlog_service_ip |       | binlog service ip, format ip1:sql_port1 | false       | SYS           |
+-------------------+-------+-----------------------------------------+-------------+---------------+
1 row in set (0.001 sec)

# 配置binlog server 地址,地址形式为ip:port
obclient [oceanbase]> alter proxyconfig set binlog_service_ip="172.24.255.54:2983";
Query OK, 0 rows affected (0.004 sec)

# 开启binlog服务的转发
obclient [oceanbase]> alter proxyconfig set enable_binlog_service='True';

# 设置init_sql,可以设置通过该obproxy的session链接都在session级别设置一些系统变量
obclient [oceanbase]> alter proxyconfig set init_sql='set _show_ddl_in_compat_mode = 1;';
binlog service安装及启动

下载安装包,上传到服务器上,执行安装

[root@OB2 ~]# rpm -ivh oblogproxy-2.0.0-100000012023111521.el7.x86_64.rpm

默认安装家目录会在 /usr/local/oblogproxy

修改配置文件,配置文件为家目录下conf/conf.json

[root@OB2 ~]# cd /usr/local/oblogproxy
[root@OB2 oblogproxy]# vim conf/conf.json
# 主要修改下面几项内容,打开binlog,然后修改几个路径为绝对路径
"binlog_mode": true
"oblogreader_path": "/usr/local/oblogproxy/run"
"bin_path": "/usr/local/oblogproxy/bin"
"oblogreader_obcdc_ce_path_template": "/usr/local/oblogproxy/obcdc/obcdc-ce-%d.x-access/libobcdc.so"
"binlog_log_bin_basename": "/usr/local/oblogproxy/run"
"binlog_obcdc_ce_path_template": "/usr/local/oblogproxy/obcdc/obcdc-ce-%d.x-access/libobcdc.so"

其他相关配置内容,可参考binlog service文档

配置账户,这里因为账户和密码都需要加密,在配置文件中不能直接明文填写,所以需要调用config_sys函数,来对用户名和密码加密并替换conf.json文件中的ob_sys_username,ob_sys_password

[root@OB2 oblogproxy]# ./run.sh config_sys ${sys_usr} ${sys_pwd}
# 这里会提示要更新conf.json文件中的ob_sys_username,ob_sys_password,填y即可
DEPLOY_PATH : /usr/local/oblogproxy

!!DANGER!! About to update logproxy conf/conf.json, Please confirm? [Y/n] y

注意,这里填写的用户名、密码,必须是sys租户的,例如root@sys#cluster_name,填写时需要用双引号将用户名密码括起来。

启动binlog service

# start 启动 oblogproxy 服务进程
[root@OB2 oblogproxy]# ./run.sh start

查看日志,看下是否有报错,日志在log目录下

[root@OB2 oblogproxy]# cat log/logproxy.log
[2023-12-06 15:51:34] [info] environmental.cpp(27): Max file descriptors: 655350
[2023-12-06 15:51:34] [info] environmental.cpp(34): Max processes/threads: 655360
[2023-12-06 15:51:34] [info] environmental.cpp(41): Core dump size: 18446744073709551615
[2023-12-06 15:51:34] [info] environmental.cpp(48): Maximum number of pending signals: 252872
[2023-12-06 15:51:34] [info] binlog_server.cpp(66): Start pull up all BC processes
[2023-12-06 15:51:34] [info] binlog_server.cpp(76): The current binlog converter [myoceanbase,obtest]is alive and the pull action is terminated
[2023-12-06 15:51:34] [info] binlog_server.cpp(76): The current binlog converter [myoceanbase,obtest]is alive and the pull action is terminated
[2023-12-06 15:51:34] [info] binlog_server.cpp(89): Finish to pull up 1 BC processes
[2023-12-06 15:51:34] [info] event_wrapper.cpp(43): Succeed to listen socket with port: 2983
[2023-12-06 15:51:34] [info] binlog_server.cpp(47): Start OceanBase binlog server on port 2983

配置binlog service

目前binlog service已经启动成功,但是需要指定获取哪个租户的binlog,需要登录到oblogproxy上,创建binlog订阅子进程,官网给出的具体语法如下:

CREATE BINLOG [IF NOT EXISTS] FOR TENANT `cluster`.`tenant` [TO USER `user` PASSWORD `pwd`] [FROM <timestamp>] WITH CLUSTER URL `<cluster url>`[, INITIAL_TRX_XID `ob_txn_id`, INITIAL_TRX_GTID_SEQ `gtid_seq`];

-- 支持对binlog服务指定账户名与密码(用于订阅OB日志,4.x可以指定为业务租户)
[TO USER `user` PASSWORD `pwd`]

-- 支持指定oceanbase的事务id与binlog的gitd做映射
-- INITIAL_TRX_XID: ob的事务id
-- INITIAL_TRX_GTID_SEQ: 映射的gitd seq
[, INITIAL_TRX_XID `ob_txn_id`, INITIAL_TRX_GTID_SEQ `gtid_seq`]

-- 示例:
CREATE BINLOG FOR TENANT `cluster`.`tenant` TO USER `user` PASSWORD `pwd` FROM 1668339370000000 WITH CLUSTER URL 'cluster_url', SERVER UUID '2340778c-7464-11ed-a721-7cd30abc99b4', INITIAL_TRX_XID '97984179', INITIAL_TRX_GTID_SEQ '31';

上面几个参数的获取方式,连接到目标observer集群,执行:

timestamp:select time_to_usec(NOW());

clustet_url:show parameters like '%url%'

SERVER UUID: show global variables like '%uuid';

INITIAL_TRX_XID: select * from GV$OB_TRANSACTION_PARTICIPANTS;

INITIAL_TRX_GTID_SEQ: 1 # 第一次启动的话,这里可以随意指定一个数字

在第一次启动的时候,也可以不用指定时间戳、INITIAL_TRX_XID和INITIAL_TRX_GTID_SEQ,系统会自动进行配置,这里我执行启动的命令,并查看状态:

[root@OB2 oblogproxy]# mysql -A -c -h 127.0.0.1 -P 2983
MySQL [(none)]> CREATE BINLOG FOR TENANT `myoceanbase`.`obtest` TO USER `root` PASSWORD `xxxx` WITH CLUSTER URL 'http://172.24.255.53:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=myoceanbase', SERVER UUID 'xxxx-xxx-xx-xx-xxxxxx';
MySQL [(none)]> SHOW BINLOG STATUS\G;
*************************** 1. row ***************************
cluster: myoceanbase
 tenant: obtest
 status: {
	"binlog_files" :
	[
		{
			"binlog_name" : "mysql-bin.000001",
			"binlog_size" : 178
		}
	],
	"client_id" : "/usr/local/oblogproxy/run/myoceanbase/obtest",
	"cpu_status" :
	{
		"cpu_count" : 16,
		"cpu_used_ratio" : 0.12666244804859161
	},
	"disk_status" :
	{
		"disk_total_size_mb" : 503837,
		"disk_usage_size_process_mb" : 0,
		"disk_used_ratio" : 0.45975583791732788,
		"disk_used_size_mb" : 231642
	},
	"memory_status" :
	{
		"mem_total_size_mb" : 63238,
		"mem_used_ratio" : 0.0,
		"mem_used_size_mb" : 735
	},
	"network_status" :
	{
		"network_rx_bytes" : 0,
		"network_wx_bytes" : 0
	},
	"pid" : 7605
}
1 row in set (0.00 sec)

启动之后,可以看到订阅的子进程binlog_converter已经开启

1702608225

此时,在家目录下的run/myoceanbase/obtest/data/下面,就会自动生成mysql-bin文件

1702608245

至此,整个配置启动过程就已经完毕,源OceanBase集群的增删改查都可以抓取到,并写入到mysql-bin文件中

解析binlog

最后一步,我们尝试在源集群中写入数据,使用mysqlbinlog工具进行解析,看下是否解析正常

这里要求mysqlbinlog版本为Ver 3.4版本,对应的mysql版本大概为5.7.9

1702608266

这里在源端执行一个建表和插入数据,看下是否能解析出来

1702608280

解析结果

1702608301

以上是对OceanBase 的 binlog service做的一个简单测试,大家有兴趣的话,可以下载下来,实际测试和使用,有问题的话,也可以直接给官方提issue,其他相关命令,在github上也可以查到,后续在官网也会推出binlog service的文档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Educational Codeforces Round 163 (Rated for Div. 2) E. Clique Partition

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它&#xff0c;因为我不常用访达的搜索窗口&#xff0c;更多的是想快速打开访达文件夹窗口&#xff0c;可以通过第三方软件定义访达的快…

测开——Java、python、SQL、数据结构面试题整理

一、Java 1.Java中finally、final、finalize的区别 1.性质不同 &#xff08;1&#xff09;final为关键字; &#xff08;2&#xff09;finalize()为方法; &#xff08;3&#xff09;finally为为区块标志,用于try语句中; 2. 作用 &#xff08;1&#xff09;final为用于标识…

【通信原理笔记】【三】模拟信号调制——3.2 双边带抑制载波调制(DSB-SC)

文章目录 前言一、DSB-SC的数学表示二、DSB-SC的相干解调三、DSB-SC的性能评价总结 前言 从这一篇开始我们依次介绍几种模拟信号调制的方法&#xff0c;包括其数学表达式&#xff0c;系统框图、解调方式、性能评价等。 一、DSB-SC的数学表示 将 m ( t ) m(t) m(t)作为已调信号…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS&#xff0c;简明记录 上传文件到oss的方式&#xff1a; **后端上传&#xff1a;**文件先要从页面上传到后端存起来&#xff0c;再通过后端发送到oss&#xff0c;然后后端将存起来的文件删除&#xff08;当然可以不删&#xff09;。 **前端上传&…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

4-Linux实用操作

1. 各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux 某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键 ctrl c 命令输入错误&#xff0c;也可以通过快捷键 ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl …

P6维护:Oracle P6服务性能优化

前言 本文将介绍如何对ORACLE Primavera P6 EPPM软件进行性能调优&#xff0c;考虑到P6主要采用JAVA语言编制&#xff0c;且其使用的是Weblogic Server应用服务器部署P6各项服务器&#xff0c;其性能优化的原理便是基于其JVM特征参数进行设置 方法一&#xff1a;修改配置文件…

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台&#xff0c;汇集了丰富的职位信息&#xff0c;对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序&#xff0c;我们可以自动化地收集这些信息&#xff0c;为求职决策和市场研究提供数据支持。Node.js以其非阻…

Intel FPGA (2):线性序列机

Intel FPGA (2)&#xff1a;线性序列机 前提摘要 个人说明&#xff1a; 限于时间紧迫以及作者水平有限&#xff0c;本文错误、疏漏之处恐不在少数&#xff0c;恳请读者批评指正。意见请留言或者发送邮件至&#xff1a;“Email:noahpanzzzgmail.com”。本博客的工程文件均存放在…

预处理指令——一些比较少见的概念

前言&#xff1a;预处理是我们的c语言源代码成为可执行程序的第一个步骤。而宏和预处理指令都是在这个阶段完成。本节内容就是关于宏和预处理指令相关知识点的解析。 目录 宏 预定义符号 #define定义常量 #define定义符号 #define定义宏 带副作用的宏参数 宏的替换规则…

【C语言基础】:自定义类型(二) -->联合和枚举

文章目录 一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体练习 二、枚举类型2.1 枚举类型的声明2.2 枚举的优点 书山有路勤为径&#xff0c;学海无涯苦作舟。 创作不易&#xff0c;宝子们&#xff01;如果这篇…

嵌入式介绍

1、嵌入式系统学习的三条路线 单片机入门HAL 单片机核心/RTOS Liuxc 2.学习嵌入式的三条路线的优缺点 2.1.单片机入门(HAL) 简单、快速&#xff0c;实际上工作中涉及单片机编程时&#xff0c;也提倡使用HAL库。 对于学习来说&#xff0c;HAL封装了很多技术细节&#xff0c…

使用虚拟引擎为AR体验提供动力

Powering AR Experiences with Unreal Engine ​​​​​​​ 目录 1. 虚拟引擎概述 2. 虚拟引擎如何为AR体验提供动力 3. 虚拟引擎中AR体验的组成部分是什么&#xff1f; 4. 使用虚拟引擎创建AR体验 5. 虚拟引擎中AR的优化提示 6. 将互动性融入AR与虚拟引擎 7. 在AR中…

Python反爬案例——验证码的识别

验证码的识别 使用打码平台识别验证码 利用打码平台可以轻松识别各种各样的验证码&#xff0c;图形验证码、滑动验证码、点选验证码和逻辑推理验证码。打码平台提供了一系列API&#xff0c;只需要向API上传验证码图片&#xff0c;它便会返回对应的识别结果。 使用超级鹰平台…

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要&#xff0c;给公司写过一整套直播的库( 推拉流&#xff0c;编解码)&#xff0c;类似于 libobs。 结果后来因为没有相关项目&#xff0c;便停止开发&维护了。 不过里面很多有用的组件&#xff0c;然后也挺好用的&#xff0c;遂开源出来一部分。…

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…

怎么在UE游戏中加入原生振动效果

我是做振动触感的。人类的五感“视听嗅味触”&#xff0c;其中的“触”就是触觉&#xff0c;是指皮肤、毛发与物体接触时的感觉。触感可以带来更加逼真的沉浸式体验。但也许过于司空见惯&#xff0c;也是习以为常&#xff0c;很多人漠视了触感的价值。大家对触感的认知还远远不…

skywalking idea中启动调试报错Output path is shared between the same module error

报错信息 简单描述&#xff1a;就是多个moudle一样用了一样的输出路径&#xff0c;这样容易造成冲突 Output path is shared between the same module error 参考&#xff1a;scala - Output path is shared between the same module error - Stack Overflow 解决方法&…