高并发系统实战课
徐长龙
前微博架构师、极客时间架构师
11663 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语&结课测试 (2讲)
高并发系统实战课
15
15
1.0x
00:00/00:00
登录|注册

04|同城双活:如何实现机房之间的数据同步?

未来发展展望
降低数据冲突的方法
Otter解决方案
双活模式的维护成本
机房数据同步的痛点
使用Otter的注意事项
Otter的故障切换
Otter的性能和延迟参考
Otter支持的同步方式
数据冲突解决方案
Otter实现同城双主
Otter介绍
设计简单但存在缺点
请求调度接口
缓存更新策略
数据库主从同步
主从架构
思考题
总结
跨机房同步神器:Otter
核心数据中心设计
同城双活:如何实现机房之间的数据同步?

该思维导图由 AI 生成,仅供参考

你好,我是徐长龙。今天我们来看看用户中心改造的另一个阶段:构建多机房。
在业务初期,考虑到投入成本,很多公司通常只用一个机房提供服务。但随着业务发展,流量不断增加,我们对服务的响应速度和可用性有了更高的要求,这时候我们就要开始考虑将服务分布在不同的地区来提供更好的服务,这是互联网公司在流量增长阶段的必经之路。
之前我所在的公司,流量连续三年不断增长。一次,机房对外网络突然断开,线上服务全部离线,网络供应商失联。因为没有备用机房,我们经过三天紧急协调,拉起新的线路才恢复了服务。这次事故影响很大,公司损失达千万元。
经过这次惨痛的教训,我们将服务迁移到了大机房,并决定在同城建设双机房提高可用性。这样当一个机房出现问题无法访问时,用户端可以通过 HttpDNS 接口快速切换到无故障机房。
为了保证在一个机房损坏的情况下,另外一个机房能直接接手流量,这两个机房的设备必须是 1:1 采购。但让其中一个机房长时间冷备不工作过于浪费,因此我们期望两个机房能同时对外提供服务,也就是实现同城双机房双活。
对此,我们碰到的一个关键问题就是,如何实现同城双活的机房数据库同步?

核心数据中心设计

因为数据库的主从架构,全网必须只能有一个主库,所以我们只能有一个机房存放更新数据的主库,再由这个机房同步给其他备份机房。虽然机房之间有专线连接,但并不能保证网络完全稳定。如果网络出现故障,我们要想办法确保机房之间能在网络修复后快速恢复数据同步。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

跨机房数据同步一直是互联网公司面临的挑战之一。本文介绍了在流量增长阶段构建多机房以提高服务可用性的必要性,并探讨了实现同城双机房双活的数据库同步方案。作者分享了在同城双机房双活中遇到的挑战和解决方案,重点介绍了核心数据库中心设计方案和其局限性。该方案通过主从同步和缓存更新实现数据同步,但存在主从同步延迟、网络故障和人工维护等问题。作者提出了使用数据库同步工具Otter作为另一解决方案,以减少人力投入和维护成本。文章还详细介绍了Otter的工作原理和性能优势,以及在实际应用中的注意事项。总的来说,本文深入探讨了同城双机房双活的数据库同步问题,为读者提供了有益的技术参考。 文章中介绍了Otter作为数据库同步工具的优势,能够快速实现跨机房、跨城市、跨国家的数据同步,并通过性能优化和故障切换功能提高了数据同步的效率和可靠性。此外,文章还提到了Otter对于不同距离的同步性能和延迟参考,以及在实际应用中的注意事项。通过本文的阅读,读者可以了解到Otter在解决跨机房数据同步问题上的重要作用,以及在实际应用中需要注意的细节,对于面临类似挑战的技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • 张申傲
    印象中 MySQL 的 binlog 中会记录一个 server id,用于唯一标识一个集群中的 MySQL 实例。做数据同步时,如果解析发现 binlog 中的 server id 和自己相同,说明是当前实例生成的数据变更,就不会再执行同步了。这个机制应该可以打破循环同步。

    作者回复: 你好,很高兴再次收到你的留言,我理解你这是一个很好的方式,我查相关资料的时候,突然意识到,这个方式也是有瑕疵的,比如,串联同步,级联同步,这会被中转服务覆盖掉

    2022-10-31归属地:北京
    6
  • WGJ
    在这个方案中,数据库主库集中在一个机房,其他机房的数据库都是从库。当有数据修改请求时,核心机房的主库先完成修改,然后通过数据库主从同步把修改后的数据传给备份机房的从库。由于用户平时访问的信息都是从缓存中获取的,为了降低主从延迟,备份机房会把修改后的数据先更新到本地缓存。 老师,个人经验比较欠缺,想问问,备份机房会将修改后的数据更新到本地缓存不太理解,备份机房不是主库,怎么会修改到数据,还有这里的本地的缓存是指本机的内存,如果是的话,更新本机的内存怎么就达到降低主从延迟的目的了呢,这里节奏有点快了 [苦涩]

    作者回复: 你好,WGJ,这里确实我讲的快了一些。这里我按基础顺序理解挨个举个例子,做多机房核心在于解决单个机房损坏无法提供服务问题,一般会做做多机房,当有故障的时候会关闭故障机房让其他机房对外提供服务。但是实际制作的时候发现,大部分业务的数据更新是有一致性要求的。 比如用户账户有100元,如果两个机房同时执行扣款25元而不做互斥的话,会导致两个机房最终用户余额是75而不是50,也就是扣了两次只扣了25元,用户用25元买到两个25元商品。 为了避免这个问题,我给了一个建议就是把用户的这类请求短暂的都调度到一个机房进行处理,这样就不会出现多扣现象,因为同一个机房的很容易用锁去互斥。 这样虽然解决了问题,但是这也带来一个新问题,就是数据如果在一个机房做了修改,需要同步给其他机房,这个同步过程根据距离不同决定了这个同步会很慢,极端情况下用户在用的机房扣款后,其他机房2秒钟后才能同步过去。 而在我们的设计中备份机房只有从库,本地不会修改数据,那么用户扣款后两分钟后才看到主机房的同步后数据刷新是很差的体验,所以,备份机房的服务修改数据后会通知主机房进行更新,同时会刷新备份机房这个用户的账户缓存,用户的查询尽量优先从备份机房的缓存走,等主库更新后再同步过来备份机房的从库后,我们从备份机房的从库才能拿到最新的数据。

    2023-04-10归属地:广东
    2
    2
  • 千锤百炼领悟之极限
    如果老师可以在每一期的结尾给出上一期思考题的答案就好了。

    作者回复: 你好,答案后期会公布,前期多看大家留言讨论,多查,多独立思考,会有更好的帮助

    2022-11-13归属地:北京
    2
    2
  • 黄堃健
    说到这里,我们再讲一讲 Otter 的故障切换。目前 Otter 提供了简单的主从故障切换功能,在 Manager 中点击“切换”,即可实现 Canal 和数据库的主从同步方式切换。如果是同城双活,那关于数据库操作的原有代码我们不需要做更改,因为这个同步是双向的。 老师,不理解Otter的故障切换时,如果是同城双活,那关于数据库操作的原有代码我们不需要做更改,因为这个同步是双向的。 有相关的资料吗? 这里有点糊涂?

    作者回复: 你好,同城双活其中一个机房故障,我们需要把那部分故障的用户转到正常工作的的机房,转的过程中要尽量保证不会出现两边同时修改同一个数据情况。 并且出故障的机房很可能会和另外机房断开暂时不能同步,恢复后会有一些数据没我同步和正常机房的后续更改冲突。 另外双活不是双向同步,双向同步数据肯定会坏掉,为了减少数据冲突并且不让一个机房闲置多数会让用户按hash分到不同的机房,所以双活多数会一部分主库分片在a机房,另一部分主分片在b机房,故障时实际上转移的是这样的分块谁是主库,谁做修改决策。

    2024-03-01归属地:广东
    2
  • IT小村
    异地多活核心是根据用户进行路由,简单地合并等操作,都存在问题

    作者回复: 你好,这个问题核心在于:用户数据操作短期内请求都会在一个机房内,所以这种合并 并不复杂和平时开发类似,同一个机房内的数据服务会自动处理这个数据合并。只有在多机房异地同步到一个实例时会有版本问题,但是用户数据只会在一个地方更新互斥,所以这个可能只有在用户切机房或机房故障时会有体现。

    2023-12-02归属地:北京
  • Sam_Deep_Thinking
    除非是流量很大的中大公司,不然这种问题,一般还是交给云产商去解决的。

    作者回复: 你好,sam感谢你的分享,对于这个我持不同意见,个人觉得很少有云能够彻底理解微企业用户业务来提供贴心服务

    2023-10-11归属地:广东
  • 我爱吃桃子
    老师有两个问题。 1 互联网大部分业务场景都是 读多写少,是不是读多活 就已经可以 覆盖大部分场景了? 2 现在的这种写多活,是不是 基本上都是 单元化来实现了,每个用户 只会 被路由到自己的单元,除非他的单元故障,dns才会强行切到其他单元

    作者回复: 某个角度来说是这样,读多写少多数属于一个功能中比较频繁访问的情况。独立看起来确实感觉简单,但并不是整个系统都是能满足这个场景,因为还有事务一致性要求,其他情况需要搭配各种业务运营思路技巧,很多情况是组合存在的,这里还少说一个很多情况需要搭配CQRS读写分开思路拆分才可能满足业务需要

    2023-06-14归属地:江苏
  • piboye
    不同机房时钟有差异,毫秒级别的更新冲突会导致数据丢失吧?

    作者回复: 你好,piboye,会有这个问题,这里需要注意,客户端在一段时间内只在一个机房活跃就可以避免修改冲突

    2023-02-15归属地:广东
  • zmlmagic
    加一个更新版本标记位用来破环

    作者回复: 那么再深入一点,那么如何保证这个标识是唯一的?

    2023-02-15归属地:内蒙古
  • Geek_d8ddf2
    双机房 散热系统要独立,不然一个机房热爆 另一个估计也是热爆,参考阿里云香港教训

    作者回复: :)

    2023-01-29归属地:北京
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部