• 约书亚
    2019-10-25
    a. @_CountingStars的问题提到“双写”方案中主从同步和双写冲突的问题,的回答是双写之前要将同步断掉。
    假设我们在夜间进行操作,不考虑主从延迟过高的情况。
    但是,”断掉同步“与”有双写代码的应用,被部署上线能正常执行双写“这两个操作之间,时机也不会配合特别完美吧?
    如果先断掉同步,就意味着有可能从库丢掉部分数据。
    如果先上线新代码,就意味着短时间内数据要么冲突,要么对于不幂等的操作,数据变成双份了?
    b.双写方案的一种隐患是新旧二库在遇到同一资源的并发操作时,执行顺序有可能不一样,进而结果就不一样。这种情况在实践中还要考虑么?
    c.另外我还疑问,现代的应用部署都是基于灰度的,在写操作的代码发生切换时(从双写到写新库,或者从写旧库到写新库),做灰度发布都会带来问题吧?
    展开

    作者回复: 双写时加开关,默认关闭双写,上线完成后关闭同步,同时打开开关,在低峰期的话数据丢失的概率不高。再配合数据校验的工作,是可以保证一致性的

    
     13
  • 知行合一
    2019-10-28
    老师,数据具体怎么校验呢,简单说下常用的校验方式吧,谢谢

    作者回复: 比如说从源库随机抽取一定量的数据,从新库中查询看是否一致

    
     4
  • _CountingStars
    2019-10-25
    双写方案中 由于新库配置为旧库的从库 此时双写肯定会出现数据重复的问题啊 或者 数据写入失败

    作者回复: 双写之前要将同步断掉

     2
     3
  • 任鹏斌
    2019-11-05
    老师有个疑问,数据库的双写方案1,2步之间,切换为双写前是不是应该停掉新旧库的同步关系?

    作者回复: 是的,是要先停掉同步关系

    
     2
  • 小喵喵
    2019-10-31
    老师说的迁移是指的旧库迁移到新库,新旧库的表结构基本一样。但是如果系统重构后的迁移就很难做了。我以前遇到一个大的系统,整个db里面有几千张表。重构后采用微服务的方式,原来的一个db分成了10多个db,还做了分表。有些原来旧库的表也做了拆分,合并,字段的增加、减少等。旧库表中的有些字段名字都重新命名了。这样的数据迁移都是狗血的数据迁移。整个公司组建一个数据迁移团队,包括开发,架构师,技术总监,dba,运维等几百人,数据校验也基本都是人工校验。耗几个月才完成了数据迁移。而且问题一大推。面对如何奇葩的数据迁移,老师有什么好的方案?

    作者回复: 数据的同步可以考虑解析binlog来同步

    校验就真的没辙了,我之前经历的大的数据迁移都是已月为单位的

    
     2
  • Corner
    2019-10-25
    老师您好,关于双写方案有两个疑问需要请教一下。1.数据同时写入两个数据库怎么做对代码的改动比较小呢?有成熟的工具或中间件来做吗?2.新库在同步追上旧库的binlog后,在开始双写时需要断开吗?不然对于新库会有重复的数据。如果新库需要停止对旧库的binlog同步,和双写的开启时机这里怎么做协调呢?

    作者回复: 1. 还真没有,其实改动代码也简单
    2. 需要断开的,可以在双写的时候加开关,断开同步时立刻打开开关

     1
     2
  • la la la
    2019-12-02
    目前正在经历的上云,物理机与云都不互通,需要跳板机一层层的跳,乱七八糟一大堆的东西,就几个人搞,太坑了。

    作者回复: 我目前也在经历上云,物理机和云的互通应该是上云的第一步吧。。

     1
     1
  • 布小丫学编程
    2019-11-16
    基于双写的方案我总结了2种实现:
    1、基于同步写新库和旧库方案
    在写入数据的时候,同步写入旧库数据,异步写入新库数据。
    数据校验,对部分数据进行校验(最容易出问题的地方,需要提前准备好脚本)。
    使用灰度发布方式将读流量切换到新库。
    观察几天没问题后,可以改成只写新库。
    2、基于Canal的迁移方案
    将新库配置为源库的从库,同步数据。比如使用Canal同步数据。
    数据校验,对部分数据进行校验(最容易出问题的地方,需要提前准备好脚本)。
    使用灰度发布方式将读流量切换到新库。
    暂停应用,将新库作为主库写入,使用Canal同步到旧库。
    观察几天没问题后,撤销Canal的同步。
    展开
    
     1
  • Victor
    2019-10-26
    业务不做改造的话,无论哪种方案,要想新老环境数据一致,都需要短暂的禁写。即使是业务层做改造,按不同的模块双写数据库,同时MySQL新老环境相互同步,但在具体切换的时候,也要考虑主从延迟,从这点来看,其实还是会有一段时间的禁写。
    
     1
  • 陈斌
    2020-02-08
    老师,想问下双写的具体实现是怎么做呢?我的理解是
    1、同步写入旧库和新库,同时需要保证原子性是吗?
    2、是对原本应用服务器中的所有sql语句进行拦截,如果是写操作,则做多一个写入新库的逻辑?
    
    
  • ちよくん
    2020-01-19
    我做过两次数据同步迁移,使用的双写方案,灰度发布,没有问题后全量切,一般需要半个月。

    作者回复: 那你们确实比较谨慎:)

    
    
  • Klaus
    2019-12-12
    老师,级联方案中 备库的作用是什么?问中说是用于回滚,防止云上环境与机房环境不一致。但是,回滚直接回滚到旧库不行吗?三个库的数据是同步的啊?

    作者回复: 迁移上云之后,旧库和云上的数据库之间的同步就断掉了,因为数据已经往云上写了

    
    
  • 星空
    2019-12-09
    老师说的方案,和我们前几个月做的方案整体上很想。不过我们的方案和场景更复杂一点,我们是系统升级。老系统为.Net+SqlServer,新系统是Java+Mysql。业务上由于是直接基于标品二次开发,所以存在新老系统的业务兼容和数据兼容,并不能简单的通过双写就解决问题。我们引入了kafka组件。和两个数据同步服务,两个服务之间商定共同认可的统一业务消息体,互相实时发送增量消息,并解析对方发送来的消息结合自己的业务入库。流量在网关层依据某个hander标识字段去分流,用apollo开关可以随时掌控切换的比例。做到随时能进能退。数据校验,对全量我们采用了业务抽检+总数校验。对增量我们才用了T+1后的增长量校验。为了验证新系统的业务准确性,还在网关层做了流量拷贝,响应对比等

    作者回复: 这就更复杂了

    
    
  • 小水
    2019-12-05
    老师,应该如何做数据库的切流量呢?是在应用层做个全局的计数吗?然后 10/100,40/100这么切分吗?您在场景用是如何做的呢?
    
    
  • 吴青
    2019-11-30
    老师有个疑问, 关于"双写之前要将同步断掉", 什么时候将同步断掉呢?这个是怎样判断同步差不多,可以关闭同步,打开双写的

    作者回复: 主从延迟是可以监控的,可以看主从没有延迟了就可以断掉同步了

    
    
  • 圣城小石匠
    2019-11-15
    老师,假如原有系统架构不满足业务,需要升级系统架构和业务,如何做到平滑切换,回滚,节约成本呢?
    
    
  • Keith
    2019-10-27
    你好, 关于"双写之前要将同步断掉", 什么时候将同步断掉呢? 数据在不断的写入, 在将同步断掉之后和开启双写之前如果有数据写入如何处理?

    作者回复: 所以要做数据的校验和补写,一般双写会加开关,在断掉同步时马上打开双写开关,时间窗口短,数据丢失的不会很多。

    
    
  • jack
    2019-10-26
    没做过数据迁移的工作,有收获!请教老师一个问题,在“双写”方案中,获取binlog增量日志,异步写入新库,如查多个线程消费,如何保证binlog日志有序写入新库呢?难道对binlog日志进行业务改造?

    作者回复: 这个一般对数据不会有那么强烈的需求吧

    
    
  • 彼得.林
    2019-10-26
    请问老师,双写中较验的核心逻辑是怎么样的?
    
    
  • 不经意间
    2019-10-25
    记录错误日志的想法挺好的
    
    
我们在线,来聊聊吧