生产服与预生产数据同步问题

生产服与预生产数据同步问题

预生产数据要做到与主库实时同步,就不能对预生产进行改动,比如需要测一些数据之类的操作,但我们是需要做测试的

1.场景需求

如果有些不可避免的测试操作必要在预生产环境中修改数据,比如我们现有环境及需求,则实时同步方案不可采取

如果预生产数据保持不改动,采用binlog方式实时同步,则应不会出现报错或数据不一致的情况,起到线上线下1:1的效果,但这样似乎又失去了预生产的意义

  • 理由:假设正服数据保持未动,预生产做测试修改了一些数据,这样实时同步就有问题:

    • 采用的是binlog方式导入,不能保证预生产修改的数据不被覆盖,预生产修改后的数据是否被覆盖,取决于binlog何时导入;

      • 若是在binlog导入后修改则不会覆盖,反之亦然,期间需规避binlog的导入时间间隔
    • 并且正服数据未改动,而预生产数据被修改过,binlog数据过来之后数据不对应,导入就会报错;

      • binlog二进制日志转换后也是sql语句,如insert update等,比如xx字段的值原本为123,预生产因为做测试改为456,生产未改动,binlog数据过来后会update …where xx='123’就会找不到值为123的xx字段,因为已经被改为456了,所以就会报错,就算导入完成,某些数据也是与正服不对应的。

3.方案

若是要求在预生产有些必要数据需要做测试,则可采用以下同步方案,当前在用【方案1】

  • 【方案1】:每周一(避开联调测试工作日)凌晨1点,重置清空预生产数据库数据(避免残留测试数据,与正服数据不一致),再同步数据

    • 优点:避开联调上线工作日,确保不耽误测试数据
    • 缺点:数据可能不是最新,取决于周几上线、做测试
  • 【方案2】:上线前一天手动启用同步任务

    • 优点:相比方案1数据较为最新
    • 缺点:若是临时改变上线计划,则会影响做测试,导入数据需要4h左右
  • 【方案3】:主从同步

    • polardb只支持阿里云购买从节点,且无法像自建数据库一样登录到从库来做一些什么
    • PS:阿里云的从节点主要做高可用冗余,避免单节点故障,故排除此方案
  • 【方案4】:阿里云DTS数据传输服务

    详情可参考:阿里DTS数据同步架构原理

    • 也是主要针对于做数据迁移,其实实现结果与方案1差不多,也是需耗时,且需要费用
    • 并且经咨询阿里客服,目录数据库数据若被修改过,则DTS传过来的数据也会导致不一致、不对应
    • 原理简单理解:先是全量导入,再是增量反解析binlog导入,尽量与正服的数据库保持接近
  • 【方案5】:参见:MySQL-binlog2sql:非主从实时同步+恢复误删数据

    • 经测试,已实现实源数据库与目标数据库时同步(MySQL间的非主从实时同步)!

4.总结

  • 【方案5】为最佳解决方案!
posted @ 2022-06-09 18:18  秋风お亦冷  阅读(106)  评论(0编辑  收藏  举报