04|同城双活:如何实现机房之间的数据同步?
04|同城双活:如何实现机房之间的数据同步?
讲述:徐长龙
时长13:18大小12.15M
核心数据中心设计
跨机房同步神器:Otter
总结
思考题
赞 6
提建议
精选留言(13)
- 张申傲2022-10-31 来自北京印象中 MySQL 的 binlog 中会记录一个 server id,用于唯一标识一个集群中的 MySQL 实例。做数据同步时,如果解析发现 binlog 中的 server id 和自己相同,说明是当前实例生成的数据变更,就不会再执行同步了。这个机制应该可以打破循环同步。
作者回复: 你好,很高兴再次收到你的留言,我理解你这是一个很好的方式,我查相关资料的时候,突然意识到,这个方式也是有瑕疵的,比如,串联同步,级联同步,这会被中转服务覆盖掉
3 - 千锤百炼领悟之极限2022-11-13 来自北京如果老师可以在每一期的结尾给出上一期思考题的答案就好了。
作者回复: 你好,答案后期会公布,前期多看大家留言讨论,多查,多独立思考,会有更好的帮助
1 - Geek_d8ddf22023-01-29 来自北京双机房 散热系统要独立,不然一个机房热爆 另一个估计也是热爆,参考阿里云香港教训
- ARM2023-01-09 来自北京不再工作中实战,对这种业务场景处理的理解大概率不到位
作者回复: 你好,确实这个机会不多,不过这个不是重点,我们先了解纠结点,这个不仅仅是为了一个知识点讲解,同时也是期望对数据同步一致性有更多的理解
- 梅子黄时雨2023-01-04 来自北京学习了。慢慢消化中。
作者回复: 你好,感谢支持!多多交流!
- 👽2022-12-27 来自北京如果 Otter 同步的链路是环形的,那么如何保证数据不会一直循环同步下去? 我觉得可以使用最后更新时间可以处理。因为最终的目标,一定是所有数据的最后更新时间一致。 a->b->c->a的环形同步,a开始同步,同步到c->a的时候,更新时间c和a的最后更新时间已经是一致的了,就无需更新了。展开
作者回复: 你好,这里有个细节,就是如果是环形并且都是订阅单个主库这里是没问题的,但是如果是多种组合结构,存在多个主库,那么这个方式会麻烦很多
- 一步2022-11-10 来自北京binglog 中有偏移量,可以根据这个偏移量来判断是否已经同步过
作者回复: 你好,一步,如果同步的一个节点超过两个个,这个方式就会存在问题~
- Mr.Tree2022-11-10 来自北京用 SnowFlake 算法计算一个更新版本ID,数据同步时,从库的更新版本ID不同则同步更新数据
作者回复: 你好,是个方法,如何解决对于多个事务需要对比的内容有些多
- 移横为固2022-11-04 来自北京没有接触过otter: 如果otter有节点id可以传递,类似于binlog的serverId,可以在循环过程中判断是否自己的id,那样就可以中断循环。 还想到一种方法:把otter的节点中的收集binglog功能和同步功能进行分离。新增一个otter节点,连接所有机房;而机房中的各个otter节点收集binglog,提取同步指令,汇总到新增的节点,由新增的节点发送到各个机房。这样其实把循环更新转换为由中心节点更新。展开
作者回复: 你好,移横为固,很高兴收到你的回复,第一个方式我觉得是可行的~另外那个方法需要解决多节点同时修改的冲突时候会比较麻烦~
共 3 条评论 - peter2022-11-02 来自北京请问:客户端访问指定机房,是客户端还是服务端决策的?如果是服务端,是怎么实现的?
作者回复: 你好,peter,这里是通过统一调度服务去做的,常见方式是24小时内用户最近访问的ip距离哪个机房比较近,刚进app时会问调度服务,会被调度服务指定最近一段时间都请求一个机房,通过这样保证用户修改的数据都集中在一个机房,这样缓存和修改有一定时间内在一个机房集中,这样能减少多机房交叉更新同步导致冲突,同时这种调度普遍喜欢用httpdns去做,因为比较好整体替换管理。
- Sky2022-11-01 来自北京你好,请教几个问题。 1,除了数据库,其实缓存也有数据同步的问题,而且缓存的访问量会比数据库高很多,双机房对缓存怎么处理? 2,如果一个城市的网络主干断了,同城双机房也不行,这种情况也不是没有出现过,异地双活应该怎么做?
作者回复: 你好,老朋友,很高兴再次见到你 第一个问题确实如此,目前是通过保证用户一段时间内只能访问一个机房来减少延迟,并且客户端保存最后更新时间,用这个方式来刺激服务端主动更新过期的缓存 第二个问题,城市主干线断了,可以让其他城市机房接管之前的双活机房工作,但是必须距离很近的两个机房才可以。核心在于同步延迟过大,会出现刚插入的数据查不到的情况,会让业务很难维护。如果有决心做双活,业务层是必须能够有类似raft的支撑才可以
共 4 条评论 - RocketMQ2022-10-31 来自北京老师你好,oceanbase的三地五中心异地多活容灾方案怎么样
作者回复: 你好,感谢你的留言,ob这个服务有些贵,笑,所以我一直没进行测试,印象中这个服务刚出来的时候偏订单服务,所以后续没有深入分析,后续我研究下
共 2 条评论 - PunkHoo2022-10-31 来自北京徐老师你好,文中 "如果双活机房有一个出现故障了,其他城市的机房只能用于备份或临时独立运行,不要跨城市做双活,因为同步延迟过高会导致业务数据损坏的后果。" 这里面如果其他城市的机房在切换前没来得及同步"主库"数据,切换后的数据是否如何保证一致性呢?
作者回复: 你好,PunkHoo,很高兴收到你的留言,一般来说但凡碰到彻底失联的机房情况的切换都是有损的,对于损失只是大小问题,对于这种单主库情况,最理想情况就是损失几条数据,如果是多主情况下会好一点。我碰到的情况多数是需要人工对比修复一下,不过我们的数据常见都有create_time,update_time相对的修复难度会小很多。 同时,高频率更新的数据是不推荐用这个方式做多机房的。
共 3 条评论