1.简介
canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。
2.工作原理
canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binlog,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。
3.部署
(1)下载安装canal
本安装目录:/usr/local,创建一个canal目录,版本1.1.4
cd /usr/local/
mkdir canal
cd canal
//下载canal
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
//解压
tar -zxvfcanal.deployer-1.1.4.tar.gz
(2)修改canal的配置文件
1.conf下的canal.properties文件,修改以下两项
//指定输出服务默认tcp
canal.serverMode=kafka
//指定kafka地址
canal.mq.servers = 192.168.1.102:9092
2.修改example/instance.properties,mysql的数据库连接地址
//mysql地址
canal.instance.master.address=192.168.1.130:3306
//mysql用户名密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=123456
# 接着上面,新增一个配置,默认数据库
canal.instance.defaultDatabaseName=canaltest
# 这个topic会自动创建
canal.mq.topic=canal-topic
(3)修改mysql的配置文件
//开启binlog
log-bin=/var/lib/mysql/mysql-bin
binlog-format=ROW
登录数据库以后,查看是否开启了binlog, ON表示开启了
show variables like 'log_%';
设置和上面instance.properties配置文件中canal的用户名和密码:
-- 创建canal用户
CREATE USER canal IDENTIFIED BY '123456';
-- 给canal用户分配查询和复制的权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal@'%';
--刷新权限
FLUSH PRIVILEGES;
创建测试库
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
CREATE DATABASE `canaltest` CHARSET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
(4)启动
启动canal,在bin目录下
sh startup.sh
启动kafka消费端:这个topic和上面example/instance.properties配置文件里面一致
./bin/kafka-console-consumer --bootstrap-server 192.168.1.102:9092 --topic canal-topic
4.主要配置文件说明
properties配置分为两部分:
canal.properties (系统根配置文件)
instance.properties (instance级别的配置文件,每个instance一份)
canal配置主要分为两部分定义:
- instance列表定义 (列出当前server上有多少个instance,每个instance的加载方式是spring/manager等)
- common参数定义,比如可以将instance.properties的公用参数,抽取放置到这里,这样每个instance启动的时候就可以共享. 【instance.properties配置定义优先级高于canal.properties】
5.多实例配置
1.canal.properties修改
//实例列表
canal.destinations = example,example1
2.修改example内instance.properties
【目标监控表】的正则表达式:
//监控全部表数据
//canal.instance.filter.regex = .*\\..*
canal.instance.filter.regex = canaltest.test
3.新增实例example1
cd /usr/local/canal/conf
//创建文件夹
mkdir example1
//复制实例example
cp -r example/. example1
4.修改example1内instance.properties
目标监控表】的正则表达式:
//监控全部表数据
//canal.instance.filter.regex = .*\\..*
canal.instance.filter.regex = canaltest.test1
//kafka的topic
canal.mq.topic=canal-topic1
5.重启服务
cd /usr/local/canal/bin
//重启服务
sh restart.sh
6.HA
HA基于zookeeper
启动zookeeper集群
canal的HA部署环境:192.168.1.107,192.168.1.108
zookeeper集群环境:flink01:2181,flink02:2181,flink03:2181
1.修改canal.properties(两个节点一致)
//添加zookeeper地址
canal.zkServers =flink01:2181,flink02:2181,flink03:2181
//将file-instance.xml注释,解开default-instance.xml注释
#canal.instance.global.spring.xml = classpath:spring/file-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
2.修改conf/example目录下instance.properties
//107
canal.instance.mysql.slaveId = 0 //不能与mysql的server-id重复
//108
canal.instance.mysql.slaveId = 1 //不能与mysql的server-id重复
3.重启服务(两个节点一致)
cd /usr/local/canal/bin
//重启服务
sh restart.sh
7.参考网址
canal的HA搭建,可视化搭建:https://www.cnblogs.com/shengyang17/p/10834781.html
canal的多实例搭建:http://www.xiaoruyi.cn/url/detail_28wzQboZs.html
canal配置详解:https://blog.csdn.net/qq_26502245/article/details/90445323
canal配置文件介绍:https://www.cnblogs.com/eason-d/p/9300754.html
canal官方文档:https://github.com/alibaba/canal/wiki/AdminGuide
8.Canal和Zookeeper对应节点的关系
/otter/canal:canal的根目录
/otter/canal/cluster:整个canal server的集群列表
/otter/canal/destinations:destination的根目录
/otter/canal/destinations/example/running:服务端当前正在提供服务的running节点
/otter/canal/destinations/example/cluster:针对某个destination的工作集群列表
/otter/canal/destinations/example/1001/running:客户端当前正在读取的running节点
/otter/canal/destinations/example/1001/cluster:针对某个destination的客户端列表
/otter/canal/destinations/example/1001/cursor:客户端读取的position信息