多端异构数据集成方案

  1. 概述

多端异构,一般来说这是数据集成系统最复杂的情况,而前面部分我们将讨论多端同构场景下的做法,再逐渐延伸到文章主题部分,即多端异构的场景。

  1. 多端同构

所谓多端同构,就是终端类型可以是多种,但是使用的数据库是相同的,比如都是MySQL。这种情况下,需要将终端的MySQL数据同步到统一数据平台,统一数据平台的数据库类型可以是任意的。这种场景的示意图如下:

一般来说,有两种实现方式:

  1. 定期将终端MySQL的bin log增量同步到统一数据平台,平台解析bin log后写入数据库,解析器独立于业务代码,反向亦然;

  2. 终端和统一数据平台的业务代码通过自定义的数据包协议来收发数据,解析后写入各自的数据库;

第一种方式的话,需要独立的解析器,即数据同步和业务逻辑是分开的,因此需要在数据到达时通知业务模块,一般是通过消息队列来实现,当解析器将数据写入数据库时,同时发送一个消息到消息队列,业务代码通过订阅消息来实时响应。示意图如下:

第二种方式其实就是将解析器逻辑放入到业务模块里边,这个时候就省去了消息队列。示意图如下:

那么比较来看的话,第一种方式部署上需要多部署两个模块,但是业务模块更纯粹一些,没有数据集成逻辑,但业务模块还是免不了需要接收消息然后进行数据处理。而且如果平台也有数据需要同步到终端,并且平台不是bin log采集增量数据的方式,解析器和接收器又变得更复杂了。因此,从这个角度看的话,第二种方式更常用也更省事。那第一种方式是否毫无用处呢?其实也不是。如果平台这边有多个独立的业务模块需要同步数据,第二种方式的话,每个模块都需要跟终端进行直连并收发数据,这种情况下可以将两种方式结合起来得到第三种方式,示意图如下:

  1. 多端异构

多端异构,也就是各个终端不同,使用的数据库也不相同,比如有的终端使用MySQL,有的终端使用Oracle,另外的使用SQL Server等,示意图如下:

这种情况下,只需要将多端同构的方案进行下变化,得到下面的图:

这时候,各个终端系统和平台采用统一的数据交换协议,每个终端模块和平台模块都具有封装数据和解析数据协议的功能。

还有一种比较复杂的情况,就是各个终端模块由不同的厂商开发,没有统一的数据协议,终端业务模块也不会直接通过TCP/IP和平台模块进行数据传输。这个时候,平台还是需要终端的数据,怎么办?可以使用第三方软件,通过监控终端和平台的数据库变化,捕获变化的数据发送给对方,对方解析后同步到数据库。这样的话,看起来和多端同构时我们给的第一种解决方案类似,第三方同步软件就是一个独立的数据收发和解析器。

我曾经对比过各种数据同步工具,网上很多所谓的同步工具更多的是转换器,就是一次性的将某种数据库的数据转换成另外一种数据库能识别的结构并导入目标数据库,但并不能进行增量同步。在支持增量同步方面,有个开源项目叫SymmetricDS,支持异构数据的双向增量同步,数据变化的捕获基于触发器。在上面的场景中,我们需要将SymmetricDS安装到每个终端系统中,同时平台端也需要安装。每个数据库被看作SymmetricDS架构中的一个节点(Node),每个节点属于一个组(Group),数据的同步规则是基于组的,即组和组之间的同步,组内的节点使用的是组的规则。

SymmetricDS在连接到某个数据库后,会在数据库中插入几十个表,用来记录数据变更、路由规则、组信息、节点信息等等。这些表也需要和我们的业务表放在一起,触发器才能正常,因此这种方式对业务数据库是侵入式的。如果不喜欢这种方式,我们可以将每个终端的数据库结构,转换成平台端数据库对应的结构,然后在平台端新建一个数据库,将终端数据库的数据同步到刚刚专门为该终端建立的数据库,这个新建的数据库相当于终端数据库的备份。这样的话,新建的这个备份数据库和我们平台端的业务数据库是分开的。那当数据从终端同步到平台端时,业务模块怎么知道呢?同样的,通过消息队列。我们需要给在平台端安装的SymmetricDS服务安装插件,这个插件在终端数据同步到备份数据库时被调用,插件的功能就是将接收到的数据发送到消息队列,业务模块通过订阅消息来获取数据并进行相应的处理。整个系统的架构如下图所示:

从上面的架构图可以知道,每个终端在平台端都有相应的备份数据库,当终端有新的数据同步到备份数据库时,SymmetricDS的插件将消息发送到消息队列,再经过消息处理服务解析后进入到业务数据库。反向的,业务模块有数据更新时,同样把相应的数据写入到消息队列,这时候消息处理服务将数据写入到备份数据库,因为有触发器,触发SymmetricDS将更改的数据先保存到数据表中,然后再同步到终端数据库,这样就实现了数据的双向增量同步集成。

  1. 后端集成

如果你的数据不是多端的,比如只是后端集成,可以考虑消息队列,我也建议你去看看阿里云的数加大数据平台,比如它提供将Apache Log数据抽取然后写入RDS数据库,又提供将RDS数据同步到Max Compute等存储系统,然后就可以配接DataV进行数据分析展示,这就是数加的一站式大数据服务。阿里云有一个数据同步工具叫DataX,貌似不支持多端增量同步,后来又演化成叫“数据集成”的产品,目前具体怎样没有再去了解了。如果你了解更多或者有其他的方案,也欢迎你在评论里跟大家分享分享!

  1. 多端离线

多端离线是指多端离线使用,写这个是因为前段有人问我这么个问题:在终端机刷他们的卡时,反应速度比较慢,因为要联网,网络不好的时候体验很不好。是否可以改进,将数据同时存储在终端机,然后刷卡时不连接服务器,还允许一定额度的透支。另外还有一个问题,这张卡是可以在多个终端机刷的,比如在这个窗口刷完,马上可以去另外一个窗口刷。

我们可以先看下不允许多终端刷卡的情况下如何解决。这种情况就是把数据存储一份到终端,然后数据库里存放允许透支金额、已透支金额等数据就可以了。当用户刷卡时,如果没有超出范围就可以正常使用,等到网络条件好时,再同步数据到后端服务器。

但是当允许多终端刷卡时,可能第一次刷完数据还没有同步到服务器,第二次在另外的终端刷时,数据就不同步了。这种情况就要看具体的软硬件条件了,如果可以,把需要的信息存储到卡上,这样在第二、三个终端刷时都没有问题。当各个终端将刷卡消费信息同步到服务器端时,服务器端设计成类似可以回放电影一样,把每次刷卡的动作回放,再结合具体记录下来的数据进行处理就可以了。这只是我根据对方粗浅描述的情况给的一个思路,也许了解了更多信息后,会有不一样的答案。

延伸阅读:

转载于:https://juejin.im/post/5c4184e06fb9a049ff4e6a97

你可能感兴趣的:(多端异构数据集成方案)