zoukankan      html  css  js  c++  java
  • 一款数据库比较与同步软件的设计与实现

     

    本文介绍了一款数据库比较与同步软件的设计思想、技术要点及使用方法,披露了其核心算法及性能指标,供IT技术人员借鉴参考。

    1、开发背景

    我是做软件开发的,在项目实施过程中,经常遇到系统对接问题,需要将一个系统的数据同步到另一个系统,即需要做数据库的同步。

    搜遍了各大网络,未找到适合的解决方案。现有的数据库系统,大多数只支持同型数据库之间的同步,不支持异型数据库同步,而现实中的数据库种类很多,相互间都可能需要同步;其它同步软件又太复杂,需要配置的东西太多,不适合交付给普通客户使用。

    干脆,自己动手开发了这款DBSync软件,用于各种数据库之间的比较与同步,且力求简单实用。

    2、设计思想

    传统的数据库同步,一般使用快照+事务日志的工作模式。用大白话来说,就是先把源数据整个复制到目标库,使得双方具有相同的起点;再启动监测程序,随时监测源数据的变化,一旦有更新操作(即事务),就将事务传递至目标库,在目标库中实施同样的更新,从而使得双方保持一致。

    不同的数据库系统,事务日志的格式不同,按照这个模式设计的同步软件,只适用于同类型数据库的同步,如SQL Server到SQL Server,Oracle到Oracle等。DbSync采取不同的同步策略,不再卷入具体的事务,而是直接访问事务的结果,即直接访问数据,通过扫描比较双方数据,找到相互间的差异,再将差异部分同步过去。按照这个模式,DbSync就具有广泛的通用性,能用于各种数据库之间的同步。因为,无论什么样的数据库,也无论它怎么工作,最终的结果无非就是数据。

    3、功能及技术要点

    3.1使用ADO.Net的OleDbConnection连接数据库,因此能连接各数据源,包括Access、 SQL Server、Oracle、MySQL、DB2等常规数据库,也包括Excel、txt、csv等文件数据源。

    3.2既支持相同类型数据库之间的同步,如Access到Access、SQL Server到SQL Server,又支持异型数据库之间的同步,如Excel到Access、Access到SQL Server、SQL Server到Oracle等。

    3.3以任务为同步的基本单位,一个任务负责一对数据表之间的同步,多个数据表间的同步设置多个任务即可。

    3.4任务采取线程的方式运行,可并发启动、执行多个线程,因此可并发执行多个同步任务。

    3.5任务可设置为自动重复执行,只需预先设置好时间间隔,即可长期自动运行,从而实现无人值守同步。最短时间间隔可设置为1秒,几乎等同于实时同步。

    3.6提供断点续传能力,当同步中断后,再次同步时能从中断位置继续同步,避免每次都从头开始。

    3.7提供单独的数据比较功能,可对比两份数据,突出显示改动条目,修改情况一目了然。

    4、使用方法

    4.1主界面介绍

    打开软件后进入主界面,显示同步任务列表,如下图所示:

    图1:DBSync主界面

     说明:

    ●数据比较:Click任务列表中的“○”按钮,可比较双方数据,突出显示改动条目。

    ●数据同步:Click任务列表中的“►”按钮,立即开始同步。

    ●执行状态:实时显示同步进度信息,包括:已扫描的记录数、已同步(增删改)的记录数等。

    ●开始时间、结束时间、下次开始时间:显示每个任务执行的时间信息。

    ●日志:Click任务列表中的“查看”按钮,可查看该任务的操作历史、同步历史。

    ●设置:Click任务列表中的“修改”按钮,可修改任务设置。

    4.2同步任务设置

    软件预设了3个同步任务,用作示范。要同步自己的数据,您必须根据自己的需要设置任务,指定源数据表、目标数据表,以及同步方式、同步频度等。Click主界面上的“新增”按钮,即可新增一个同步任务,进入Step1。

    Step1:选择源数据库、目标数据库

    首先要指定源数据库、目标数据库,如下图所示:

     

    图2:DBSync选择数据库

    说明:本界面的用途是设置源数据库及目标数据库的连接字符串,使得DBSync能连接双方数据库。其中,界面上打星号(*)的栏位是必填的。填写完成后,请Click标签2,进入Step2。

    Step2:选择源数据表、目标数据表

     

    图3:DBSync选择数据表

    说明:本界面的用途是选择源数据表及目标数据表。选择完成后,请Click标签3,进入Step3。

    Step3:选择字段对应关系

     

    图4:DBSync选择字段对应关系

    说明:本界面的用途是选择字段对应关系,即:源字段以及对应的目标字段。如果您需要做增量同步,这里必须选择主键字段。主键字段是记录的唯一标志,它用于判别同步双方是否存在对应记录。选择完成后,请Click标签4,进入Step4。

    Step4:选择同步方式及频度

     

    图5:DBSync同步方式及频度

    说明:本界面的用途是选择同步方式及频度。

    (1)同步方式:

    ●全部新增(Insert)至目标表:是指将源数据表中的数据全部Insert到目标数据表。

    ●仅同步增量数据:是指以主键字段为记录标识,查找相互间的差异,只同步差异部分(即增量部分),而相同部分不同步。

    (2)执行频度:

    ●手动点击“开始”执行:是指每次同步都由用户Click任务列表中的“►”来执行。

    ●手动,然后自动重复执行:是指由用户Click“►”开始第一次执行,同步结束后,程序会按照预定时间间隔自动重复执行。只要程序不关闭,同步操作就会一直持续下去,从而实现无人值守同步。

    (3)同步范围:

    属于高级选项,可填写Select * From...Where... 形式的 SQL 语句,每次同步前会执行,用于进一步限定参与同步的数据范围。

    (4)同步后处理:

    属于高级选项,可填写 Update SQL 语句,每次同步后会执行,用于数据回写、数据转换、公式计算等额外任务。

    4.3数据比较界面

    设置好同步任务后,Click任务列表中的“○”按钮,进入扫描与比较界面,如下图所示:

    图6:DBSync扫描与比较界面

    说明:本界面的用途是比较双方数据,找出数据差异(即增量)。该界面不实施同步,仅展示增量数据,其中的红色部分为已修改字段,移动鼠标过去能显示修改前的原值。

    5、核心算法及提速措施

    数据库产品的一个重要指标就是速度,同步软件也不例外。同步一般分两个步骤:先快照或复制过去,再监测更新并同步更新。前者类似于文件复制,是最初的一次性的动作;后者是长期的随时要做的动作,因此,重点在于更新速度。

    传统同步软件通过事务日志进行更新,虽然不通用,但速度快,几乎是实时同步的效果;DBSync使用扫描比较判断更新,虽然通用,但速度可能较慢。为此,DBSync提供一种机制,使得每次同步仅扫描比较增量数据,从而大幅提速。

    为了深入理解提速原理,我们先了解一下扫描比较的核心算法:首先,DBSync会读取双方的数据,并按主键字段排序;然后,以主键字段值为记录标识,依次比较双方的记录。对于源数据表存在而目标表不存在的记录,视作新增增量;对于目标数据表存在而源数据表不存在的记录,视作删除增量;对于源数据表与目标数据表均存在的记录,则继续比较其它字段,其它字段有差异的,视作修改增量;无差异的,则为相同数据。

    一般来说,同步是定期重复执行的,两次同步间的增量非常有限,绝大部分是未变化的相同数据。比如,一个记录数为百万级的数据表,如果每5秒同步一次,5秒内的增量是很少的,通常也就几十条记录,与百万级总量相比几乎是忽略不计的。因此,简单的扫描比较会浪费大量时间,提速思路就是排除相同数据的无意义比较,仅扫描比较增量数据。具体措施:

    5.1在源数据库中创建一个表,用于记录每次同步的完成时间,例如:表名DBSync,含一个字段SyncDate,其中的SyncDate初始化为一个很小的值,如:1900-1-1

    5.2对于新增、修改增量,单独用一个任务来执行,并在Step4设置回写SQL,向源数据库写入同步完成时间,如:UPDATE DBSync set SyncDate=date();再限定源数据范围,如:SELECT a.* FROM Customer AS a, DBSync AS b where a.CreateTime>=b.SyncDate or a.UpdateTime>=b.SyncDate。这样,第一次同步会全表扫描比较,以后同步就根据SyncDate仅提取增量数据,扫描比较的数量就大幅减少,速度自然也大幅提升。

    利用此方案,需要注意的是,源数据表必须有CreateTime、UpdateTime字段,分别记有数据的新增时间、修改时间。

    5.3 对于删除增量,用另一个任务来执行。由于该任务只比较双方的主键,不比较其它字段,即使不限定数据范围,速度也很快。

    6、性能测试报告

    测试环境:最普通的电脑,双核CPU,E7500,主频2.75G,内存2G。

    数据库情况:源数据库、目标数据库均为SQL Server,位于同一台电脑上;源数据表、目标数据表均为Customer表,均含10个字段、100万条数据;源数据表含有增、删、改数据各100条,共300条增量。

    任务设置情况:按照上述提速策略,安排2个任务来进行,任务4用于同步源数据库中的新增、修改增量,任务5用于同步删除增量。

    任务执行结果:截图如下:

     

    说明:对于新增、修改增量的同步,4秒钟完成;对于删除增量的同步,6秒钟完成。

    结论:DBSync的优点是支持各种数据库,简单易用。缺点是速度稍慢,记录数为百万级的数据库同步,一般需要数秒钟才能完成;千万级的,约1分钟才能完成;亿级的,约数分钟才能完成。另外,DBSync只同步数据,不同步索引、触发器、存储过程等其它设置。

    DBSync下载:下载 

  • 相关阅读:
    CORS详解
    JBoss 系列九十九:Rest WebService jBPM 6 集成演示样例
    atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
    4G时代来临,运营商为谁搭台献唱?
    Pascal's Triangle II
    cocos2d-x 3.6版连连看载入资源
    SlidingMenu导入编译用法--Eclipse和IDEA
    【解决】hive动态添加partitions不能超过100的问题
    AngularJS clone directive 指令复制
    AndroidStudio文件夹结构视图讲解
  • 原文地址:https://www.cnblogs.com/bhguo/p/10430992.html
Copyright © 2011-2022 走看看