体验OceanBase 的binlog service

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。

相关限制

  • 目前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.54 | oblogproxy |
| 172.24.255.56 | OBServer、OBProxy |
| 172.24.255.57 | OBServer |
| 172.24.255.58 | OBServer |

安装及配置

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已经开启

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

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

解析binlog

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

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

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

解析结果

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

相关推荐
OceanBase数据库官方博客1 天前
OceanBase 中常用的查询语句
sql·oceanbase·分布式数据库·查询语句
OceanBase数据库官方博客4 天前
如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践
java·运维·oceanbase·分布式数据库
OceanBase数据库官方博客4 天前
如何配置 Flink CDC 连接 OceanBase 实现数据实时同步
大数据·flink·oceanbase·分布式数据库
OceanBase数据库官方博客4 天前
如何实现主备租户的无缝切换 | OceanBase应用实践
oceanbase·分布式数据库·高可用
靖顺6 天前
【OceanBase 诊断调优】—— ocp上针对OB租户CPU消耗计算逻辑
oceanbase
一名数据库爱好者6 天前
OceanBase 闪回查询
数据库·oceanbase·dba
OceanBase数据库官方博客6 天前
ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析
sql·oceanbase·分布式数据库·开发者·生态工具
一名数据库爱好者7 天前
OceanBase单表恢复(4.2.1.8)
adb·oceanbase
靖顺7 天前
【OceanBase 诊断调优】—— OceanBase 数据库统计信息被禁用,状态为 broken 的原因和解决方法
数据库·oceanbase
最笨的羊羊10 天前
日常分享系列之:学习mysql-binlog-connector-java
java·mysql·binlog·日常分享系列·connector