我之前写了一篇 canal server TCP 模式部署笔记 https://www.jianshu.com/p/23ae08609e2d. 今天把它改造成了 Kafka 模式,整个过程还是很简单的,需要提前准备 zookeeper 环境 https://www.jianshu.com/p/558c591469b0 以及 Kafka 环境 https://kafka.apachecn.org/quickstart.html
1. 修改 conf/canal.properties
canal.zkServers = 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
canal.serverMode = kafka
canal.mq.servers = 127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094
canal.mq.flatMessage = false
2. 修改 conf/content/instance.properties
# 如果你之前按照官方文档搭建的 TCP 模式的 canal server
# 那么 canal.instance.filter.regex = .\*\\\\..\* 需要改成 canal.instance.filter.regex = .*\\..*
# 不符合 dynamicTopic 规则的 binlog 推送到默认 topic : schemas
canal.mq.topic = schemas
# content database 的 binlog 推送到 content topic
canal.mq.dynamicTopic = content
# topic 分区
canal.mq.partition = 0
3. 补充
1. Kafka 模式与 TCP 模式的 canal server 启动过程是没有区别的,都是根据规则确定 dump binlog 的位点信息,具体分析可以参考 https://www.jianshu.com/p/23ae08609e2d
2. Kafka 模式与 TCP 模式最大的区别在于 dump binlog 的时机
- 在 TCP 模式下 canal server dump binlog 是由 canal client 请求触发的,如果没有 canal client 那么 canal server 的位点一直是滞后于 mysql server 的
- 在 Kafka 模式下 canal server 是定时主动 dump binlog, 在获取到新的 binlog 之后将其推送到 Kafka 对应的 topic, 如果 topic 不存在则自动创建 topic, 然后更新 canal server 存储的位点信息 last position
canal client 通过自己维护的 topic/partition/offset 信息订阅 Kafka 数据,定时主动查询 Kafka; 整个过程中 canal server 与 canal client 没有任何交互