同步宝启示录
(一)起源
如果说生活不只是苟且,还有诗和远方,那么,产品的起源有时也仅仅是为了记念一种情怀。
当了8年的“小—初—高”理科辅导员后,大鸟心中时不时也有这样一种想法:既然小学到高中都已经辅导过多遍,何不寻找机会再把“本—硕”也辅导一遍,在教育这个行当上,也算做了一回全套。
而一切就如此巧合,让人不禁感觉:生活有的时候就像受到了神的指引一样,你期望什么,它就赋予给你什么。所以,对于“本—硕”的辅导,就在2013年4月12日的那一天,从一个主动联系我的——来自高校计算机系的一条QQ消息开始了。
这是一条咨询智能数据库开发技术方案的消息,它用于解决高校一个农田灌溉系统的数据采集同步问题。
我不得不承认,在此之前,我是不了解数据同步问题的,我也不知道为什么这位高校学生会找到我,但我猜想一定和我在网络上展示大鸟蛋组件库有关。不过,重点是我很自然的接下了这一个任务,而更意外的是这次联系成
为了同步宝产品开发的起源。
图 1 同步宝的颜值
(二)意义
虽然,智能数据库的意义仅仅是用于解决高校承接的农田灌溉系统中的数据迁移问题(每日定时将监控器采集的数据从MySQL数据库自动迁移到SQL Server数据库),但是,随着与用户沟通的深入,我发现数据同步尤其是异构数据同步却是一个十分具备通用性和应用价值的研究领域。
小至店铺经营者所使用的销售数据管理系统,大到地域上分散而管理相对集中的大集团、大机关所使用的企业信息管理系统,它们都脱离不了对于数据同步业务的功能需求。
因为,这是一个数据时代,通过增加数据副本来提高应用系统的可靠性和系统性能是一种最自然甚至必然的选择。在这种选择下,数据同步系统成为解决问题的一种最适合的方式,理由为:
它是一种良好的过渡手段,在业务系统更新换代过程中,为了让用户拥有一段时间的适应期,新旧系统一般会同时运行一段时间,让旧系统逐步被新系统取代,这就需
要将旧系统中发生的数据变化在合适的时间之内同步到新系统中。
它也是一种最经济的方法,对于不同业务系统之间要做到数据共享,可以通过搭建独立的第三方数据交换系统以做到尽量在不改变原有系统结构的基础上实现该功能,充分保障原有系统之间的独立性,提高安全性。
所以,正是基于以上两点出发,智能数据库设计的初衷就不仅仅局限于解决农田灌溉系统中的数据迁移问题,而是致力于设计解决对于常规分布式应用更具经济性与参考价值的异构数据库同步系统,使其能够在不影响原应用系统运行效率的前提下实现对不同类型数据库以及异构数据表之间的数据同步,以最小的系统资源消耗来保证数据同步过程的可靠性。
(三)设计
为了实现这一通用的数据同步系统,最好的出发点就是保持设计的独立性,大鸟认为将精力专注于数据同步的过程上会是一个良好的开始。
图 2 管道的故事
数据同步的过程就好像水流经这一条管道,从源头进入的水和从水管流出的水一般都不同,这取决于中途这些水会经过多少处理设备。
图 3 丰富的处理设备
其实,这也是日常生活中自来水公司提供的处理方式:从水源地获取水并通过管道送给若干个不同设备进行处理,然后再通过管道提供给用户。
用流程图来简化表达这个过程:
图 4 自来水公司的处理方式
可以发现,完成这一过程至少需要四种设备:
1、抽水设备,用于从水源地获取自然界中的水。
2、处理设备,用于过滤水中的杂质并去除有害物质。
3、传输设备,用于将水从一个地方搬到另一个地方。
4、供水设备,用于将处理后的水提供给最终用户。
是不是很容易理解?现在,回到数据同步的主题上再用开发者的视角对这个过程进行思考,就显得自然而且容易多了。整个系统需要四个功能模块:数据采集模块,数据处理模块,数据传输模块和数据保存模块。
和自来水公司的处理方式类似,数据采集模块用于获取数据源中要同步的数据集合;数据处理模块用于解决异构数据之间的转换;数据传输模块用于完成数据在不同数据地点之间的迁移;数据保存模块用于把数据按照目标地址要求组织存放。
按照这一思路,大鸟给出了数据同步系统的主体设计方案。
图 5 数据同步系统的主体设计图
为了充分保证系统的通用性,数据同步系统的设计方案采用的是一种双对称结构。在这一套结构中,所有模块都独立自成体系,但是保证对外发布自身组织的数据格式标准。
这意味着数据源不一定仅针对数据库,可以是任何提供数据的来源,由对应的数据采集模块负责捕获数据并组织好格式,然后对外发布自己的向外界提供的数据格式标准。
这也意味着数据目的不一定仅针对数据库,可以是任何提供数据存放的地方,由对应的数据保存模块负责将接收的数据组织成数据目的要求的格式进行存放,然后对外发布自己的向外界提供的接收数据格式标准。
数据处理模块也一样,加密,解密,编码,解码,数据格式转换等各种功能的处理模块都可以针对不同业务自由设计,然后对外发布自己的向外界提供的接收数据格式标准和生成数据格式标准。
最后,采用一种稳定可靠的数据传输方式来搬运这些数据,使这一个流程能够接起来以达到数据同步的目的。
听起来,是不是有点像搭积木和接水管?
对,一切就是这么简单,双对称结构的设计思想的重点在于选型和搭配,就像儿童搭积木一样,将数据格式相互匹配的模块挑选出来,搭配在一起,接上构成一个完整模型,并不关心具体的实现,而是提供一个规范来指导制
作积木的开发员如何实现,因为,或许有一天,在该系统成熟流行的时候,按此规范实现的积木能够出售给不同用户从而为创作者带来收益。
(四)实现
只会说而不会做,这种行为在技术行业是最令人厌恶的,通常称这种人为“只懂理论的思想家”。大鸟设计的系统结构,大鸟也必须成为第一个“敢于吃螃蟹的人”。因此,为解决高校农田灌溉系统中的数据迁移问题,按照数据同步系统的主体设计方案,大鸟具体的实现方式如下:
1、数据采集模块
对于高校农田灌溉系统中的各个子系统,保存数据所采用的数据库是MySQL,它构成了数据同步系统中的数据源。每日定时将监控器当天采集的数据进行上传意味着数据采集模块只需捕获每日变化的新增数据进行同步即可。
为此,大鸟研究对比了围绕关系型数据库的七种数据捕获方法:快照法,触发器法,日志法,API法,影子表法,控制表法和时间戳法,发现控制表法具有最好的开放性和可移植性,并且对原有系统的侵入性最小。在其基础上,大鸟设计了一个同步变化表,用于记录发生变化的源数据表名称,变化数据所在源数据表的主键值,数据变化的类型(插入、删除、更新),变化时间和数据同步状态
(已同步、未同步)。同时,通过在源数据表上建立插入、删除和更新触发器将变化的数据标识存入同步变化表中完成对于变化数据的捕获。
图 6 数据捕获的实现方式
利用定时器和JDBC数据库连接技术,数据采集模块每日以固定周期查询同步变化表中未同步的数据标识并利用
这些数据标识从源数据表中捕获出完整的数据信息,再按照数据字段名称,数据类型和数据值组织为标准XML格式向外发布。
2、数据处理模块
按照对称结构,在数据源和数据目的两端分别部署有数据处理模块。
在数据源端,由于同步的数据只是为了方便高校研发的农田灌溉系统进行每日数据统计汇总分析,并且这些数据基本不涉及任何机密,所以,数据处理模块接收数据采集模块发布的XML数据之后,仅将XML信息中的数据值采用base64编码转换来防止明文传输,之后保持原有XML格式向外发布。
在数据目的端,数据处理模块接收数据传输模块发布的XML数据之后,仅将XML信息中的数据值采用base64解码来得到明文信息,之后保持原有XML格式向外发布。
3、数据传输模块
考虑到同步过程中传输的数据量较多,时间较长,采用长连接方式会拥有较好的传输效率和稳定性,所以,数据传输模块采用业界非常流行的netty框架实现。将同步的
每条数据信息利用netty提供的字符串编解码器和分隔符编解码器进行处理可以很好的解决大数据量传输过程中的分包、组包、粘包问题。此外,数据传输模块不做任何的数据格式处理,仅将接受的数据格式原样对外发布。
4、数据保存模块
高校农田灌溉系统平台采用的SQL Server数据库是各个子系统数据的最终归属,它构成了数据同步系统中的数据目的。因此,数据保存模块接收到在数据目的端部署的数据处理模块发布的XML数据之后,就负责完成具体的解析转换入库工作。
大鸟仔细分析了MySQL数据字段到SQL Server数据字段的数据异构性问题,发现数据异构主要存在于两方面:数据表结构不同和数据字段含义不同(同名不同义、同义不同名等)。为完美的解决这一个问题,使转换模块拥有良好的通用性,大鸟特别设计实现了一个INI格式的异构转换描述文件来建立不同数据之间的联系。比如:
#源数据表名称作为节点名,配置对应目标数据表并按照源数据表同步字段名称依次配置对应目标数据表字段
[user]
tableName=account
id=#accountID@String
name=nickName@String
time=createTime@DateTime
groupID=groupID@String
image=file@Blob
图 7 数据保存的实现方式
数据保存模块在解析完XML数据之后,通过与INI格式的异构转换描述文件中的信息进行比对,从而完成数据类型和数据字段的转换工作,再组织成目标数据库对应的SQL语句完成数据保存。
(五)升级
为解决高校农田灌溉系统中的数据迁移问题而实现的数据同步系统,表面上看仅仅完成了MySQL到SQL Server的异构数据同步功能,但实际上,它适用于任何支持触发器的关系型异构数据库同步应用场合,而这一场合也是常规数据库同步应用的普遍场景。
为此,大鸟在其基础上继续进行了完善和改进。得益于双对称结构设计所带来的积木块式系统搭建方法,在保持各个模块数据发布格式不变的前提下,具体变化如下:
1、数据采集模块和数据保存模块废弃了原有基本的JDBC数据库操作方式,改用Druid数据库连接池+Mybatis框架实现,并扩充了支持的数据库类型,两个模块至少都支持MySQL,SQL Server,Oracle,PostgreSQL四款数据库。
2、数据处理模块从原有的单一处理模块扩充为处理模块组,意味着数据在正式传输之前,可以经过多个处理模块进行处理。在处理模块组中,可选择的处理模块有:base64编解码转换处理模块,utf-8编解码转换处理模块,
unicode编解码转换处理模块,DES加密解密处理模块。
3、数据传输模块在原有仅仅传输字符型数据信息的基础上,采用netty中的ChunkedWriterHandler扩充了对于30M以内文件类型数据的传输支持以提供文件的同步。
图 8 改进后的系统结构
至此,同步宝产品的雏形得以完成。