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 流)
安装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
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我