SSIS数据同步系统

  缘起:

    若干年前,刚到一家3C类的电商公司做DBA,到公司没几天,公司的CEO和研发总监,说现在要做个事情:

         把IDC的数据库的数据,要同步一份到仓库,因单量大,仓库经常爆仓,仓库网络不好时,可以直接用同步的数据

         记得当时CEO还特意,弄个讲座讲了公司如何处理单量爆仓

    第一次做DBA,第一个月只是有这个说法,没想到研发总监又说了几次,但是线上就一台数据库实例,领导连线上数据库权限都没开给我,只是定时就把线上的慢SQL发给我来优化,因事情比较少,自己就查线上有没有同步数据的工具和方法。

    自己尝试看看能否做一个数据同步工具。

   方法:

     在查询资料过程中,发现一篇携程的BI部门的技术文档,介绍携程有用增加时间(row_createtime),修改时间(row_lastupdatetime),写入加默认时间,修改更新最后一次时间,实现增量抽取数据,自己也加了这个携程技术同事QQ,问了一些关于增量抽取的问题,发现他们用的是SSIS来做增量抽取的。

      最后得到信息: 增加2个时间字段,使用SSIS做同步数据

   过程:

      因为当时对SSIS不熟,花费了一些时间适应,特别是在SSIS写C#脚本,特别麻烦,自己边查资料边用,自己用visio还画图,要实现功能:

       1,同步的两边数据库IP,账号,密码等配置到数据表里(方便后面调整)

       2,出错重抽

       3,实现增量抽取

       4,抽取日志记录,下次执行工具上次结果来执行

       5,多个SSIS包,共用一个配置数据库和表

   对接:

      自己经过一个月的研究摸索,终于实现了以上的功能,但是如何在表里加这2个字段,几百张表,默认都没加。研发总监召集大家开会,决定批量增加这2个字段, 默认创建,修改时间都加getdate()时间,研发人员在程序里,有update的批量加上row_lastupdatetime=getdate(),我批量在数据库里加上这2个字段。

      删除数据问题:

        处理完增加和修改时间问题,发现同步的表,有删除数据的情况,如何处理,源表已删除,同步系统,无法把目的库的删除数据删除,后面又让研发新加表时,加上is_deleted字段,但已有表,如果加这个字段区分,程序逻辑,查询逻辑会大改,对业务影响太大,肯定不行。研发总监又召集大家开会,我在会上说,每个同步的表,对应建一个删除表,删除的主键id和时间记录到对应的删除表里(每个表对应一个删除表)。

     我同步时候,通过这个对应的删除表里的创建时间,把这个删除id同步到目标库,通过id删除掉仓库表里的数据。

     这个建议结果通过了,结论是领导说分给我一个同事,让我来主导这个事情, 提的建议变成自己的活

    但经过研发努力,涉及的同步表也不多,删除记录表也处理好了,最终这个从IDC同步到仓库的同步系统上线了。因同步到仓库的表不是很多,一开始就10多个表。每个表一个SSIS包,包部署到仓库服务器上。

     运行故障:

      同步包运行了一段出现以下故障: 

        1,同步包同步资源报错故障

              记得出故障,晚上回家的路上,回家后立即处理,当时的确没找到原因,没办法先解决问题,把同步包从仓库部署的,改成部署到线上库。结果不报错了,后来花了一周时间找到原因:

         原来线上数据库限制运行最长时间,后来和领导沟通去掉后,再把包部署到仓库,实现拉模式抽取数据

       2,事务太长,有些数据没同步过来

           研发发现,有些数据漏抽,研究发现,有些事务运行时间比较长,没办法,把同步时间,从上次结束时间,开始往前提前30秒以上,多抽取一些,避免漏抽。

       3,程序checksum检查

          因同步到仓库作业,有订单主表,和明细表等,研发有时发现有偶尔数据不对,最后没办法,在订单明细表,把商品数量,金额等checksum后,和线上的数据做对比,对比正确用线下的数据,不对的用线上数据,减少因同步数据导致订单出库异常

      4,2台服务器时间不一致

          因服务器的时间同步有时报错,导致时间有时不对,程序取服务器当前时间就有问题,这时getdate()时间都从源服务器时间为准,不用目的服务器时间。

     额外带来效益:

        1,  该同步系统用起来,开出15个本地仓库在使用。

        2,在开城市分站(北京,深圳等),用该同步系统从主库同步数据到新分站库(写了很多表同步包)

               因开分站,为方便快速开出来,直接拷贝上海站的数据库弄个空库,再部署程序方式

       3,当时某大厂电商收购公司搞融合,某大厂的研发用php程序从主库同步数据到前端MySQL库,一开始他们坚持用同步字段:同步一次加1减1方式,在我的大力建议下,他们也改成通过行修改时间来同步。

   

   总结:

          现在看来这个同步系统,很简陋,第一次做,没想到会有这么多问题需要解决,是对自己考验,但这个同步系统的确解决了公司快速开分仓,开分站的问题。

          很有用的系统,觉得是一个比较有意义的创新。至今我还回忆深刻,也在我工作中给很大的激励和鼓舞,遇到难题想办法,也必定有解决办法。

 

posted @ 2021-08-17 15:48  zping  阅读(774)  评论(0编辑  收藏  举报