MongoDB/SQL Server增量同步方案

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


  1. 方法比较

    • 时间戳

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

    • 触发器

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

    • CDC功能

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

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

  2. 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
      

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

    • 获取更新数据

      这一步应该通过脚本实现,但为了方便表述,还是采用运行T-SQL语句。采用的是调用fncdcgetallchangesdboaaaaaabbbbbb()函数。首先成功修改数据(这里插入了一条新数据),然后调用该函数查看更新数据的结果。

      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');
      

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


参考文档