一、版本介绍
MariaDB:10.5.17-MariaDB
MySQL:mysql-5.7.42
Canal:canal.deployer-1.1.7-SNAPSHOT、canal.adapter-1.1.7-SNAPSHOT
二、原理
Canal.deployer作为Canal服务端,伪装成MySQL从数据库,通过配置直接监听MariaDB数据库binlog文件,通过对binlog文件的解析,外加Canal.adapter对数据做ETL处理和适配,将数据送至MySQL中,数据实时同步。
三、步骤
配置MariaDB
在/etc/my.cnf.d/server.cnf文件中的[mysqld]下添加如下两行
log-bin=mysql-bin
binlog_format=ROW
配置Canal.deployer
在解压路径下找到conf/canal.properties文件
记录其中canal.destinations = example 属性,这是canal的连接实例。
在conf/example路径下存在instance.properties配置文件。
重点注意以下配置项 canal.instance.master.address--MariaDB数据库ip地址及端口
canal.instance.dbUsername=canal--MariaDB数据库连接账号
canal.instance.dbPassword=canal--MariaDB数据库连接密码
canal.instance.filter.regex--binlog白名单,仅筛选白名单中存在的库或者表
canal.instance.filter.black.regex--binlog黑名单,过滤掉黑名单中存在的库或者表
配置Canal.adapter
编辑conf/application.yml
192.168.0.1-MariaDB 192.168.0.2-MySQL
以下是MariaDB的aaa数据库同步数据至MySQL的aaa数据库
编辑application.yml
srcDataSources:源数据库配置
canalAdapters:目标数据库配置
需要在conf/rdb/路径下创建和实例名一样的配置文件
dataSourceKey: defaultDS--application.yml中的srcDataSources(源数据库配置名)
destination: example--实例名称
groupId: g1--canalAdapters.groups.groupId
outerAdapterKey: example--canalAdapters.groups.outerAdapters.key
concurrent: true
dbMapping:--数据库
database: aaa--源数据库
table: ccc--需要同步的表
targetTable: ccc--目标表
targetPk:--目标表主键
id: id
mapAll: true--是否是所有键同步
# targetColumns:--非所有键同步时单独配置键对应关系
# id: id
# name: name
#dbMapping:--整个数据库同步时用此配置
# mirrorDb: true
# database: aaa
MySQL配置
在/etc/my.cnf中的[mysqld]下添加如下配置
log-bin=mysql-bin # [必须]启用二进制日志
server-id=78 #服务id 一般取IP最后一段
binlog_format=ROW
四、重启
按顺序重启MariaDB->canal.deployer->canal.adapter->MySQL
其中canal.deployer和canal.adapter在conf路径同级目录下的bin路径中有启动文件
五、演示
新增数据
修改数据
删除数据
六、总结
1、记住canal.deployer是作为一个canal的服务端,同时它也是源数据库的从库(自我伪装的)
2、canal.deployer是作为一个从库的角色存在,所以它不能同时接收多个数据源的数据至同一个canal服务端
3、canal.adapter可以称之为连接器,配置了源数据库信息以及目标数据库信息,并实现了数据实时同步
4、有做测试,大批量数据进入MariaDB时,Canal消费不过来,响应并没有那么快,此时MariaDB中的数据有新增1300万条,MySQL数据库中查看仅有200多万,但是会慢慢增长,最终和MariaDB中的数据量一致
七、彩蛋
MariaDB本身就是MySQL的另一个版本,为什么不能直接通过binlog来进行主从配置并同步数据呢!哈哈哈!!!
当然他们之间是可以通过配置实现主从数据库同步的,这里是为了解决MariaDB到MySQL到ClickHouse数据实时同步,才引入了canal作为中间传输工具,因为这三者不能直接配置成功。