暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase CDC 分享:从 OceanBase 向 MySQL 同步数据

3478

作者:Amber,OB 网红文档工程师。个人主页:https://space.bilibili.com/557737255/




最近大家比较关心 OceanBase 的 CDC 能力,今天就跟大家聊聊这个话题。CDC 全称 Change Data Capture,直译成汉语是变更数据捕获。CDC 的核心思想是,通过日志来监测并捕获数据库的变化(包括数据或数据表的插入,更新,删除等),然后再将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。你可以用 CDC 提供的数据做很多事情,比如可以做历史库,可以做近实时缓存,也可以提供给 MQ,用户消费 MQ 做分析和审计。在这篇文章中,我将跟大家聊聊 CDC 的基本组件和工作原理,然后再提供一个简单的实操指南,带大家快速了解如何借助 CDC 在 OceanBase 和 MySQL 之间实现数据同步,希望各位小伙伴在看了我的文章后能够对 CDC 的原理和适用场景有一个全面的了解。

OceanBase CDC 基本组件

OceanBase CDC 包括两个组件 liboblog 和 oblogmsg 两个组件。其中,liboblog 是 OceanBase CDC 的基本组件。liboblog 衍生出 oblogproxy,liboblog 依赖 oblogmsg。

liboblog

liboblog 以动态库的形式对外提供 OceanBase 数据库的实时增量(事务)数据,即提供 CDC 能力。liboblog 通过 RPC 向 OceanBase 数据库请求各分区的 Clog(Redo)日志,结合各个表、列的 schema 信息(通过 SQL 和 OceanBase Server 交互获得),将 Redo 日志转化为一种中间数据格式(LOGMSG),聚合一个事务涉及的各分区的数据变更,以事务为单位逐行输出变更数据。


liboblog 对外提供 OceanBase 增量事务数据,调用 liboblog 的进程拿到数据后可用于数据同步和数据订阅。
  • 数据同步:将 OceanBase 数据同步到同构或者异构的数据库,可以做逻辑迁移、逻辑备库、逻辑升级等。

  • 数据订阅:将 OceanBase 数据同步给消息队列或数据仓库等,用于做实时计算、审计、监控等。

oblogproxy

oblogproxy 是 liboblog 的代理,会调用 liboblog,作为 liboblog 的消费者获取 OceanBase 数据库的增量事务数据。
oblogproxy 提供实时增量链路接入和管理能力,方便应用接入 OceanBase 数据库的增量日志。

oblogmsg

oblogmsg 是一种数据库增量数据的输出格式,OceanBase 数据库的增量采集模块 liboblog 正是使用的这种消息格式来输出增量数据的。oblogmsg 支持 OceanBase 数据库中不同数据类型的增量数据的写入,具有序列化和反序列化的能力。如果你想知道增量数据是什么的话,就得用oblogmsg定义的那些接口去解析。

以 OceanBase 为源向 MySQL 同步数据

现在我们试试使用 oblogproxy 和 Canal 把数据从 OceanBase 同步到 MySQL

安装 oblogproxy

来到它的 GitHub 仓库,从 Release 页面下载安装包。安装之前要配置 OceanBase 社区版 yum 源,这样安装 rpm 包时,才能自动安装依赖,比如 liboblog 等内容。也可以使用以下命令安装:

yum install -y oblogproxy-1.0.0-1.el7.x86_64.rpm

安装完成后,来到 oblogproxy 的安装目录,来到 bin 目录,默认安装目录为 /usr/local/oblogproxy/bin

ldd ./bin/logproxy
依赖没有问题,现在配置 oblogproxy。在 bin 目录下生成加密用户和密码。
#生成用户
/logproxy -x root@sys
EA87898018FD1EDDC2AA11CE1556E917
#生成密码
/logproxy -x Root@2021
8852DB95B3D54B1A8F866836A9D8FD52
然后修改对应的 conf.json 参数:
vim /usr/local/oblogproxy/conf/conf.json
"ob_sys_username": "",
"ob_sys_password: "",
把上面生成的用户名和密码复制到这里。
现在来到 oblogproxy 的安装目录,启动 oblogproxy:
cd /usr/local/oblogproxy
./run.sh start
#查看状态
./run.sh status
#停止oblogproxy
./run.sh stop

配置 Canal

本文使用的 Canal 是 OceanBase 的定制版本,详细信息,参考 Canal for OceanBase。

部署 Canal Deployer

Canal Deployer 是 Canal 的 server 端,它用来进行 binlog 到 CanalEntry 的转换。来到 Canal for OceanBase仓库的 Rlease 页面,下载 Deployer 的安装包。然后创建解压目录并解压:


mkdir /tmp/canal2
tar zxvf canal.deployer-$version.tar.gz -C /tmp/canal2


来到安装目录,查看目录结构:


cd /tmp/canal
ls
bin :canal启动、重启、停止文件
conf :canal配置文件
lib :canal运行所需的jar包,注意数据库驱动包版本,可手动更换
logs :canal运行日志
plugin :一些扩展包,如消息队列


修改 canal.properties 配置文件:


vi conf/canal.properties


指定实例的 spring 配置


# 指定instance的spring配置
canal.instance.global.spring.xml = classpath:spring/ob-file-instance.xml


然后修改 ob-instance.properties 配置文件。首先,修改 ob-instance.properties 名为 instance.properties,以替换原有的 instance.properties 文件,之后配置 instance 参数:
# oceanbase集群参数
canal.instance.oceanbase.rsList=127.0.0.1:2882:2881
canal.instance.oceanbase.username=username
canal.instance.oceanbase.password=password
canal.instance.oceanbase.startTimestamp=0

# oceanbase logproxy的地址
canal.instance.oceanbase.logproxy.address=127.0.0.1:2983
# 与oceanbase logproxy间通信可以使用ssl加密,默认关闭
canal.instance.oceanbase.logproxy.sslEnabled=false
canal.instance.oceanbase.logproxy.serverCert=../conf/${canal.instance.destination:}/ca.crt
canal.instance.oceanbase.logproxy.clientCert=../conf/${canal.instance.destination:}/client.crt
canal.instance.oceanbase.logproxy.clientKey=../conf/${canal.instance.destination:}/client.key

# 是否要在库名中去掉租户前缀。logproxy输出的日志中库名默认为 [tenant].[db]
canal.instance.parser.excludeTenantInDbName=true
canal.instance.oceanbase.tenant=sys

# 日志过滤。格式为[tenant].[database].[table],支持正则
canal.instance.filter.regex=sys.canal_test.*
需要修改用户名和密码,用户名的格式为用户名@租户#集群名,canal.instance.oceanbase.tenant
canal.instance.filter.regex
也要改成业务租户。


若是在 mq 模式下,需要增加 mq 的配置:
# 指定当前instance对应的topic
canal.mq.topic=example
# 动态路由topic的规则,若设置则会覆盖上面的canal.mq.topic
#canal.mq.dynamicTopic=canaltest\\..*
# 指定使用的partition
canal.mq.partition=0
配置完成后,在根目录下执行bin/startup.sh即可启动。


启动 Canal:


sh bin/startup.sh


注意 Canal 启动需要安装 JAVA JDK,安装命令如下:


yum install java-1.8.0-openjdk* -y


生产环境建议用二进制包装,这样不会影响其他用户。解压以后配置环境变量就可以了。

现在查看日志,看看 Canal 有没有启动成功:


vi logs/canal/canal.log
# 查看 Canal 实例的日志
vi logs/example/example.log

通过日志,我们看到已经启动成功,接下来我们部署 Canal Adaptor。

部署 Canal Adaptor

Canal Adapter 是 Canal 的客户端适配器,它用来解析 CanalEntry 并将增量变动同步到目的端。还是从刚才提到的  Release 页面,下载对应的包,解压方式同上。我们直接来到安装目录,修改启动器配置文件:


vim conf/application.yml

canalAdapters:
- instance: example # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: rdb # 指定为 rdb 类型同步
key: mysql1 # 指定 adapter 的唯一 key, 与表映射配置中 outerAdapterKey 对应
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://127.0.0.1:2881/amber?useUnicode=true #这里amber是待同步的database名称
jdbc.username: root@amber_babe # jdbc username,ob的用户@业务租户,创建业务租户我就不演示了
jdbc.password: root # jdbc password ob业务租户密码


默认的配置是注释的,我们需要打开。由于社区版 OceanBase 完全兼容 MySQL 协议,因此在使用时,将其视为 MySQL 配置即可。Adapter 服务在启动时,会加载对应类型 Adapter 配置目录(此处即conf/rdb/)下的所有配置文件。表映射有两种配置形式:按表映射同步和整库同步。我们直接同步数据库镜像,因为生产环境往往有多个表需要同步,修改 RDB 表映射文件有点麻烦。


vim conf/rdb/mytest_user.yml

## Mirror schema synchronize config
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
mirrorDb: true
database: amber # 只改这个,需要源库、目标库一模一样


来到 adapter 的 bin 目录,启动它:
./startup.sh
CDC 的配置我就讲到这里,最后给大家留一个作业, 大家可以试着使用我的配置来用用 OceanBase 的 CDC 功能,亲自尝试从 OceanBase 同步数据到 MySQL。

其他
OceanBase 向 MySQL 数据同步视频:
单机部署OceanBase 三副本集群视频:
OBAgent部署视频:




联系我们

欢迎广大 OceanBase 爱好者、用户和客户有任何问题联系我们反馈:
  • 社区版官网论坛 open.oceanbase.com/answer

  • 社区版项目网站提  Issue  : github.com/oceanbase/oceanbase

  • 钉钉群:33254054


文章转载自OceanBase技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论