Canal v1.1.4版本避坑指南
前提
在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的):
这是一个令人悲伤的故事,这条情感爆发的沸点好像被屏蔽了,另外小水渠(Canal
意为水道、管道)上线一段时间,不出坑的时候风平浪静,一旦出坑令人想屎。重点吐槽几点:
- 目前最新的
RELEASE
版本为v1.1.4
,发布于2019-9-2
,快一年没更新了。 Issue
里面堆积了十分多未处理或者没有回应的问题,有不少问题的年纪比较大。master
分支经常提交异常的代码,构建不友好,因为v1.1.4
比较多问题,也曾经想过用master
代码手动构建,导入项目之后决定放弃,谁试试谁知道,可以尝试对比导入和构建MyBatis
的源码。
这些都只是表象,下面聊聊踩过的坑。
解析线程阻塞问题
这个基本是每个使用Canal
的开发者的必踩之坑。$CANAL_HOME/conf/canal.properties
配置文件中存在一行注释掉的配置:canal.instance.parser.parallelThreadSize = 16
。该配置用于指定解析器实例并发线程数,如果注释了会导致解析线程阻塞,得到的结果就是什么都不会发生。
注释解除即可,建议使用默认值16
。
表结构缓存异常阻塞问题
这是Issue
里面很大部分提问者提到但是久未解决的问题,也就是表结构元数据的存储问题(配置项里面使用了tsdb
也就是时序数据库的字眼,下面就称为tsdb
功能)。
默认开启tsdb
功能,也就是会通过h2
数据库缓存解析的表结构,但是实际情况下,如果上游变更了表结构,h2
数据库对应的缓存是不会更新的,这个时候一般会出现神奇的解析异常,异常的信息一般如下:
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:数据库名称.表名称,新表结构的字段数量 vs 缓存表结构的字段数量;
该异常还会导致一个可怕的后果:解析线程被阻塞,也就是binlog
事件不会再接收和解析。这个问题笔者也查看过很多Issue
,大家都认为是一个严重的BUG
,目前认为比较可行的解决方案是:禁用tsdb
功能(真的够粗暴),也就是canal.instance.tsdb.enable
设置为false
。如果不禁用tsdb
功能,一旦出现了该问题,必须要先停止Canal
服务,接着删除$CANAL_HOME/conf/目标数据库实例标识/h2.mv.db
文件,然后启动Canal
服务。
因为这个比较坑的问题,笔者在生产禁用了tsdb
功能,并且添加了DDL
语句的处理逻辑,直接打到钉钉预警上并且@
整个群的人。
每次看到这个预警都心惊胆战。
日志问题
如果刚好需要定位的binlog
位点处于比较靠后的文件,文件数量比较多,会疯狂打印寻位的日志。之前尝试过重启一下子打印了几GB
日志,超过99%
是定位binlog
文件和position
的日志行。可以考虑通过修改$CANAL_HOME/conf/logback.xml
(并不建议,不清楚源码容易造成其他新的问题)配置或者指定$CANAL_HOME/conf/目标数据库实例标识/instance.properties
的下面几个属性手动定位解析的起点:
canal.instance.master.journal.name=binlog的文件名
canal.instance.master.position=binlog的文件中的位点
canal.instance.master.timestamp=时间戳
canal.instance.master.gtid=gtid的值
以上的手动定位解析的起点的属性需要在下次重启Canal之前更新或者注释掉,否则会造成重新解析或者找不到文件的严重后果!!!
反正每次重启Canal
服务都惊心动魄,没有一个开源软件可以让人有这种感觉。因为生产的服务器磁盘不是很充足,选配的时候只买了100GB
,而且考虑到这些日志本质上没有太大意义,于是只能定期上去删日志,前期是手动删,后来觉得麻烦写了个Shell
脚本定时删除久远的日志文件。
云RDS MySQL的使用问题
如果刚好使用了阿里云的RDS MySQL
,那么有可能会遭遇更大的坑。主要问题是:
RDS MySQL
有磁盘空间优化规则,触发了规则会把binlog
文件上传到OSS
,然后删除本地的binlog
文件。- 从
Canal
的文档来看,会自动拉取OSS
上的binlog
文件进行解析,让使用者无感知,但是此功能有BUG
,一直无法正常使用。 RDS MySQL
是一个暗箱,出了问题只能通过MySQL
的相关查询去定位问题,没有办法进去服务器查看真实的现场。
命中了这个问题,一般出现的异常是:
.................. sqlstate = HY000 errmsg = Could not find first log file name in binary log index file
可以基本确认这个功能是存在缺陷的,例如这里有个Issue-2596:
目前笔者的做法如下:
- 完全弃用
Canal
拉取OSS
上的binlog
文件的功能。 RDS MySQL
尽可能扩容一下磁盘,调整策略让尽可能多的binlog
文件尽可能久地保留在本地,让它们被完全解析后再手动上传或者命中了过期规则后自动上传,这期间有很多东西需要额外收取费用,具体需要自行权衡。
读取和解析OSS上的binlog文件在目前(2020-08-05)的master分支上依然有BUG,想手动构建master分支的伙伴建议放弃幻想。
这个问题的严重后果是:有比较大的可能性导致某段binlog
文件解析完全缺失,除非可以把binlog
文件重新塞回去RDS MySQL
里面,否则需要做上下游手动同步功能。
to be continue
除此之外,要注意Canal
最好做主备部署,提交位点和集群管理建议使用Zookeeper
,而服务模式(canal.serverMode
,目前支持tcp
、kafka
和rocketmq
)建议选用Kafka
(master
分支上有RabbitMQ
的连接器支持,如果想尝鲜可以手动构建一下),并且每个节点的资源要求比较高,笔者生产上每个节点使用了2C8G
低主频的ECS
,感觉有点压不住,特别时重启实例的时候如果需要重新定位binlog
位点,CPU
在一段时间内使用率会飙高。
笔者发现了阿里云的DTS
就是使用了Canal
作为基础中间件进行数据同步的,说明它有被投产到实际应用场景中,真不希望它最终演变成废弃的KPI
任务项目。不知道往后还会遇到多少问题,如果碰到了也会持续更新本避坑指南。
(本文完 c-2-d e-a-20200805)
这是公众号《Throwable》发布的原创文章,收录于专辑《架构与实战》。
Canal v1.1.4版本避坑指南的更多相关文章
- electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3
electron 编译 sqlite3避坑指南(尾部链接有已经编译成功的sqlite3) sqlite很好用,不需要安装,使用electron开发桌面程序,sqlite自然是存储数据的不二之选,奈何编 ...
- CEF避坑指南(一)——下载并编译第一个示例
CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司,如网易.腾讯都开始使用CEF进行前端开 ...
- Linux下Python3.6的安装及避坑指南
Python3的安装 1.安装依赖环境 Python3在安装的过程中可能会用到各种依赖库,所以在正式安装Python3之前,需要将这些依赖库先行安装好. yum -y install zlib-dev ...
- Harmony OS 开发避坑指南——源码下载和编译
Harmony OS 开发避坑指南--源码下载和编译 本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(Hi3516,Hi3518和Hi3861)的编译环境,以及如何将源码编译为三个 ...
- Android连接远程数据库的避坑指南
Android连接远程数据库的避坑指南 今天用Android Studio连接数据库时候,写了个测试连接的按钮,然后连接的时候报错了,报错信息: 2021-09-07 22:45:20.433 705 ...
- Hive改表结构的两个坑|避坑指南
Hive在大数据中可能是数据工程师使用的最多的组件,常见的数据仓库一般都是基于Hive搭建的,在使用Hive时候,遇到了两个奇怪的现象,今天给大家聊一下,以后遇到此类问题知道如何避坑! 坑一:改变字段 ...
- 今天 1024,为了不 996,Lombok 用起来以及避坑指南
Lombok简介.使用.工作原理.优缺点 Lombok 项目是一个 Java 库,它会自动插入编辑器和构建工具中,Lombok 提供了一组有用的注解,用来消除 Java 类中的大量样板代码. 目录 L ...
- Windows环境下Anaconda安装TensorFlow的避坑指南
最近群里聊天时经常会提到DL的东西,也有群友在学习mxnet,但听说坑比较多.为了赶上潮流顺便避坑,我果断选择了TensorFlow,然而谁知一上来就掉坑里了…… 我根据网上的安装教程,默认安装了最新 ...
- spring-boot-starter-thymeleaf 避坑指南
第一步:pom配置环境 先不要管包是做什么的 总之必须要有 否则进坑 <!--避坑包--> <dependency> <groupId>net.sourceforg ...
随机推荐
- redis(十五):Redis 有序集合(sorted set)(python)
#coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66 ...
- python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super
https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...
- LeetCode 82,考察你的基本功,在有序链表中删除重复元素II
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第51篇文章,我们来看LeetCode第82题,删除有序链表中的重复元素II(Remove Duplicates ...
- Serverless的概念&定义-无服务计算详解
过去几年间,Serverless 发展迅猛,与其相伴的还有从小程序.移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注 Serverless到底是什么? 在国内,Se ...
- three.js 绘制3d地图
通过地图数据配合three可以做出非常酷炫的地图,在大数据展示中十分常见. 这篇郭先生就来说说使用three.js几何体制作3D地图.在线案例点击原文地址. 地图的数据是各个地图块的点数组,通过THR ...
- 【Docker】Redis 安装使用教程
1.安装 1.1 拉取镜像 docker pull redis redis:4.0 1.2 创建redis容器名"redistest1",并开启持久化 docker run -d ...
- scrapyd+gerapy的项目部署
scrapyd+gerapy的项目部署: 简单学习,后续跟进完善 声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 环境配置: scrapyd下载: pip ins ...
- 将终结点图添加到你的ASP.NET Core应用程序中
在本文中,我将展示如何使用DfaGraphWriter服务在ASP.NET Core 3.0应用程序中可视化你的终结点路由.上面文章我向您演示了如何生成一个有向图(如我上篇文章中所示),可以使用Gra ...
- vue : 使用stylus less (包括sublime插件支持)
版本: vue 2.5.2 webpack 3.6.0 先说stylus. 用npm装个包. npm install stylus stylus-loader --save-dev 然后在.vue文件 ...
- css选择器大全
1.元素选择器 这是最基本的CSS选择器,HTML文档中的元素本身就是一个选择器: p {line-height:1.5em; margin-bottom:1em;} //设置p元素行高1.5em,距 ...