刚刚在群里看到消息说,时隔一年,canal 1.1.6正式release了,赶紧上去看看有什么新特性。

(居然才发布了6个小时,前排围观)

1、什么是canal

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费。应该是阿里云DTS(Data Transfer Service)的开源版本。

如果想了解更多,可以上github上看官方文档,或者我之前写过的系列基于canal 1.1.4版本的入门文档。

2、重要新特性

我们现在生产用的还是1.1.4版本,用得还算稳定,没有什么特别大的bug。

这次,趁着升级了两个版本,看看1.1.5和1.1.6版本有什么新特性可以值得升级引入。

2.1 MQ发送优化

重点优化MQ发送的性能,单topic最高峰值可支持3~8万的rps,接近数量级上的性能提升

这是1.1.5中的重要特性优化。

为什么canal需要搭配MQ使用,甚至重点优化MQ的投递性能呢?

主要原因是 canal + MQ 可以打造强大的异构存储体系。

canal订阅binlog后有两种模式,一种是直接投递到一种介质,如mysql,一种是投递到MQ然后自定义消费。

如果采用投递到MQ的模式,那么我们就可以利用MQ进行一份消息多端消费(避免重复拉取binlog对MySQL造成影响),用于构建二级索引ES或者构建缓存Redis等等。

另一方面,投递mq以后,对于消息的回溯、监控都能提供更好的途径。

总的来说,canal这个特性优化给 canal + MQ 的模式带来了更加强大的支持。

2.2 MQ发送特性支持

新增rabbitmQ的MQ发送支持 #2156
支持不同topic设置不同的分区数 #2173
rocketMQ新增tag属性的定义 #3438
参数配置支持env环境变量 #3450

这是1.1.5中的一个小优化,但是我觉得非常重要。

比如rocketMQ新增tag属性的定义。实际上在我们的测试环境,就非常需要这个特性。

我们使用rocketMQ的tag做路由,如果业务方自行生产和消费,可以完全根据tag进行路由区分。而从canal订阅的数据库变更,1.1.4版本无法直接给消息打tag,业务消费就无法通过tag进行路由。

现在这个特性的优化,正好可以解决这个问题。

2.3 新增Puslar MQ支持

这是1.1.6中的一个小优化,还是非常与时俱进的。

目前的云原生消息队列Puslar MQ,凭借存储和计算分离的架构在云原生体系下如日中天,而canal就在最新版本支持了对Puslar MQ的投递,手动点赞。

3、重要bug修复

3.1 修复gtid模式下位点持久不更新的问题

这是1.1.5中修复的bug。

GTID又叫全局事务ID(Global Transaction ID),是一个已提交事务的编号,并且是一个全局唯一的编号。MySQL5.6版本之后在主从复制类型上新增了GTID复制。

为什么要引入这个东西呢?

  • GTID使用master_auto_position=1代替了基于binlog和position号的主从复制搭建方式,更便于主从复制的搭建。
  • GTID可以知道事务在最开始是在哪个实例上提交的。
  • GTID方便实现主从之间的failover,再也不用不断地去找position和binlog 了。

为什么我特别关注到这个bug的修复呢?

因为我在2020年对canal 1.1.4进行poc的时候,就发现这个bug了,当时还吐槽了一波,233333。

一晃两年过去了,没想到在1.1.5中已经修复了,手动点赞。

3.2 修复RDB同步下的关键字引起的同步报错

这是1.1.6中修复的bug。

对于这个bug,也是有点记忆犹新。

当时在莫干山度假,突然早上八点收到线上警报,发现数据同步出现异常。

好在随身带了电脑(程序员出远门必备,sigh~),经过排查后发现,就是一个表结构变更引入的关键字导致了同步异常。

往事不堪回首。。。

4、总结

这里简单介绍了几个对我们生产中比较重要的优化和修复,具体更多内容大家可以直接去github上看release note。

总的来说,1.1.5和1.1.6都做了非常多的bug修复和特性优化,还是非常值得升级的。

都看到最后了,原创不易,点个关注,点个赞吧~

文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复【笔记】获取Canal、MySQL、HBase、JAVA实战笔记,回复【资料】获取一线大厂面试资料。

知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)

爷青回,canal 1.1.6来了,几个重要特性和bug修复的更多相关文章

  1. bug 修复:上传库存时前端回发file_name参数丢失;

    # tmp_file = os.path.join(os.path.abspath('youcart/tmp'), json.loads(request.data).get('file_name')) ...

  2. 批量打回未报bug修复

    半天写完了代码,从此开始了三天的bug修复... 问题背景:从合同系统那边获取数据. 1.开发完后,利用mock模拟合同数据,获取(mock中的合同)数据成功,但是在解析合同数据时出错,原因,mock ...

  3. MOJITO 发布一周,爬一波弹幕分析下

    MOJITO 最近一直啥都没写,追个热点都赶不上热乎的,鄙视自己一下. 周董的新歌 「MOJITO」 发售(6 月 12 日的零点)至今大致过去了一周,翻开 B 站 MV 一看,播放量妥妥破千万,弹幕 ...

  4. e分钟带你利用Python制作词云图

    随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法 ...

  5. Gearman实战第一弹:异步处理结算单

    昨天梦回jm,醒来之后看着窗外万里晴空,想大声喊一句:爷青回! 我想起之前使用gearman的岁月.不知不觉也过了快5年,想总结一篇关于gearman的技术文章算是一种对青春的祭奠,再不写的话更少有p ...

  6. 日记 + sb错误

    置顶消息cpdd 1.29 完了,文化课没了 我是废物 1.28 更新了自己的副标题 前副标题:Future never has to do with past time,but present ti ...

  7. 《破碎的残阳,我们逆光》连载小说- HashMap剖析

    破碎的残阳,我们逆光[连载小说]- HashMap剖析 "行到水穷处,坐看云起时"        前言: 偶尔翻阅了自己当时高中时代写的日志,发现了几篇自己多年未打开的自写小说草本 ...

  8. 【爬虫+情感判定+Top10高频词+词云图】"王心凌"热门弹幕python舆情分析

    目录 一.背景介绍 二.代码讲解-爬虫部分 2.1 分析弹幕接口 2.2 讲解爬虫代码 三.代码讲解-情感分析部分 3.1 整体思路 3.2 情感分析打标 3.3 统计top10高频词 3.4 绘制词 ...

  9. 给王心凌打Call的,原来是神奇的智能湖仓

    图文原创:谭婧(王凌老粉) "爷青回" "我们只是老了,并没有死." 谭老师作为老粉,热烈庆祝"甜心教主"王凌成为现象级翻红顶流. 只要地球 ...

随机推荐

  1. 微信小程序wx.login()获取openid,附:前端+后端代码

    微信小程序开放了微信登录的api,无论是个人还是企业申请的小程序均可使用. 首先创建一个项目,把这些代码都清空,我们自己写! 然后,开始写了!首先index.wxml,写一个button用于发起登录 ...

  2. 微信小程序版博客——开发汇总总结(附源码)

    花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...

  3. ES6-11学习笔记--数值的扩展

    二进制 0B      八进制 0O Number.isFinite() , Number.isNaN() Number.parseInt() , Number.parseFloat() Number ...

  4. ES6-11学习笔记--解构赋值

    解构赋值:按照一定模式,从数组和对象中提取值,对变量进行赋值.   数组解构 对象解构 字符串解构 应用场景     曾经的赋值噩梦,非解构赋值数组: let arr = [1, 2, 3]; let ...

  5. 我的python学习记04

    列表,元组,字典的使用一.列表列表的格式:list[元素1,元素2,--]列表也是一个有序集合,下标索引从0开始与字符串类似1.在列表中添加数据append:list.append(添加元素) (在最 ...

  6. 【每日日报】第五十一天---jsp

    1 开始学习JSP的使用 一个简单的jsp代码 <html> <head><title>Hello World</title></head> ...

  7. new String比字符串池浪费空间,为什么要用它?

    对于下面程序中:ss0 = new String( "hello" );是用new()来新建对象的,存于堆中.每调用一次就会创建一个新的对象.当然从节省空间的角度来讲,肯定不如st ...

  8. 初始化properties

    package com.letech.common; import java.io.IOException; import java.util.Properties; public class Con ...

  9. uniapp打包成H5部署到服务器教程

    当前端uniapp写的项目开发完成的时候,需要将页面打包出来,生成H5的静态文件,部署在服务器上,通过服务器链接地址,就可以直接在手机上点开访问 了. 在网上看了一圈,好像没有找到十分详细的教程,这里 ...

  10. Java实现单链表的逆序打印

    思路1:可以将链表进行反转,然后进行数据的输出即可,单链表反转地址如下https://blog.csdn.net/Kevinnsm/article/details/113763272 这个思路1肯定有 ...