设为首页 收藏本站
查看: 1663|回复: 0

[经验分享] MongoDB/SQL Server增量同步方案

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


  •   方法比较

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

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

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

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


  •   CDC处理流程
    DSC0000.gif

      如流程图可见,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)。
      DSC0001.png


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

      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数据的用户。成功设置的判断是表值函数当中出现了相关项。
      DSC0002.png


    •   获取更新数据
        这一步应该通过脚本实现,但为了方便表述,还是采用运行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');

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




  参考文档


  • Change Data Capture
  • Change Data Capture (CDC) in SQL Server 2008
  原文:http://www.tuicool.com/articles/Ij2IZnz

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346935-1-1.html 上篇帖子: ReactNative 使用微软的CodePush进行热更新,继续填坑 下篇帖子: js-shortid:优雅简洁地实现短ID
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表