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

45次阅读

共计 4150 个字符,预计需要花费 11 分钟才能阅读完成。

背景介绍

咱们都晓得,很多用户并不是一开始就是应用 OceanBase 的。所以在他们决定应用 OceanBase 的时候,肯定要把之前的业务数据迁徙到 OceanBase 上来。如果是全量数据迁徙,能够借助离线数据同步工具 DataX。然而,如果在全量迁徙过程中业务产生了新数据,这些新数据又如何迁徙呢?此时就须要对数据进行增量迁徙。这也是本文的主题:如果应用数据同步工具 Canal 实时把数据从 MySQL 同步到 OceanBase。

【特地阐明】这个教程应用的都是单机部署,只能用来演示。生产环境多为分布式集群部署。Canal 的部署也是反对集群的,须要配合 ZooKeeper 进行集群治理。

P.S. 配合视频教程一起食用成果更佳噢~~ 视频教程,点击 OceanBase 监控工具 OceanBaseAgent

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 配置文件:

# 关上配置文件
vim /etc/my.cnf

增加这些配置:

[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 抉择 ROW 模式
server_id=1 # 配置 MySQL replaction 须要定义,不要和 canal 的 slaveId 反复

更改配置之后须要重启 MySQL 新的配置能力失效。连贯 MySQL,查看是否失效:

mysql -uroot -p

能够看到此时 log_bin 曾经关上,并且 binlog_format 的值为 ROW。

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+

当初创立 Canal 用户:

# 创立 Canal 用户
CREATE USER canal IDENTIFIED BY 'Canal123';

这里说一个我踩的坑,在设置明码时,如果不满足以后明码强度规定,会报错:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

咱们看看以后明码强度规定:

SHOW VARIABLES LIKE 'validate_password%';

明码包含 1 个特殊字符,依照要求重置明码,胜利

CREATE USER canal IDENTIFIED BY 'Canal@123';
Query OK, 0 rows affected (0.00 sec)
# 当初为 canal 用户受权,*.* 示意所有库
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

第 2 步:部署 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:一些扩大包,如音讯队列

批改实例属性配置文件

vi conf/example/instance.properties

这里只介绍我用到的配置,咱们把用户名、明码改了就行

# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123

启动 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 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 表映射文件有点麻烦。

vim conf/rdb/mytest_user.yml

## Mirror schema synchronize config
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:mirrorDb: truedatabase: amber # 只改这个,须要源库、指标库截然不同

第 3 步:同步数据

创立 database 和 table 我就不演示了,咱们间接测试数据同步:

关上一个新的窗口,把日志打印进去,这样不便在插入数据时看到日志的变动。

tail -f x.log

能够看到,左侧插入的数据

mysql> insert into amber1 values (7,8);

曾经同步过去了,详情见屏幕右侧的日志。此时,你也能够连贯到 OceanBase,确认数据是不是真的同步过去了。

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

正文完
 0