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的文档。