MongoDB/SQL Server增量同步方案
由于SQL Server的特殊性,目前市面上没有成熟开源的SQL Server/MongoDB同步软件,可行方案需要采用软件编写的方式才能实现该功能。通过调研,总结3种可行方法。依据采用的原理不同分为如下方法:依据时间戳更新数据、通过触发器更新数据以及SQL Server特有的CDC(change data capture)机制更新数据。本文针对公司的数据库同步需求,首先介绍3种方法的优缺点,然后提出其中最可行的解决方案。
- 方法比较
时间戳
参考数据库表中的更新时间字段,依据此字段判断是否需要更新到MongoDB。优点是对原数据库改动较小。但缺点是原平台数据库大部分表没有记录更新时间的字段。实现的难度有原有系统不是每个表都有更新时间字段,如果没有更新时间字段需要重新设计表添加该字段。
触发器
创建数据库触发器,将更新数据存放到临时表,MongoDB读取临时表。优点是能高度自定义更新条件以及更新字段。缺点是开销大,过多触发器设计、创建、更新、管理的工作。需要进行大量的设计与管理工作,开销较大。
CDC功能
数据库服务器开启CDC功能,MongoDB端只需从cdc相关表中获取更新数据。对原数据库改动最小,只需开启功能。但SQL Server自有的功能,安装以及开源工具太少。该功能开源工具较少,只能通过编写查询语句获得更新数据,以及已更新数据的处理。
如上述比较可见,CDC方法为工作量相对较小的方法,下面简单介绍该方法的处理流程。
- 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');
运行命令后可以看到如下查询结果,可见新插入的数据能够成功捕获。
参考文档