[canal数据库同步]数据同步利器 - canal

  大约两年以前,笔者在一个项目中遇到了数据同步的难题。

  当时,系统部署了几十个实例,分为1个中心平台和N个分中心平台,而每一个系统都对应一个单独的数据库实例。

  在数据库层面,有这样一个需求:

  中心平台数据库要包含所有系统平台的数据。

  分中心数据库只包含本系统平台的数据。

  在中心平台可以新增或修改 分 中心平台的数据,但要讲数据实时同步到对应的分中心平台数据库。

  这几十个数据库实例之间,没有明确的主从关系,是否同步还要看数据的来源,所以并不能用MySQL的主从同步来做。

  当时,笔者实验了几种方式,最后采用的方式是基于Mybatis拦截器机制 + 消息队列的方式来做的。

  大概原理是通过Mybatis拦截器,拦截到事务操作,比如新增、修改和删除,根据自定义的数据主键(标识数据来源和去向),封装成对象,投递到消息队列对应的topic中去。然后,每个系统监听不同的topic,消费数据并同步到数据库。

  在此后的一段时间里,知道了canal这个开源组件。发现它更直接,它可以从MySQL的binlog中解析数据,投递到消息队列或其它地方。

  说起canal,也是阿里巴巴存在数据同步的业务需求。所以从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务。

  基于日志增量订阅&消费支持的业务:

  数据库镜像

  数据库实时备份

  多级索引 (卖家和买家各自分库索引)

  search build

  业务cache刷新

  价格变化等重要业务消息

  我们正可以基于canal的机制,来完成一系列如数据同步、缓存刷新等业务。

  1、修改MySQL配置

  对于自建的MySQL服务, 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下:

  然后创建一个账户,用来链接MySQL,作为 MySQL slave 的权限。

  2、下载

  下载canal非常简单,访问 releases页面选择需要的包下载,然后将下载的包解压到指定的目录即可。

  解压完成后,我们可以看到这样一个目录:

  [canal数据库同步]数据同步利器 - canal

  3、修改配置

  在启动之前,还需要修改一些配置信息。

  首先,定位到 ,编辑配置文件,重点有几项:

  我们希望canal监听到的数据,要发送到消息队列中,还需要修改文件,在这里主要是MQ的配置。在这里笔者使用的是阿里云版RocketMQ,参数如下:

  4、启动

  直接运行启动脚本即可运行: 。 然后打开文件,可以看到启动效果。

  我们把canal监听到的数据,投送到了消息队列中,那么接下来就是写个监听程序来消费其中的数据。

  为了方便,笔者直接使用的是阿里云版RocketMQ,测试代码如下:

  把环境都部署好之后,我们进入测试阶段来看一看实际效果。

  我们以一张表为例,这里面记录着账户id和账户余额。

  首先,我们新增一条记录,

  此时,MQ消费到数据如下:

  通过数据可以看到,这里面详细记录了数据库的名称、表的名称、表的字段和新增数据的内容等。

  然后,我们还可以把这条数据修改一下:

  此时,MQ消费到数据如下:

  可以看到,除了修改后的内容,canal还用字段记录了修改前字段的值。

  最后,我们删除这条数据:

  相应的,MQ消费到数据如下:

  监听到数据库表的变化之后,就可以根据自己的业务场景,对这些数据进行业务上的处理啦。

  可以看到,利用canal组件可以很方便的完成对数据变化的监听。如果利用消息队列来做数据同步的话,只有一点需要格外注意,即消息顺序性的问题。

  binlog本身是有序的,但写入到mq之后如何保障顺序是值得关注的问题。

  在mq顺序性问题这里,可以看到canal的消费顺序性相关解答。

 数据库同步软件

上一篇:canal之——缓存一致性和跨服务器查询的数据异构解决方案


下一篇:canal的使用