canal的配置加载方式
一 部署准备:
canal: https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
zookeeper部署参考 https://github.com/alibaba/canal/wiki/Zookeeper-QuickStart
kafka部署参考 https://github.com/alibaba/canal/wiki/Kafka-QuickStart
mysql要求
a. 当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48),ps. mysql4.x版本没有经过严格测试,理论上是可以兼容
b. canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,并且配置binlog模式为row.
[mysqld] log-bin=mysql-bin #添加这一行就ok binlog- format =ROW #选择row模式 server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复 |
二 canal 配置
修改instance 配置文件 vi conf/example/instance.properties
# 按需修改成自己的数据库信息 ################################################# ... canal.instance.master.address=192.168.1.20:3306 # username/password,数据库的用户名和密码 ... canal.instance.dbUsername = canal canal.instance.dbPassword = canal ... # mq config canal.mq.topic=example # 针对库名或者表名发送动态topic #canal.mq.dynamicTopic=mytest,.*,mytest.user,mytest\\..*,.*\\..* canal.mq.partition=0 # hash partition config #canal.mq.partitionsNum=3 #库名.表名: 唯一主键,多个表之间用逗号分隔 #canal.mq.partitionHash=mytest.person:id,mytest.role:id ################################################# |
修改canal 配置文件vi /usr/local/canal/conf/canal.properties
# ... # 可选项: tcp(默认), kafka, RocketMQ canal.serverMode = kafka # ... # kafka/rocketmq 集群配置: 192.168.1.117:9092,192.168.1.118:9092,192.168.1.119:9092 canal.mq.servers = 127.0.0.1:6667 canal.mq.retries = 0 # flagMessage模式下可以调大该值, 但不要超过MQ消息体大小上限 canal.mq.batchSize = 16384 canal.mq.maxRequestSize = 1048576 # flatMessage模式下请将该值改大, 建议50-200 canal.mq.lingerMs = 1 canal.mq.bufferMemory = 33554432 # Canal的batch size, 默认50K, 由于kafka最大消息体限制请勿超过1M(900K以下) canal.mq.canalBatchSize = 50 # Canal get数据的超时时间, 单位: 毫秒, 空为不限超时 canal.mq.canalGetTimeout = 100 # 是否为flat json格式对象 canal.mq.flatMessage = false canal.mq.compressionType = none canal.mq.acks = all # kafka消息投递是否使用事务 canal.mq.transaction = false |
canal.mq.dynamicTopic 表达式说明
canal 1.1.3版本之后, 支持配置格式:schema 或 schema.table,多个配置之间使用逗号或分号分隔 例子1: test \\. test 指定匹配的单表,发送到以test_test为名字的topic上 例子2:.*\\..* 匹配所有表,则每个表都会发送到各自表名的topic上 例子3: test 指定匹配对应的库,一个库的所有表都会发送到库名的topic上 例子4: test \\.* 指定匹配的表达式,针对匹配的表会发送到各自表名的topic上 例子5: test ,test1\\.test1,指定多个表达式,会将 test 库的表都发送到 test 的topic上,test1\\.test1的表发送到对应的test1_test1 topic上,其余的表发送到默认的canal.mq.topic值 为满足更大的灵活性,允许对匹配条件的规则指定发送的topic名字,配置格式:topicName:schema 或 topicName:schema.table 例子1: test : test \\. test 指定匹配的单表,发送到以 test 为名字的topic上 例子2: test :.*\\..* 匹配所有表,因为有指定topic,则每个表都会发送到 test 的topic下 例子3: test : test 指定匹配对应的库,一个库的所有表都会发送到 test 的topic下 例子4:testA: test \\.* 指定匹配的表达式,针对匹配的表会发送到testA的topic下 例子5:test0: test ,test1:test1\\.test1,指定多个表达式,会将 test 库的表都发送到test0的topic下,test1\\.test1的表发送到对应的test1的topic下,其余的表发送到默认的canal.mq.topic值 大家可以结合自己的业务需求,设置匹配规则,建议MQ开启自动创建topic的能力 |
canal.mq.partitionHash 表达式说明
canal 1.1.3版本之后, 支持配置格式:schema.table:pk1^pk2,多个配置之间使用逗号分隔 例子1: test \\. test :pk1^pk2 指定匹配的单表,对应的 hash 字段为pk1 + pk2 例子2:.*\\..*: id 正则匹配,指定所有正则匹配的表对应的 hash 字段为 id 例子3:.*\\..*:$pk$ 正则匹配,指定所有正则匹配的表对应的 hash 字段为表主键(自动查找) 例子4: 匹配规则啥都不写,则默认发到0这个partition上 例子5:.*\\..* ,不指定pk信息的正则匹配,将所有正则匹配的表,对应的 hash 字段为表名 按表 hash : 一张表的所有数据可以发到同一个分区,不同表之间会做散列 (会有热点表分区过大问题) 例子6: test \\. test : id ,.\\..* , 针对 test 的表按照 id 散列,其余的表按照table散列 |
启动
cd /usr/local/canal/ sh bin /startup .sh |
查看 logs/canal/canal.log
vi logs/canal/canal.log
查看instance的日志:
vi logs/example/example.log
canal输出
{ "data" : null, "database" : "test4" , "es" : 1589264148000, "id" : 1, "isDdl" : false , "mysqlType" : null, "old" : null, "pkNames" : null, "sql" : "create database test4" , "sqlType" : null, "table" : "" , "ts" : 1589264149112, "type" : "QUERY" } |
{ "data" : null, "database" : "test4" , "es" : 1589264649000, "id" : 2, "isDdl" : true , "mysqlType" : null, "old" : null, "pkNames" : null, "sql" : "create table testTable(id int)" , "sqlType" : null, "table" : "testTable" , "ts" : 1589264649936, "type" : "CREATE" } |
{ "data" : [{ "id" : "100" }], "database" : "test4" , "es" : 1589264662000, "id" : 3, "isDdl" : false , "mysqlType" : { "id" : "int" }, "old" : null, "pkNames" : null, "sql" : "" , "sqlType" : { "id" : 4 }, "table" : "testTable" , "ts" : 1589264662531, "type" : "INSERT" } |
{ "data" : [{ "id" : "200" }], "database" : "test4" , "es" : 1589264720000, "id" : 4, "isDdl" : false , "mysqlType" : { "id" : "int" }, "old" : [{ "id" : "100" }], "pkNames" : null, "sql" : "" , "sqlType" : { "id" : 4 }, "table" : "testTable" , "ts" : 1589264720976, "type" : "UPDATE" } |
{ "data" : [{ "id" : "100" }], "database" : "test4" , "es" : 1589264765000, "id" : 6, "isDdl" : false , "mysqlType" : { "id" : "int" }, "old" : null, "pkNames" : null, "sql" : "" , "sqlType" : { "id" : 4 }, "table" : "testTable" , "ts" : 1589264765454, "type" : "DELETE" } |