Canal Server发送binlog消息到Kafka消息队列中
Canal Server发送binlog消息到Kafka消息队列中
一、背景
在上一篇文章中,我们使用 Canal Admin 搭建了Canal Server 集群,在这篇文章中,我们使用上篇文章的基础,将消息发送到kafka消息队列中。
二、需要修改的地方
以下 配置文件的修改,都是在 Canal Admin 上修改的。
1、canal.properties 配置文件修改
1、修改canal.serverMode的值

2、修改kafka配置

2、修改 instance.propertios 配置文件

3、canal发消息到mq性能优化
影响性能的几个参数:
canal.instance.memory.rawEntry = true(表示是否需要提前做序列化,非flatMessage场景需要设置为true)canal.mq.flatMessage = false(false代表二进制协议,true代表使用json格式,二进制协议有更好的性能)canal.mq.dynamicTopic(动态topic配置定义,可以针对不同表设置不同的topic,在flatMessage模式下可以提升并行效率)canal.mq.partitionsNum/canal.mq.partitionHash(分区配置,对写入性能有反作用,不过可以提升消费端的吞吐)
参考链接:https://github.com/alibaba/canal/wiki/Canal-MQ-Performance
三、kafka接收消息
1、canal 发送过来的消息
/**
* canal 发送过来的消息
*
* @author huan.fu 2021/9/2 - 下午4:06
*/
@Getter
@Setter
@ToString
public class CanalMessage {
/**
* 测试得出 同一个事物下产生多个修改,这个id的值是一样的。
*/
private Integer id;
/**
* 数据库或schema
*/
private String database;
/**
* 表名
*/
private String table;
/**
* 主键字段名
*/
private List<String> pkNames;
/**
* 是否是ddl语句
*/
private Boolean isDdl;
/**
* 类型:INSERT/UPDATE/DELETE
*/
private String type;
/**
* binlog executeTime, 执行耗时
*/
private Long es;
/**
* dml build timeStamp, 同步时间
*/
private Long ts;
/**
* 执行的sql,dml sql为空
*/
private String sql;
/**
* 数据列表
*/
private List<Map<String, Object>> data;
/**
* 旧数据列表,用于update,size和data的size一一对应
*/
private List<Map<String, Object>> old;
}
2、监听消息
@Component
@Slf4j
public class KafkaConsumer {
@KafkaListener(topics = "customer", groupId = "canal-kafka-springboot-001", concurrency = "5")
public void consumer(ConsumerRecord<String, String> record, Acknowledgment ack) throws InterruptedException {
log.info(Thread.currentThread().getName() + ":" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "接收到kafka消息,partition:" + record.partition() + ",offset:" + record.offset() + "value:" + record.value());
CanalMessage canalMessage = JSON.parseObject(record.value(), CanalMessage.class);
log.info("\r=================================");
log.info("接收到的原始 canal message为: {}", record.value());
log.info("转换成Java对象后转换成Json为 : {}", JSON.toJSONString(canalMessage));
ack.acknowledge();
}
}
3、获取消息

四、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.acks | kafka为ProducerConfig.ACKS_CONFIG rocketMQ无意义 |
all |
| canal.mq.kafka.kerberos.enable | kafka为ProducerConfig.ACKS_CONFIG rocketMQ无意义 |
false |
| canal.mq.kafka.kerberos.krb5FilePath | kafka kerberos认证 rocketMQ无意义 | …/conf/kerberos/krb5.conf |
| canal.mq.kafka.kerberos.jaasFilePath | kafka kerberos认证 rocketMQ无意义 | …/conf/kerberos/jaas.conf |
| canal.mq.producerGroup | kafka无意义 rocketMQ为ProducerGroup名 | Canal-Producer |
| canal.mq.accessChannel | kafka无意义 rocketMQ为channel模式,如果为aliyun则配置为cloud | local |
| — | — | — |
| canal.mq.vhost= | rabbitMQ配置 | 无 |
| canal.mq.exchange= | rabbitMQ配置 | 无 |
| canal.mq.username= | rabbitMQ配置 | 无 |
| canal.mq.password= | rabbitMQ配置 | 无 |
| canal.mq.aliyunuid= | rabbitMQ配置 | 无 |
| — | — | — |
| canal.mq.canalBatchSize | 获取canal数据的批次大小 | 50 |
| canal.mq.canalGetTimeout | 获取canal数据的超时时间 | 100 |
| canal.mq.parallelThreadSize | mq数据转换并行处理的并发度 | 8 |
| canal.mq.flatMessage | 是否为json格式 如果设置为false,对应MQ收到的消息为protobuf格式 需要通过CanalMessageDeserializer进行解码 | 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版本支持新语法,见下文 |
参考文档:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
五、MQ接收binlog代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/canal/canal-kafka-consumer
六、参考文章
1、canal 发送binlog到mq中性能测试.
2、canal发送消息到kafka中
Canal Server发送binlog消息到Kafka消息队列中的更多相关文章
- Kafka消息重新发送
Kafka消息重新发送 1. 使用kafka消息队列做消息的发布.订阅,如果consumer端消费出问题,导致数据并没有消费,此时不需要担心,数据并不会立刻丢失,kafka会把数据在服务器的磁盘 ...
- 分布式消息系统kafka
kafka:一个分布式消息系统 1.背景 最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveMQ的分布 ...
- Kafka简介及使用PHP处理Kafka消息
Kafka简介及使用PHP处理Kafka消息 Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被 ...
- 发布-订阅消息系统Kafka简介
转载请注明出处:http://www.cnblogs.com/BYRans/ Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式 ...
- kafka 消息系统
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- 5-12 Kafka 消息队列
消息队列(Message Queue) 软件下载 软件下载 MQ_Blog Dubbo远程调用的性能问题 Dubbo调用在微服务项目中普遍存在 这些Dubbo调用都是同步的 "同步" ...
- Golang之发送消息至kafka
windows下安装zookeeper 1.安装JAVA-JDK,从oracle下载最新的SDK安装(我用的是1.8的) 2.安装zookeeper3.3.6,下载地址:http://apache.f ...
- 【转】解决Maxwell发送Kafka消息数据倾斜问题
最近用Maxwell解析MySQL的Binlog,发送到Kafka进行处理,测试的时候发现一个问题,就是Kafka的Offset严重倾斜,三个partition,其中一个的offset已经快200万了 ...
- 、第1节 kafka消息队列:8、9、kafka的配置文件server.properties的说明
10.kafka的配置文件说明 Server.properties配置文件说明 #broker的全局唯一编号,不能重复 broker.id=0 #用来监听链接的端口,producer或consumer ...
随机推荐
- python库--tensorflow--io操作
方法 返回值类型 参数 说明 .train.Saver() 实例s var_list=None 指定被保存和恢复的变量 dict: {name: 变量} list: [变量] None: 所有save ...
- mac下使用vscode技巧
1.查找 command + F 2.查找并替换 选中要替换的文字 再 command + options + F 3.竖状区域部分替换 鼠标点中替换字段的开头或者结尾,按options + s ...
- CodeForce-762B USB vs. PS/2(贪心)
USB vs. PS/2 CodeForces - 762B 题意:有三种电脑,分别有a.b.c个,第一种只有USB接口,第二种只有PS/2接口,第三种有两种接口,有m个鼠标,告诉你价钱和接口类型,问 ...
- 【PHP数据结构】队列的相关逻辑操作
在逻辑结构中,我们已经学习了一个非常经典的结构类型:栈.今天,我们就来学习另外一个也是非常经典的逻辑结构类型:队列.相信不少同学已经使用过 redis . rabbitmq 之类的缓存队列工具.其实, ...
- 一个完整的SEO优化方案
一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析人员 接下来,我们就对这四个小组分配工作. 首先,前端/页编人员主要负责站内优化,主要从四 ...
- 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖
授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...
- jmeter5.2 性能测试 资源监控 JMeterPlugins1.4 ServerAgent2.2.1
一.性能工具的安装部署 1.下载JMeterPlugins-Standard-1.4.0.zip的安装包 2.解压JMeterPlugins-Standard-1.4.0.zip,将其中\lib\ex ...
- Leetcode 矩阵置零
题目描述(中等难度) 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这 ...
- 学习laravel总结中...
1,安装homestead :mac环境 https://learnku.com/docs/laravel-development-environment/5.5/development-enviro ...
- css selector regexp css选择器 正则表达式 css 参考手册
jQuery 选择元素 a.text-success, a.text-danger, a.text-primary, a.text-info $("a[class^=text-]" ...