MongoDB/SQL Server增量同步方案

2015-10-16
3 min read

由于SQL Server的特殊性,目前市面上没有成熟开源的SQL Server/MongoDB同步软件,可行方案需要采用软件编写的方式才能实现该功能。通过调研,总结3种可行方法。依据采用的原理不同分为如下方法:依据时间戳更新数据、通过触发器更新数据以及SQL Server特有的CDC(change data capture)机制更新数据。本文针对公司的数据库同步需求,首先介绍3种方法的优缺点,然后提出其中最可行的解决方案。


  1. 方法比较
  • 时间戳

    参考数据库表中的更新时间字段,依据此字段判断是否需要更新到MongoDB。优点是对原数据库改动较小。但缺点是原平台数据库大部分表没有记录更新时间的字段。实现的难度有原有系统不是每个表都有更新时间字段,如果没有更新时间字段需要重新设计表添加该字段。

  • 触发器

    创建数据库触发器,将更新数据存放到临时表,MongoDB读取临时表。优点是能高度自定义更新条件以及更新字段。缺点是开销大,过多触发器设计、创建、更新、管理的工作。需要进行大量的设计与管理工作,开销较大。

  • CDC功能

    数据库服务器开启CDC功能,MongoDB端只需从cdc相关表中获取更新数据。对原数据库改动最小,只需开启功能。但SQL Server自有的功能,安装以及开源工具太少。该功能开源工具较少,只能通过编写查询语句获得更新数据,以及已更新数据的处理。

如上述比较可见,CDC方法为工作量相对较小的方法,下面简单介绍该方法的处理流程。

  1. CDC处理流程

如流程图可见,CDC的大部分的数据更新比较在SQL Server内部处理完成。MongoDB(Data warehouse端)只需获得更新数据,其中数据的提取、转换通过Nodejs脚本来完成。 下面以alarmos数据库的aaaaaabbbbbb表为例,描述CDC的处理流程。

  • 开启CDC功能

    CDC的功能开启在SQL Server端执行T-SQL语句。

         USE alarmos
         GO
         EXEC sys.sp_cdc_enable_db
         GO
    

    执行成功后会在系统表内出现3个与cdc相关的表(schema为cdc)。

  • 追踪表的配置

    这一步开启针对表的更新追踪功能。

         USE alarmos
         GO
         EXEC sys.sp_cdc_enable_table 
         @source_schema = 'dbo', 
         @source_name = 'aaaaaabbbbbb', 
         @role_name = 'sa'
         GO
    

    @source_schema、@source_name为定义追踪的数据表,@role_name为指定可获取CDC数据的用户。成功设置的判断是表值函数当中出现了相关项。

  • 获取更新数据

    这一步应该通过脚本实现,但为了方便表述,还是采用运行T-SQL语句。采用的是调用fn_cdc_get_all_changes_dbo_aaaaaabbbbbb()函数。首先成功修改数据(这里插入了一条新数据),然后调用该函数查看更新数据的结果。
    
         USE alarmos
         select @begin_lsn = sys.fn_cdc_get_min_lsn('dbo_aaaaaabbbbbb) 
         select @end_lsn = sys.fn_cdc_get_max_lsn()
         select * from cdc.fn_cdc_get_all_changes_dbo_Customer(@begin_lsn, @end_lsn, 'all');
    

    运行命令后可以看到如下查询结果,可见新插入的数据能够成功捕获。


参考文档

comments powered by Disqus