MYSQL同步其它类型数据库利器 - Canal的使用

学习笔记 2020/08/21 Canal

    Canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。其基本原理是伪装成辅库把数据同步到其他数据库中。

基于日志增量订阅和消费的业务包括

  • 数据库镜像

  • 数据库实时备份

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

  • 业务 cache 刷新

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

当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x

基本原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议

  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

  • canal 解析 binary log 对象(原始为 byte 流)

\"1.png\"/

安装Canal Service

    下载最近的release版本,下载地址:https://github.com/alibaba/canal/releases


下载安装包并解压:

wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
tar -zxvf canal.deployer-1.1.4.tar.gz
mv canal.deployer-1.1.4 /usr/local/canal

配置开放服务器端口:11110、11111、11112,如果canal仅在本机运行,可不开启


数据库配置

使用canal需要数据库开启binlog

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

如果未开启,则需要配置

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

创建canal数据库用户,如果已存在用户有 SELECT, REPLICATION SLAVE, REPLICATION CLIENT权限,此步可忽略,针对已有的账户可通过grants查询权限:

show grants for \'canal\'

创建账号

CREATE USER canal IDENTIFIED BY \'canal\';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO \'canal\'@\'%\';
FLUSH PRIVILEGES;


修改canal配置文件

cd /usr/local/canal
vim conf/canal.properties

修改instance的名字,多个使用逗号分隔

canal.destinations = example


修改数据库配置

vim conf/example/instance.properties

此处example文件夹名字要与instance的名字对应

canal.instance.master.address=127.0.0.1:3306 #数据库主库连接地址
canal.instance.dbUsername=canal #数据库用户名
canal.instance.dbPassword=canal #数据库密码
canal.instance.connectionCharset = UTF-8

#指定需要同步的数据库,支持仅同步指定表
canal.instance.filter.regex=testdb\\\\..*

#如果需要新增一个instance,只需要修改canal.properties文件,并新增一个instance配置即可,无需重启canal。


运行Canal

sh bin/startup.sh
# 查看日志
cat logs/canal/canal.log

2020-08-20 19:45:13.592 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
2020-08-20 19:45:13.629 [main] INFO  com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[172.16.120.94(172.16.120.94):11111]
2020-08-20 19:45:14.889 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......
2020-08-20 19:45:15.444 [canal-instance-scan-0] INFO  com.alibaba.otter.canal.deployer.CanalController - auto notify start testdb successful.


instance的日志

cat logs/example/example.log
2020-08-20 19:40:01.574 [Thread-6] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - stop CannalInstance for null-example 
2020-08-20 19:40:01.602 [Thread-6] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - stop successful....

关闭

sh bin/stop.sh

重启

sh bin/restart.sh


注意点

1、linux启动完成后,会在bin目录下生成canal.pid,stop.sh会读取canal.pid进行进程关闭

2、startup.sh默认读取系统环境变量中的which java获得JAVA执行路径,需要设置PATH=$JAVA_HOME/bin环境变量

3、重启canal要有kill进程的权限


本文地址:https://www.stayed.cn/item/245

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。