一、部署和安装
- 部署zookeeper
zookeeper: Zookeeper QuickStart - 部署kafka
kafka: Kafka QuickStart - 部署canal
canal: Canal部署和使用
二、修改配置
- 修改instance的配置(可参考一、中的《Canal的部署和使用》)
# 按需修改成自己的数据库信息
#################################################
...
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配置
# ...
# 可选项: 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:9092
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 = true
canal.mq.compressionType = none
canal.mq.acks = all
# kafka消息投递是否使用事务
canal.mq.transaction = false
mq相关参数说明
参数名 | 参数说明 | 默认值 |
---|---|---|
canal.mq.servers | kafka为bootstrap.servers,rocketMQ中为nameserver列表 | 127.0.0.1:6667 |
canal.mq.retries | 发送失败重试次数 | 0 |
canal.mq.batchSize | kafka为ProducerConfig.BATCH_SIZE_CONFIG,rocketMQ无意义 | 16384 |
canal.mq.maxRequestSize | kafka为ProducerConfig.MAX_REQUEST_SIZE_CONFIG,rocketMQ无意义 | 1048576 |
canal.mq.lingerMs | kafka为ProducerConfig.LINGER_MS_CONFIG , 如果是flatMessage格式建议将该值调大, 如: 200,rocketMQ无意义 | 1 |
canal.mq.bufferMemory | kafka为ProducerConfig.BUFFER_MEMORY_CONFIG,rocketMQ无意义 | 33554432 |
canal.mq.producerGroup | kafka无意义,rocketMQ为ProducerGroup名 | Canal-Producer |
canal.mq.canalBatchSize | 获取canal数据的批次大小 | 50 |
canal.mq.canalGetTimeout | 获取canal数据的超时时间 | 100 |
canal.mq.flatMessage | 是否为json格式,如果设置为false,对应MQ收到的消息为protobuf格式,需要通过CanalMessageDeserializer进行解码 | true |
canal.mq.transaction | kafka消息投递是否使用事务, 主要针对flatMessage的异步发送和动态多topic消息投递进行事务控制来保持和canal binlog position的一致性, flatMessage模式下建议开启(需要kafka版本支持)。如果设置为false, flatMessage消息将会采用逐条同步的方式投递, 可能会产生消息丢失或者重复投递,rocketMQ无意义 | false |
— | — | — |
canal.mq.topic | mq里的topic名 | 无 |
canal.mq.dynamicTopic | mq里的动态topic规则, 1.1.3版本支持 | 无 |
canal.mq.partition | 单队列模式的分区下标, | 1 |
canal.mq.partitionsNum | 散列模式的分区数 | 无 |
canal.mq.partitionHash | 散列规则定义,库名.表名 : 唯一主键,比如mytest.person: id,1.1.3版本支持新语法,见下文 | 无 |
三、写入kafka中的数据
{
"data":[
{
"field1":"4d672137-517e-4d31-befc-2bf5dadfb828",
"field2":"XXXXX",
"field3":"",
"field4":"",
"field5":"0",
"create_user":"user",
"create_time":"2019-04-09 11:24:49",
"modify_user":"CMDB_SYNC",
"modify_time":"2019-09-16 15:54:16"
}
],
"database":"uoamp_db",
"es":1568620456000,
"id":50,
"isDdl":false,
"mysqlType":{
"field1":"varchar(60)",
"field2":"varchar(200)",
"field3":"varchar(100)",
"field4":"varchar(50)",
"field5":"char(1)",
"create_user":"varchar(50)",
"create_time":"datetime",
"modify_user":"varchar(50)",
"modify_time":"datetime"
},
"old":[
{
"modify_time":"2019-09-16 15:53:16"
}
],
"pkNames":[
"field1"
],
"sql":"",
"sqlType":{
"field1":12,
"field2":12,
"field3":12,
"field4":12,
"field5":1,
"create_user":12,
"create_time":93,
"modify_user":12,
"modify_time":93
},
"table":"table_name",
"ts":1568620839843,
"type":"UPDATE"
}
消费kafka中的数据进行业务操作