Canal上手指南:mysql到kafka
1. 准备工作
1.1. MySQL账号
根据Canal官方说明,需要申请一个MySQL数据库的账号,该账号具有如下权限
CREATE USER canal IDENTIFIED BY canal; -- 至少具有如下权限 GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal@%; -- GRANT ALL PRIVILEGES ON *.* TO canal@% ; -- 需要具有SHOW VIEW 权限 FLUSH PRIVILEGES;
并保证目标主机与MySQL数据库之间3306端口的连通性。
1.2. 安装Java
由于是一个Java程序,因此需要在目标机上事先安装JDK。
1.3. Kafka
本项目目的是将Binlog数据发往Kafka,因此需要一个Kafka集群或单机节点,并保证9092端口的连通性。
1.4. Zookeeper
如果启用高可用,或将元数据保存在Zookeeper上,那么需要保证目标主机与ZK集群之间2181端口的连通性。
2. 配置工作
2.1. canal说明
需要特别注意以下几个配置内容
## 配置ZK地址:如果需要启用高可用,目前高可用仅支持同时一个节点工作 canal.zkServers= ## 配置sink方式:目前支持以下三种 ### tcp, kafka, RocketMQ canal.serverMode= ## 并发配置:这里是二选一 ### 1. 单线程处理 canal.instance.parser.parallel = false ### 2. 处理过程如下[源代码] ### * 1. 网络接收 (单线程) ### * 2. 事件基本解析 (单线程,事件类型、DDL解析构造TableMeta、维护位点信息) ### * 3. 事件深度解析 (多线程, DML事件数据的完整解析) ### * 4. 投递到store (单线程) canal.instance.parser.parallel = true canal.instance.parser.parallelThreadSize = 6 canal.instance.parser.parallelBufferSize = 4096 ## MQ配置:配置Kafka的服务器: “IP1:9092,IP2:9092,,,” canal.mq.servers= ## MQ配置:设置消息序列化方式,true--json, false--protobuf canal.mq.flatMessage=true ## MQ设置 canal.mq.acks= canal.mq.lingerMs=
2.2. instance说明
Instance中需要注意的配置项目如下
## GTID设置:如果配置为true,那么需要给出:canal.instance.master.gtid= ## 一般设置为false,小的项目就够了:自动寻找,以及记忆Binlog位置 canal.instance.gtidon=false ## 设置源数据库:用户名、密码、默认数据库 canal.instance.dbUsername= canal.instance.dbPassword= canal.instance.defaultDatabaseName = ## Kafka设置 canal.mq.topic= ## 二选一 ## 1. 配置partition数量,并配合映射规则:实际代码中,优先判断该种情况 canal.mq.partitionsNum=3 canal.mq.partitionHash=mytest.person:id,mytest.role:id ## 2. 配置为0,或不配置 canal.mq.partition=
3. 注意事项
3.1. 默认数据库
在实际测试中,这个默认数据库的设置不知道起到了什么作用
canal.instance.defaultDatabaseName =
在获取MySQL Binlog时,这个MySQL实例的Binlog都获取到了,并传输到了Kafka中。
3.2. 配置错误
在配置mq.yml文件时,遇到了一个基本常识错误
## 错误配置 canalDestinations: - canalDestination: example topic:example partition:0 ## 正确配置 canalDestinations: - canalDestination: example topic: example partition: 0
即在YML配置中,基本上是这种模式的[Key: value]。
博主在使用的时候,场景比较简单,配置也较为简单,目标仅是让整个流程跑起来,对于其他的参数未做详细的了解以及探究,其中不免有错误之处,欢迎留言指正。