1.简介
canal是纯Java开发的,基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql。
原理相对比较简单:
-
1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
-
2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
-
3. canal解析binary log对象(原始为byte流)
2.mysql要求
a. 目前canal支持mysql 5.5版本以下,对mysql5.6暂不支持,(mysql4.x版本没有经过严格测试,理论上是可以兼容)
b. canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,并且配置binlog模式为row.
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
下面两个配置强烈建议配置,这样可以减小binlog的大小,忽略不需要关注的库的binlog
binlog-do-db = epg #配置需要同步的库
binlog-ignore-db = mysql #配置不需要同步的库
c. canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
GRANT SELECT,REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal@localhost ;
FLUSH PRIVILEGES;
针对已有的账户可通过grants查询权限:
show grants for 'canal';
3.部署
1. 获取发布包
访问:https://github.com/alibaba/canal/releases,会列出所有历史的发布版本包
下载方式,比如以1.0.17版本为例子:
wget https://github.com/alibaba/canal/releases/download/canal-1.0.17/canal.deployer-1.0.17.tar.gz
下载到的文件,名字不对,需要重命名,命令如下:
Mv 下载的文件 canal.deployer-1.0.17.tar.gz
2. 目录结构
解压缩发布包后,可得如下目录结构:
drwxr-xr-x 2 jianghang jianghang 136 2013-03-19 15:03 bin
drwxr-xr-x 4 jianghang jianghang 160 2013-03-19 15:03 conf
drwxr-xr-x 2 jianghang jianghang 1352 2013-03-19 15:03 lib
drwxr-xr-x 2 jianghang jianghang 48 2013-03-19 15:03 logs
3. 启动/停止
linux启动 :
sh startup.sh
linux停止:
sh stop.sh
几点注意:
1. linux启动完成后,会在bin目录下生成canal.pid,stop.sh会读取canal.pid进行进程关闭
2. startup.sh默认读取系统环境变量中的which java获得JAVA执行路径,需要设置PATH=$JAVA_HOME/bin环境变量
3. canal的内存设置在start.sh中第75或77行,(建议将75和77行的内存设置值保持相同)如下:
4.配置
properties配置分为两部分:
-
canal.properties (系统根配置文件,/conf/canal.properties)
-
1. canal.port:canal server提供socket服务的端口,建议配置32121
-
2. canal.instance.detecting.enable:是否开启心跳检查,建议配置true
-
3. canal.instance.detecting.sql:心跳检查sql,建议配置select 1 from 目标库.目标表
-
4. canal.destinations:当前server上部署的instance列表,比如需要获取epg库的表更新则可以创建一个名为epg的instance,则配置canal.destinations = epg,同时需要在/conf/下新建epg目录,并在其中创建instance.properties即可
-
l instance.properties (instance级别的配置文件,每个instance一份,/conf/实例名称/ instance.properties)