canal是阿里开源的基于数据库增量日志解析工具,它提供增量数据订阅和消费。目前最新稳定版本是 1.1.0
注意:1.1.1 1.1.2版本的客户端与1.1.0的稍有差别 (2019-02-11更新)
项目地址:https://github.com/alibaba/canal
服务端:https://github.com/alibaba/canal/releases/download/canal-1.1.0/canal.deployer-1.1.0.tar.gz
客户端示例:https://github.com/alibaba/canal/releases/download/canal-1.1.0/canal.example-1.1.0.tar.gz
卡夫卡:https://github.com/alibaba/canal/releases/download/canal-1.1.0/canal.kafka-1.1.0.tar.gz
源码:https://github.com/alibaba/canal/archive/canal-1.1.0.tar.gz
工作原理
canal模拟mysql slave的交互协议,伪装成一个slave,并向mysql master发送dump请求,mysql master收到dump请求后,开始推送binlog给slave(canal),canal解析binlog,并发送给客户端
canal支持statement、row、mixed格式的binlog解析,但statement的只有sql没有数据,不能获取原始变更日志,所以一般建议使用row格式
EventParser过程【解析】
EventSink过程【过滤】
数据过滤支持通配符、表名、字段内容等
EventStore过程【存储】
内存模式、本地文件模式、混合模式等
Put:数据放入位置;Get:数据获取位置;Ack:数据消费成功位置
Instance结构【管理层级】
可见,有两种管理方式,比较简单的方式是spring方式,通过配置文件控制
增量订阅/消费流程
get/ack是异步处理的,如可以连续调用get多次,再按顺序提交ack/rollback
HA机制
多个服务器上有多个instance,但同一时间只能有一个instance处于running状态;一个instance同一时间只能由一个canal client进行get/ack/rollback操作。要保证这两点,需要依赖zookeeper。
快速开始
mysql配置要点
[mysqld]
log-bin=mysql-binlog
binlog-format=ROW
server_id=1234
帐号授权
create user 'canal'@'%' identified by 'canal';
grant select,replication slave,replication client,show view on *.* to 'canal'@'%';
flush privileges;
注意:还需要 SHOW VIEW 权限(2019-02-11更新)
修改配置文件
canal.properties
Apache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#################################################
######### common argument#############
#################################################
canal.id=1
canal.ip=
canal.port=2222
canal.metrics.pull.port=
canal.zkServers=
# flush data to zk
canal.zookeeper.flush.period=1000
canal.withoutNetty=false
# flush meta cursor/parse position to file
canal.file.data.dir=${canal.conf.dir}
canal.file.flush.period=1000
## memory store RingBuffer size, should be Math.pow(2,n)
canal.instance.memory.buffer.size=16384
## memory store RingBuffer used memory unit size , default 1kb
canal.instance.memory.buffer.memunit=1024
## meory store gets mode used MEMSIZE or ITEMSIZE
canal.instance.memory.batch.mode=MEMSIZE
## detecing config
canal.instance.detecting.enable=false
#canal.instance.detecting.sql = insert into retl.xdual va