写点什么

数据同步:教你如何实时把数据从 MySQL 同步到 OceanBase

  • 2021 年 11 月 15 日
  • 本文字数:1797 字

    阅读完需:约 6 分钟

作者简介:海芊,一个对技术充满热情的文档工程师。


OB 背景介绍我们都知道,很多用户并不是一开始就是使用 OceanBase 的。所以在他们决定使用 OceanBase 的时候,一定要把之前的业务数据迁移到 OceanBase 上来。如果是全量数据迁移,可以借助离线数据同步工具 DataX 。但是,如果在全量迁移过程中业务产生了新数据,这些新数据又如何迁移呢?此时就需要对数据进行增量迁移。这也是本文的主题:如果使用数据同步工具 Canal 实时把数据从 MySQL 同步到 OceanBase 。


【特别说明】这个教程使用的都是单机部署,只能用来演示。生产环境多为分布式集群部署。Canal 的部署也是支持集群的,需要配合 ZooKeeper 进行集群管理。

Canal 介绍

那么什么是 Canal 呢?官方给出的解释, Canal 是个数据同步工具,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。基于日志增量订阅和消费,Canal 有以下功能:


数据库镜像

数据库实时备份

索引构建和实时维护(拆分异构索引、倒排索引等)

业务 cache 刷新

带业务逻辑的增量数据处理


忽略官方的解释,通俗来说, Canal 就是一个数据同步工具。它能让 MySQL 和 OceanBase 建立联系,你在 MySQL 上进行的 DDL 、DML 操作,都能同步到 OceanBase 上。当然前提是 SQL 是两个数据库都支持的语法。

Canal 工作原理


MySQL master 将数据变更写入二进制日志( binary log , 其中记录叫做二进制日志事件 binary log events ,可以通过 show binlog events 进行查看)


MySQL slave 将 master 的 binary log events 拷贝到它的中继日志( relay log )

MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

canal 解析 binary log 对象(原始为 byte 流)以上内容部分摘自 Canal 官方 GitHub 仓库,更多信息,查看 Canal GitHub 仓库 。


操作步骤


从 MySQL 增量同步数据到 OceanBase 总共分 3 步:


第 1 步,设置 MySQL

第 2 步,部署 Canal

第 3 步,写一些数据,测试实时同步功能接下来我们按照上述步骤,来一起试一把数据同步。


第 1 步:设置 MySQL


MySQL 的安装本文就不介绍了,比较简单,网上也有很多教程。对于自建 MySQL ,需要先开启 Binlog 写入功能,打开 my.cnf 配置文件

添加这些配置:

更改配置之后需要重启 MySQL 新的配置才能生效。连接 MySQL ,查看是否生效:

可以看到此时 log_bin 已经打开,并且 binlog_format 的值为 ROW 。

现在创建 Canal 用户:

这里说一个我踩的坑,在设置密码时,如果不满足当前密码强度规则,会报错:

我们看看当前密码强度规则:

密码包括 1 个特殊字符,按照要求重置密码,成功

第 2 步:部署 Canal

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


部署 Canal Deployer

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




vim conf/application.yml
canalAdapters:- instance: example # canal instance Name or mq topic namegroups:- groupId: g1outerAdapters:- name: logger- name: rdb # 指定为 rdb 类型同步key: mysql1 # 指定 adapter 的唯一 key, 与表映射配置中 outerAdapterKey 对应properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.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 表映射文件有点麻烦。


写在最后

最后,来个小彩蛋, canal 的正确读法是 [kə'næl] ,是运河的意思,比如著名的 Panama Canal(巴拿马运河)。我发现很多小伙伴会读成 ['kænəl] ,记住是 [kə'næl] 哦,重音在后面啦~~

发布于: 1 小时前阅读数: 8
用户头像

企业级原生分布式数据库 2020.05.06 加入

github:https://github.com/oceanbase/oceanbase 欢迎大家

评论

发布
暂无评论
数据同步:教你如何实时把数据从 MySQL 同步到 OceanBase