Canal是阿里巴巴开源的MySQL binlog增量订阅消费组件,广泛用于数据同步,今天来深入剖析它的原理和底层机制。
Canal,是,阿里巴巴,开源,的,MySQL,binlog,增量,订阅,消费,组件,广泛,用于,数据,同步,场景,比如,跨,机房,数据,同步,缓存,更新,搜索,索引,更新,数据,异构,等等,很多,公司,都,在,用,Canal,做,数据,同步。
我,自己,也,在,项目,中,使用,Canal,做,数据,同步,用,了,一段时间,对,它,的,原理,和,机制,有,了,一些,理解,今天,这篇,文章,就,来,深入,剖析,Canal,的,原理,和,底层,机制。
一、Canal是什么,解决什么问题
在,深入,原理,之前,先,搞,清楚,Canal,是什么,解决,什么,问题,很多,人,可能,听说,过,Canal,但是,不,太,清楚,它,具体,是,做,什么,的。
Canal,翻译,过来,是,"水道,管道",的,意思,它,是,阿里巴巴,开源,的,一个,项目,主要,用途,是,基于,MySQL,数据库,binlog,的,增量,订阅,和,消费,简单,来说,就是,Canal,能,模拟,MySQL,从库,向,主库,发送,dump,协议,请求,主库,推送,binlog,给,Canal,Canal,解析,binlog,然后,把,解析,后,的,数据,提供,给,下游,消费者,消费者,拿到,数据,变更,之后,就,可以,做,各种,事情,比如,同步,到,其他,数据库,更新,缓存,更新,搜索,索引,等等。
那,Canal,解决,什么,问题,呢,主要,是,数据,同步,的,问题,在,实际,项目,中,我们,经常,需要,把,MySQL,的,数据,同步,到,其他,地方,比如:
- 跨机房数据同步:为了,高可用,和,异地,多活,我们,可能,在,多个,机房,都,部署,了,MySQL,需要,把,一个,机房,的,数据,同步,到,其他,机房,保持,数据,一致。
- 缓存更新:我们,用,Redis,等,做,缓存,缓存,的,数据,来自,MySQL,当,MySQL,数据,变更,的,时候,需要,及时,更新,或者,删除,缓存,保持,缓存,和,数据库,一致。
- 搜索索引更新:我们,用,Elasticsearch,等,做,搜索,索引,索引,数据,来自,MySQL,当,MySQL,数据,变更,的,时候,需要,及时,更新,搜索,索引,保持,索引,和,数据库,一致。
- 数据异构:我们,可能,需要,把,MySQL,的,数据,同步,到,其他,存储,比如,HBase,Hive,ClickHouse,等等,做,数据分析,或者,其他,用途,需要,保持,数据,同步。
这些,场景,都,需要,获取,MySQL,的,数据,变更,然后,做,相应,的,处理,以前,常见,的,做法,是,在,业务,代码,里,数据,变更,的,时候,同步,做,这些,事情,比如,更新,数据库,之后,同时,更新,缓存,更新,搜索,索引,等等,但是,这种,做法,有,很多,问题:
- 业务代码耦合:业务,代码,里,要,处理,数据,同步,的,逻辑,和,业务,逻辑,耦合,在,一起,代码,复杂,难,维护。
- 一致性问题:如果,更新,数据库,成功,了,但是,更新,缓存,或者,搜索,索引,失败,了,就,会,出现,数据,不一致,的,问题,而且,很难,处理。
- 性能问题:业务,接口,里,同步,做,很多,事情,会,增加,接口,响应,时间,影响,性能,和,用户,体验。
- 可靠性问题:业务,服务,重启,或者,宕机,的,时候,可能,会,丢失,数据,变更,导致,数据,不一致。
Canal,就是,为了,解决,这些,问题,而,诞生,的,它,通过,订阅,MySQL,的,binlog,来,获取,数据,变更,然后,异步,地,通知,下游,消费者,处理,这样,业务,代码,只,需要,关注,业务,逻辑,不用,处理,数据,同步,的,事情,解耦,了,而且,Canal,能,保证,数据,变更,不,丢失,可靠,地,传递,给,下游,解决,了,一致性,和,可靠性,的,问题,同时,异步,处理,也,不,影响,业务,接口,的,性能,所以,Canal,是,一个,很,好,的,数据,同步,解决方案。
二、MySQL binlog基础
要,理解,Canal,的,原理,首先,要,了解,MySQL,的,binlog,因为,Canal,就是,基于,binlog,来,做,数据,同步,的,下面,简单,介绍,一下,MySQL,binlog,的,基础知识。
binlog,是,MySQL,的,二进制,日志,Binary Log,它,记录,了,MySQL,数据库,的,所有,数据,变更,操作,包括,DDL,和,DML,语句,但是,不,包括,SELECT,和,SHOW,等,查询,语句,binlog,主要,有,两个,用途:
- 主从复制:MySQL,主从,复制,就是,基于,binlog,的,主库,把,数据,变更,记录,到,binlog,从库,读取,主库,的,binlog,然后,重放,到,自己,的,数据库,保持,主从,数据,一致。
- 数据恢复:如果,数据库,误操作,或者,数据,损坏,可以,通过,binlog,来,恢复,数据,因为,binlog,记录,了,所有,数据,变更,可以,重放,binlog,恢复,到,某个,时间点,的,状态。
binlog,有,三种,格式:
- STATEMENT:基于,SQL,语句,的,复制,binlog,记录,的,是,原始,的,SQL,语句,这种,格式,的,优点,是,binlog,文件,小,但是,缺点,是,有些,函数,比如,UUID,NOW,等等,在,主从,执行,结果,可能,不,一致,导致,主从,数据,不一致,所以,现在,一般,不,用,这种,格式。
- ROW:基于,行,的,复制,binlog,记录,的,是,每,一行,数据,的,变更,包括,变更,前,和,变更,后,的,数据,这种,格式,的,优点,是,能,准确,记录,每,一行,的,变更,不会,有,函数,导致,的,不一致,问题,主从,数据,一致性,好,缺点,是,binlog,文件,比较,大,因为,要,记录,每行,的,变更,数据,Canal,主要,就是,基于,ROW,格式,的,binlog,来,解析,数据,变更,的,因为,ROW,格式,能,提供,完整,的,行,数据,变更,方便,下游,处理。
- MIXED:混合,模式,MySQL,会,根据,SQL,语句,自动,选择,用,STATEMENT,还是,ROW,格式,一般,的,语句,用,STATEMENT,特殊,的,可能,导致,不一致,的,语句,用,ROW,这种,格式,结合,了,两者,的,优点,但是,也,比较,复杂。
对于,Canal,来说,建议,MySQL,使用,ROW,格式,的,binlog,因为,这样,Canal,能,解析,到,完整,的,行,数据,变更,包括,变更,前,和,变更,后,的,数据,方便,下游,消费者,处理,如果,用,STATEMENT,或者,MIXED,格式,Canal,可能,解析,不,到,完整,的,行,数据,或者,解析,比较,麻烦,所以,使用,Canal,的,时候,一定要,确保,MySQL,的,binlog,格式,是,ROW。
另外,binlog,还有,一个,重要,的,概念,就是,binlog,位置,position,每个,binlog,事件,都,有,对应的,文件名,和,位置,偏移量,Canal,会,记录,自己,消费,到,的,binlog,位置,这样,重启,或者,故障,恢复,的,时候,能,从,上次,的,位置,继续,消费,不,会,丢失,数据,也,不,会,重复,消费,这,是,Canal,保证,数据,可靠性,的,基础。
三、Canal整体架构
了解,了,binlog,基础,之后,下面,来,看看,Canal,的,整体,架构,Canal,的,架构,其实,不,复杂,主要,由,几个,部分,组成:
- Canal Server:Canal,服务端,是,Canal,的,核心,负责,连接,MySQL,模拟,从库,请求,binlog,解析,binlog,存储,解析,后,的,数据,提供,给,客户端,消费,Canal,Server,可以,部署,多个,实例,每个,实例,对应,一个,MySQL,实例,或者,一个,数据库,这样,能,同时,同步,多个,MySQL,的,数据。
- Canal Client:Canal,客户端,负责,连接,Canal,Server,获取,解析,后,的,数据,变更,然后,做,相应,的,处理,比如,同步,到,其他,数据库,更新,缓存,更新,搜索,索引,等等,Canal,提供,了,Java,客户端,也,有,其他,语言,的,客户端,或者,可以,通过,TCP,协议,自己,实现,客户端。
- ZooKeeper:可选,组件,用于,Canal,Server,的,高可用,和,工作,节点,协调,如果,部署,了,多个,Canal,Server,节点,可以,通过,ZooKeeper,做,主备,切换,保证,高可用,也,能,协调,多个,实例,的,分配,和,负载,均衡,当然,如果,只是,单,节点,部署,也,可以,不用,ZooKeeper。
- MySQL:数据源,Canal,连接,的,MySQL,主库,或者,从库,Canal,会,模拟,从库,向,MySQL,发送,dump,协议,请求,MySQL,推送,binlog,给,Canal。
整体,的,数据,流程,是,这样,的:
- Canal Server,启动,连接,MySQL,模拟,从库,发送,dump,协议,请求,指定,binlog,文件名,和,位置。
- MySQL,收到,请求,开始,推送,binlog,事件,给,Canal Server。
- Canal Server,接收,binlog,事件,解析,binlog,把,二进制,的,binlog,解析,成,结构化,的,数据,包括,表名,字段,变更,类型,变更,前,数据,变更,后,数据,等等。
- Canal Server,把,解析,后,的,数据,存储,到,内部,的,存储,模块,里,等待,客户端,消费。
- Canal Client,连接,Canal Server,发起,获取,数据,的,请求。
- Canal Server,把,存储,的,数据,返回,给,Canal Client。
- Canal Client,拿到,数据,之后,做,相应,的,处理,比如,同步,到,其他,数据库,更新,缓存,等等,处理,完成,后,向,Canal Server,发送,ACK,确认,消费,成功。
- Canal Server,收到,ACK,之后,更新,消费,位置,记录,到,ZooKeeper,或者,本地,文件,里,这样,下次,重启,能,从,这个,位置,继续,消费。
这,就是,Canal,整体,的,架构,和,数据,流程,比较,简单,清晰,核心,就是,模拟,MySQL,从库,获取,binlog,解析,然后,提供,给,下游,消费。
四、Canal核心原理剖析
下面,来,深入,剖析,Canal,的,核心,原理,包括,几个,关键,部分,的,实现,机制。
1. 模拟MySQL从库,dump协议
这,是,Canal,最,核心,的,原理,Canal,是,怎么,获取,MySQL,的,binlog,的,呢,其实,就是,模拟,MySQL,从库,向,主库,发送,dump,协议,请求,MySQL,主库,收到,请求,之后,就,会,像,对待,从库,一样,把,binlog,推送,给,Canal。
具体,来说,Canal,会,用,MySQL,的,客户端,协议,连接,MySQL,服务器,然后,执行,一些,初始化,命令,比如,设置,从库,的,serverid,设置,binlog,格式,检查,等等,然后,发送,COMBINLOG_DUMP,命令,指定,要,从,哪个,binlog,文件,的,哪个,位置,开始,推送,binlog,MySQL,收到,这个,命令,之后,就,会,开始,推送,binlog,事件,给,Canal,Canal,就,能,持续,获取,MySQL,的,数据,变更,了。
这个,原理,其实,和,MySQL,主从复制,的,原理,是,一样,的,从库,也是,这样,向,主库,发送,dump,请求,获取,binlog,然后,重放,Canal,只是,把,自己,伪装,成,一个,从库,获取,binlog,但是,不,重放,到,数据库,而是,解析,后,提供,给,下游,消费者,这,就是,Canal,的,核心,原理,很,巧妙,也,很,简单,利用,了,MySQL,本身,的,主从复制,协议,不用,修改,MySQL,任何,代码,也,不用,侵入,业务,代码,就能,获取,数据,变更,这,也是,Canal,的,优势,所在。
2. binlog解析
Canal,获取,到,binlog,之后,需要,解析,binlog,把,二进制,的,binlog,数据,解析,成,结构化,的,数据,方便,下游,消费者,处理,这,也是,Canal,的,核心,功能,之一。
MySQL,的,binlog,是,二进制,格式,的,由,一系列,的,binlog,事件,event,组成,每个,事件,有,事件,头,和,事件,体,事件,头,包含,事件,类型,时间戳,服务器,ID,事件,大小,等等,信息,事件,体,包含,具体,的,事件,数据,不同,类型,的,事件,格式,不,一样。
Canal,需要,解析,各种,类型,的,binlog,事件,比如:
- QUERY_EVENT:查询,事件,记录,DDL,语句,比如,CREATE TABLE,ALTER TABLE,等等,Canal,需要,解析,这些,DDL,语句,更新,表结构,元数据,因为,表结构,变更,会,影响,后续,DML,事件,的,解析。
- TABLEMAPEVENT:表映射,事件,记录,表,ID,和,表名,数据库,名,的,映射,关系,以及,字段,类型,信息,后续,的,行,变更,事件,通过,表,ID,来,关联,表,信息,所以,Canal,需要,解析,这个,事件,维护,表,ID,和,表,元数据,的,映射。
- WRITEROWSEVENT:写入,行,事件,对应,INSERT,操作,记录,插入,的,行,数据,Canal,需要,解析,这个,事件,获取,插入,的,行,数据,提供,给,下游。
- UPDATEROWSEVENT:更新,行,事件,对应,UPDATE,操作,记录,变更,前,和,变更,后,的,行,数据,Canal,需要,解析,这个,事件,获取,变更,前后,的,数据,提供,给,下游。
- DELETEROWSEVENT:删除,行,事件,对应,DELETE,操作,记录,删除,的,行,数据,Canal,需要,解析,这个,事件,获取,删除,的,行,数据,提供,给,下游。
还有,其他,一些,事件,类型,比如,XIDEVENT,事务,提交,事件,ROTATEEVENT,binlog,文件,切换,事件,等等,Canal,都,需要,解析,处理。
Canal,解析,binlog,的,过程,就是,读取,binlog,事件,根据,事件,类型,用,对应,的,解析器,解析,事件,数据,然后,组装,成,结构化,的,数据,对象,比如,Canal,的,Entry,对象,包含,数据库,名,表名,事件,类型,行,数据,等等,然后,存储,起来,等待,客户端,消费。
binlog,解析,是,一个,比较,复杂,的,过程,因为,MySQL,binlog,格式,比较,复杂,而且,不同,版本,的,MySQL,binlog,格式,可能,有,差异,Canal,需要,兼容,各种,版本,的,MySQL,这,也是,Canal,的,技术,难点,之一,不过,Canal,已经,做,了,很好,的,封装,用户,不用,关心,binlog,解析,的,细节,直接,用,解析,好,的,结构化,数据,就,行。
3. 数据存储和消费机制
Canal,解析,完,binlog,之后,需要,存储,解析,后,的,数据,等待,客户端,消费,Canal,内部,有,一个,存储,模块,用来,存储,解析,后,的数据,默认,是,用,内存,存储,也,支持,其他,存储,实现,比如,持久化,存储,等等。
Canal,的,存储,模块,是,一个,环形,队列,RingBuffer,的,实现,解析,后,的数据,会,放,到,环形,队列,里,客户端,从,环形,队列,里,获取,数据,消费,环形,队列,有,一个,读,指针,和,写,指针,写,指针,指向,下,一个,写入,的,位置,读,指针,指向,下,一个,读取,的,位置,数据,写入,后,写,指针,前移,数据,读取,并,ACK,后,读,指针,前移,这样,实现,数据,的,存储,和,消费。
Canal,的,消费,机制,是,拉,模式,Pull,客户端,主动,向,Canal Server,发起,请求,获取,数据,而,不是,Canal Server,主动,推,给,客户端,这样,客户端,可以,根据,自己,的,处理,能力,控制,消费,速度,不会,因为,下游,处理,慢,而,导致,Canal Server,压力,过大,也,能,避免,数据,堆积,过多,客户端,获取,数据,之后,处理,完成,需要,向,Canal Server,发送,ACK,确认,消费,成功,Canal Server,收到,ACK,之后,才,会,更新,读,指针,释放,已,消费,的,数据,如果,客户端,获取,数据,之后,处理,失败,没有,发送,ACK,那么,下次,获取,数据,的,时候,还,会,拿到,同样,的,数据,保证,数据,不,丢失,这,是,至少,一次,的,投递,语义,at-least-once,保证,数据,不,丢,但是,可能,重复,消费,所以,下游,消费者,需要,做,幂等,处理,避免,重复,消费,导致,数据,问题。
Canal,还,支持,多,客户端,消费,同一个,实例,的,数据,也就是,广播,模式,多个,客户端,都,能,拿到,同样,的,数据,各自,消费,各自,ACK,这样,不同,的,下游,系统,可以,独立,消费,同一份,数据,做,不同,的,处理,比如,一个,客户端,同步,数据,到,另一个,数据库,另一个,客户端,更新,缓存,另一个,客户端,更新,搜索,索引,等等,互不,影响,这,也是,Canal,很,方便,的,一个,特性。
4. 高可用机制
Canal,支持,高可用,部署,通过,ZooKeeper,实现,主备,切换,保证,服务,不,中断,具体,来说,可以,部署,多个,Canal Server,节点,都,连接,同一个,ZooKeeper,集群,启动,的,时候,各个,节点,会,在,ZooKeeper,上,抢,锁,抢到,锁,的,节点,成为,主节点,负责,连接,MySQL,获取,binlog,提供,数据,消费,其他,节点,成为,备节点,不,连接,MySQL,只是,监听,主节点,的,状态,如果,主节点,宕机,或者,网络,分区,ZooKeeper,上,的,锁,会,超时,释放,备节点,会,重新,抢,锁,抢到,的,成为,新,的,主节点,继续,提供,服务,实现,主备,切换,保证,高可用。
而且,Canal,的,消费,位置,是,记录,在,ZooKeeper,上,的,主备,切换,之后,新,的,主节点,能,从,ZooKeeper,读取,上次,的,消费,位置,从,那个,位置,继续,消费,不,会,丢失,数据,也,不,会,重复,太多,数据,保证,数据,的,连续性,和,可靠性。
当然,高可用,部署,需要,ZooKeeper,也,增加,了,部署,的,复杂度,如果,对,高可用,要求,不,高,也,可以,单,节点,部署,不用,ZooKeeper,简单,方便,根据,自己,的,需求,选择,合适,的,部署,方式。
五、使用注意事项和最佳实践
最后,来说,说,使用,Canal,的,注意,事项,和,最佳,实践,帮,大家,更,好,地,使用,Canal,避免,踩,坑。
1. MySQL配置要求
使用,Canal,的,MySQL,需要,满足,一些,配置,要求:
- binlog格式必须是ROW:前面,说,过,Canal,需要,ROW,格式,的,binlog,才能,解析,到,完整,的,行,数据,所以,要,确保,MySQL,的,binlog_format=ROW。
- binlogrowimage必须是FULL:MySQL,5.6,之后,有,binlogrowimage,参数,控制,binlog,记录,行,数据,的,方式,默认,是,FULL,记录,变更,前后,所有,字段,的,数据,如果,设置,成,MINIMAL,或者,NOBLOB,可能,只,记录,部分,字段,Canal,解析,的,数据,不,完整,所以,建议,设置,binlogrowimage=FULL。
- serverid不能和其他从库重复:Canal,模拟,从库,需要,设置,一个,唯一,的,serverid,不能,和,MySQL,主库,以及,其他,从库,的,server_id,重复,不然,会,有,冲突,导致,binlog,同步,异常。
- 账号权限:Canal,连接,MySQL,的,账号,需要,有,REPLICATION SLAVE,和,REPLICATION CLIENT,权限,才能,获取,binlog,所以,要,给,Canal,使用,的,MySQL,账号,授权,这,两个,权限。
2. 下游消费要做幂等
前面,说,过,Canal,是,至少,一次,的,投递,语义,可能,会,重复,投递,数据,所以,下游,消费者,一定要,做,幂等,处理,避免,重复,消费,导致,数据,问题,比如,重复,插入,数据,重复,更新,缓存,等等,幂等,的,方式,有,很多,比如,用,主键,或者,唯一,键,判断,数据,是否,已经,处理,过,用,版本号,或者,时间戳,判断,数据,新旧,用,分布式,锁,防止,重复,处理,等等,根据,自己,的,业务,场景,选择,合适,的,幂等,方式,一定要,做,幂等,不然,重复,消费,会,导致,数据,混乱,问题,很,严重。
3. 注意DDL变更处理
MySQL,的,DDL,变更,比如,加,字段,改,字段,类型,等等,会,导致,表结构,变化,Canal,会,解析,DDL,事件,更新,表结构,元数据,但是,下游,消费者,也,需要,注意,处理,DDL,变更,比如,加,了,新,字段,下游,的,数据,模型,也,需要,相应,更新,不然,可能,解析,不,了,新,字段,的,数据,或者,同步,到,目标,库,的,时候,报错,所以,做,数据,同步,的,时候,要,注意,DDL,变更,的,处理,最好,有,一套,机制,能,自动,同步,表结构,变更,或者,在,DDL,变更,的,时候,通知,下游,更新,数据,模型,避免,出,问题。
4. 监控和告警
使用,Canal,的,时候,一定要,做好,监控,和,告警,因为,Canal,是,数据,同步,的,核心,组件,如果,出,问题,会,导致,数据,不,一致,影响,很大,所以,要,监控,Canal,的,运行,状态,比如,是否,正常,连接,MySQL,是否,正常,获取,binlog,消费,延迟,是,多少,有没有,数据,堆积,等等,一旦,有,异常,及时,告警,通知,运维,人员,处理,避免,问题,扩大,Canal,本身,提供,了,一些,监控,指标,也,可以,通过,JMX,或者,其他,方式,获取,监控,数据,接入,自己,的,监控,系统,做好,监控,和,告警,保证,Canal,稳定,运行。
5. 合理设置批次大小和超时时间
Canal,客户端,获取,数据,的,时候,可以,设置,批次,大小,和,超时,时间,批次,大小,是,每次,获取,多少,条,数据,超时,时间,是,等待,数据,的,最长,时间,要,根据,自己,的,业务,场景,合理,设置,这,两个,参数,如果,批次,大小,太,小,会,频繁,请求,Canal Server,增加,网络,开销,和,Canal Server,压力,如果,批次,大小,太,大,一次,获取,太多,数据,下游,处理,时间,长,可能,导致,消费,延迟,增加,也,可能,占用,太多,内存,超时,时间,也,要,合理,设置,不要,太,短,也,不要,太,长,太,短,的话,没有,数据,也,频繁,返回,增加,开销,太,长,的话,客户端,长时间,不,返回,可能,被,认为,超时,断开,连接,所以,要,根据,实际,情况,合理,设置,这,两个,参数,达到,最,优,的,消费,性能。
六、写在最后
Canal,是,一个,很,优秀,的,开源,数据,同步,组件,基于,MySQL,binlog,实现,增量,数据,订阅,和,消费,原理,巧妙,实现,可靠,广泛,应用,于,各种,数据,同步,场景,能,帮,我们,解决,很多,数据,同步,的,问题,提升,系统,的,解耦,性,和,可靠性。
今天,这篇,文章,深入,剖析,了,Canal,的,原理,和,底层,机制,包括,它,解决,什么,问题,MySQL,binlog,基础,整体,架构,核心,原理,以及,使用,注意,事项,和,最佳,实践,希望,能,给,使用,或者,想,了解,Canal,的,朋友,一些,参考,和,启发,帮,大家,更,好,地,理解,和,使用,Canal。
当然,Canal,的,内容,还有,很多,这里,只是,介绍,了,核心,的,原理,和,机制,还有,很多,细节,和,高级,特性,没有,涉及,大家,如果,想,更,深入,了解,可以,去,看,Canal,的,官方,文档,和,源码,Canal,的,源码,质量,很,高,结构,清晰,很,值得,学习,通过,看,源码,能,更,深入,理解,它,的,实现,机制,也,能,学到,很多,编程,和,架构,的,技巧。
最后,希望,大家,都,能,用,好,Canal,解决,自己,项目,中,的,数据,同步,问题,也,欢迎,大家,在,评论,区,分享,你们,使用,Canal,的,经验,和,踩,过,的,坑,一起,交流,一起,进步,谢谢,大家,的,阅读。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录