体验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 查询改写
sql·oceanbase·分布式数据库
OceanBase数据库官方博客1 天前
解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹
oceanbase·分布式数据库·分区
OceanBase数据库官方博客1 天前
半连接转内连接规则的原理与代码解析 |OceanBase查询优化
sql·oceanbase·分布式数据库
IT培训中心-竺老师4 天前
OceanBase 数据库分布式与集中式 能力
数据库·分布式·oceanbase
靖顺4 天前
【OceanBase 诊断调优】—— OceanBase 数据库网络速率配置方案
网络·数据库·oceanbase
尚雷558012 天前
OceanBase 社区版 4.0 离线方式升级bp1至bp2 指南(含避坑总结)
oceanbase
五月高高12 天前
Linux部署oceanbase
linux·oceanbase
靖顺15 天前
【OceanBase 诊断调优】—— 统计信息自动收集超时导致的估行不准 SQL 选择错索引
数据库·sql·oceanbase
it界的哈士奇16 天前
Oceanbase离线集群部署
oceanbase