如何基于日志,同步实现数据的一致性和实时抽取?(2)
由于时间关系,我今天主要介绍DWS中的Dbus和Wormhole,在需要的时候附带介绍一下Swifts. 三、dbus解决方案日志解析 如前面所说,Dbus主要解决的是将日志从源端实时的抽出. 这里我们以MySQL为例子,简单说明如何实现. 我们知道,虽然MySQL InnoDB有自己的log,MySQL主备同步是通过binlog来实现的.如下图: 图片来自:https://github.com/alibaba/canal 而binlog有三种模式:
他们各自的优缺点如下: 此处来自:http://www.jquerycn.cn/a_13625 由于statement 模式的缺点,在与我们的DBA沟通过程中了解到,实际生产过程中都使用row 模式进行复制.这使得读取全量日志成为可能. 通常我们的MySQL布局是采用 2个master主库(vip)+ 1个slave从库 + 1个backup容灾库 的解决方案,由于容灾库通常是用于异地容灾,实时性不高也不便于部署. 为了最小化对源端产生影响,显然我们读取binlog日志应该从slave从库读取. 读取binlog的方案比较多,github上不少,参考https://github.com/search?utf8=%E2%9C%93&q=binlog.最终我们选用了阿里的canal做位日志抽取方. Canal最早被用于阿里中美机房同步,canal原理相对比较简单:
图片来自:https://github.com/alibaba/canal 解决方案 Dbus 的MySQL版主要解决方案如下: 对于增量的log,通过订阅Canal Server的方式,我们得到了MySQL的增量日志:
在考虑使用Storm作为解决方案的时候,我们主要是认为Storm有以下优点:
全量抽取 对于流水表,有增量部分就够了,但是许多表需要知道最初(已存在)的信息.这时候我们需要initial load(第一次加载). 对于initial load(第一次加载),同样开发了全量抽取Storm程序通过jdbc连接的方式,从源端数据库的备库进行拉取.initial load是拉全部数据,所以我们推荐在业务低峰期进行.好在只做一次,不需要每天都做. 全量抽取,我们借鉴了Sqoop的思想.将全量抽取Storm分为了2 个部分:
数据分片需要考虑分片列,按照配置和自动选择列将数据按照范围来分片,并将分片信息保存到kafka中. 下面是具体的分片策略: 全量抽取的Storm程序是读取kafka的分片信息,采用多个并发度并行连接数据库备库进行拉取.因为抽取的时间可能很长.抽取过程中将实时状态写到Zookeeper中,便于心跳程序监控. 统一消息格式 无论是增量还是全量,最终输出到kafka中的消息都是我们约定的一个统一消息格式,称为UMS(unified message schema)格式. 如下图所示: (编辑:ASP站长网) |