protobuf 解析工具_利用Canal投递MySQL Binlog到Kafka经典案例解析

Canal是阿里开源的一个比较有名的Java中间件,主要作用是接入数据库(MySQL)的binlog日志,实现数据的增量订阅、解析与消费,即CDC(Change Data Capture)。近期我们计划将数据仓库由基于Sqoop的离线按天入库方式改为近实时入库,Canal自然是非常符合需求的。

Canal的模块设计精妙,但代码质量低,阅读起来比较困难。在其GitHub Wiki中详细叙述了其设计思路,值得学习,这里不再赘述,参见:https://github.com/alibaba/canal/wiki/Introduction。

在最新的Canal 1.1.x版本中,其新增了对消息队列的原生支持,通过不算复杂的配置可以直接将binlog投递到Kafka或者RocketMQ,无需再自己写producer程序(源码中有现成的CanalKafkaProducer和CanalRocketMQProducer类)。

我们使用目前的稳定版本1.1.2小试一下。

4a6f2f9f70891a99af2203b505f2a065.png

Canal最简单原理示意

前置工作

  • 保证MySQL的binlog-format=ROW
  • 为canal用户配置MySQL slave的权限
CREATE USER canal IDENTIFIED BY 'canal';  GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';FLUSH PRIVILEGES;

canal.properties设置

顺便还可以复习一下Kafka producer的一些配置参数含义。

# 默认值tcp,这里改为投递到Kafkacanal.serverMode = kafka# Kafka bootstrap.servers,可以不用写上全部的brokerscanal.mq.servers = 10.10.99.132:9092,10.10.99.133:9092,10.10.99.134:9092,10.10.99.135:9092# 投递失败的重试次数,默认0,改为2canal.mq.retries = 2# Kafka batch.size,即producer一个微批次的大小,默认16K,这里加倍canal.mq.batchSize = 32768# Kafka max.request.size,即一个请求的最大大小,默认1M,这里也加倍canal.mq.maxRequestSize = 2097152# Kafka linger.ms,即sender线程在检查微批次是否就绪时的超时,默认0ms,这里改为200ms# 满足batch.size和linger.ms其中之一,就会发送消息canal.mq.lingerMs = 200# Kafka buffer.memory,缓存大小,默认32Mcanal.mq.bufferMemory = 33554432# 获取binlog数据的批次大小,默认50canal.mq.canalBatchSize = 50# 获取binlog数据的超时时间,默认200mscanal.mq.canalGetTimeout = 200# 是否将binlog转为JSON格式。如果为false,就是原生Protobuf格式canal.mq.flatMessage = true# 压缩类型,官方文档没有描述canal.mq.compressionType = none# Kafka acks,默认all,表示分区leader会等所有follower同步完才给producer发送ack# 0表示不等待ack,1表示leader写入完毕之后直接ackcanal.mq.acks = all# Kafka消息投递是否使用事务# 主要针对flatMessage的异步发送和动态多topic消息投递进行事务控制来保持和Canal binlog位置的一致性# flatMessage模式下建议开启canal.mq.transaction = true
instance.properties设置
# 需要接入binlog的表名,支持正则,但这里手动指定了每张表,注意转义canal.instance.filter.regex=mall.address,mall.orders,mall.order_product,mall.product,mall.mall_category,mall.mall_comment,mall.mall_goods_category,mall.mall_goods_info,mall.mall_goods_wish,mall.mall_new_tags_v2,mall.mall_topic,mall.mall_topic_goods,mall.mall_user_cart_info# 黑名单canal.instance.filter.black.regex=# 消息队列对应topic名canal.mq.topic
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值