设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

如何基于日志,同步实现数据的一致性和实时抽取?(2)

发布时间:2021-01-07 06:43 所属栏目:53 来源:网络整理
导读:由于时间关系,我今天主要介绍DWS中的Dbus和Wormhole,在需要的时候附带介绍一下Swifts. 三、dbus解决方案 日志解析 如前面所说,Dbus主要解决的是将日志从源端实时的抽出. 这里我们以MySQL为例子,简单说明如何实现.

由于时间关系,我今天主要介绍DWS中的Dbus和Wormhole,在需要的时候附带介绍一下Swifts.

三、dbus解决方案

日志解析

如前面所说,Dbus主要解决的是将日志从源端实时的抽出. 这里我们以MySQL为例子,简单说明如何实现.

我们知道,虽然MySQL InnoDB有自己的log,MySQL主备同步是通过binlog来实现的.如下图:

图片来自:https://github.com/alibaba/canal

而binlog有三种模式:

  1. Row 模式:日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改.
  2. Statement 模式: 每一条会修改数据的sql都会记录到 master的bin-log中.slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL来再次执行.
  3. Mixed模式: MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.

他们各自的优缺点如下:

此处来自: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原理相对比较简单:

  1. Canal模拟MySQL Slave的交互协议,伪装自己为MySQL Slave,向MySQL Slave发送dump协议
  2. MySQL master收到dump请求,开始推送binary log给Slave(也就是canal)
  3. Canal解析binary log对象(原始为byte流)

图片来自:https://github.com/alibaba/canal

解决方案

Dbus 的MySQL版主要解决方案如下:

对于增量的log,通过订阅Canal Server的方式,我们得到了MySQL的增量日志:

  • 按照Canal的输出,日志是protobuf格式,开发增量Storm程序,将数据实时转换为我们定义的UMS格式(json格式,稍后我会介绍),并保存到kafka中;
  • 增量Storm程序还负责捕获schema变化,以控制版本号;
  • 增量Storm的配置信息保存在Zookeeper中,以满足高可用需求.
  • Kafka既作为输出结果也作为处理过程中的缓冲器和消息解构区.

在考虑使用Storm作为解决方案的时候,我们主要是认为Storm有以下优点:

  • 技术相对成熟,比较稳定,与kafka搭配也算标准组合;
  • 实时性比较高,能够满足实时性需求;
  • 满足高可用需求;
  • 通过配置Storm并发度,可以活动性能扩展的能力;

全量抽取

对于流水表,有增量部分就够了,但是许多表需要知道最初(已存在)的信息.这时候我们需要initial load(第一次加载).

对于initial load(第一次加载),同样开发了全量抽取Storm程序通过jdbc连接的方式,从源端数据库的备库进行拉取.initial load是拉全部数据,所以我们推荐在业务低峰期进行.好在只做一次,不需要每天都做.

全量抽取,我们借鉴了Sqoop的思想.将全量抽取Storm分为了2 个部分:

  1. 数据分片
  2. 实际抽取

数据分片需要考虑分片列,按照配置和自动选择列将数据按照范围来分片,并将分片信息保存到kafka中.

下面是具体的分片策略:

全量抽取的Storm程序是读取kafka的分片信息,采用多个并发度并行连接数据库备库进行拉取.因为抽取的时间可能很长.抽取过程中将实时状态写到Zookeeper中,便于心跳程序监控.

统一消息格式

无论是增量还是全量,最终输出到kafka中的消息都是我们约定的一个统一消息格式,称为UMS(unified message schema)格式.

如下图所示:

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读