当前位置: 首页 > 科技观察

叶清辉,Canal1.1.6来了,几个重要的特性和bug修复

时间:2023-03-15 10:22:51 科技观察

刚在群里看到新闻,Canal1.1.6时隔一年正式发布,赶紧看看有什么新特性。(才发布6小时,前排围观)1.什么是canalcanal[k?'n?l],翻译为waterway/pipeline/ditch,主要用途是基于MySQL数据库增量日志分析,提供增量数据订阅和消费。应该是阿里云DTS(DataTransferService)的开源版本。如果想了解更多可以看github上的官方文档,或者我之前写的基于canal1.1.4的系列介绍文档。2.重要新特性生产上还是使用1.1.4版本,比较稳定,没有特别大的bug。这次在升级两个版本的同时,看看1.1.5和1.1.6版本有哪些值得升级的新特性。1、MQ发送优化重点优化MQ发送的性能。单个主题的最高峰值可以支持30,000到80,000rps,接近一个数量级的性能提升。这是1.1.5中一个重要的功能优化。为什么canal需要和MQ一起使用,甚至专注于优化MQ的交付性能?主要原因是canal+MQ可以打造强大的异构存储系统。canal订阅binlog后有两种模式,一种是直接投递到一个介质,比如mysql,另一种是投递到MQ,然后自定义消费。如果采用投递到MQ的方式,那么我们可以使用MQ进行一条消息的多端消费(避免重复拉取binlog对MySQL的影响),用于构建二级索引ES或者构建缓存Redis等。另一方面,mq下发后,可以为消息的回溯和监听提供更好的方式。总的来说,canal的特性优化为canal+MQ的模式带来了更强大的支持。2.MQ发送功能支持新的rabbitmQMQ发送支持#2156。支持不同主题设置不同数量的分区#2173。RocketMQ添加标签属性#3438的定义。参数配置支持env环境变量#3450。这是1.1.5中的一个小优化,但我认为非常重要。比如rocketMQ增加了tag属性的定义。其实在我们的测试环境中,这个功能是非常需要的。我们使用rocketMQ的标签进行路由。如果是商家自己生产和消费,完全可以根据标签来区分。但是从canal订阅的数据库变化来看,1.1.4版本不能直接给消息打标签,业务消费不能通过标签进行路由。这个特性的优化正好可以解决这个问题。3.增加了对PuslarMQ的支持。这是1.1.6中的一个小优化,非常新。目前的云原生消息队列PuslarMQ凭借存储和计算分离的架构在云原生体系中蓬勃发展,canal支持最新版本的PuslarMQ交付,手动点赞。三、重要bug修复1、修复gtid模式下站点长时间不更新的问题。这是1.1.5中修复的错误。GTID也称为全局事务ID(GlobalTransactionID),是一个已提交事务的编号,是一个全局唯一的编号。MySQL5.6之后,主从复制类型增加了GTID复制。为什么要介绍这个东西?GTID使用master_auto_position=1代替基于binlog和positionnumber的主从复制方式,更方便主从复制。GTID可以知道事务最初是在哪个实例上提交的。GTID方便master和slave之间的failover,不需要不断的去寻找position和binlog。为什么我特别关注这个bug的修复?因为我在2020年在canal1.1.4上做poc的时候发现了这个bug,当时抱怨很多,233333。一晃两年过去了,没想到1.1.5已经修复了,我喜欢手动。2、修复RDB同步下关键字导致的同步错误这是1.1.6修复的bug。对于这个bug,也是记忆犹新。那时,我正在莫干山度假。早上8:00突然接到在线告警,发现数据同步异常。幸好随身带了电脑(程序员出差在外必备,唉~)。经过排查,发现是表结构变化引入的关键字导致了同步异常。忘记过去。..4.小结这里简单介绍一下对我们制作比较重要的几个优化和修复。更多详细信息,可以直接查看github上的releasenote。总的来说,1.1.5和1.1.6都做了很多bug修复和功能优化,还是值得升级的。