多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

机房挂了怎么办?一文讲透容灾架构的演进

机房挂了怎么办?一文讲透容灾架构的演进 我们经常会听到容灾、单点、冷备、热备、双活、多活这些词。再往细了说还有容灾演练、同城容灾、同城双活、两地三中心、异地双活、异地多活。这些词你清楚它们的核心区别和实现原理吗如果听过但一直没搞明白这篇文章就带你一次搞懂。1. 同城冷/热备想象一下你刚到一家创业公司上班把系统部署在城市 A 的机房 A跑得起飞一切完美。可突然有一天机房网络断了不是几分钟是整整一天你的系统彻底离线用户直接访问不了客服电话被打爆老板一直催你抓紧修复。修复之后你做了全面复盘想着能不能在城市 A 的机房 B 再部署一套一模一样的数据库和应用然后把 A 的数据定时备份到 B。当机房 A 挂了手动启动 B 机房恢复备份数据再改个域名解析把用户流量切过去。虽然恢复需要一定时间恢复的数据也可能不是最新的但好歹不用干等着机房 A 恢复。这就叫同城冷备也叫同城灾备 / 冷备容灾。随后你把这个方案告诉老板老板说我不懂只想知道下次出问题业务多久能恢复数据丢多少于是你想到了两个指标RTORecovery Time Objective恢复时间目标从灾难发生到系统恢复需要多久。RPORecovery Point Objective恢复点目标灾难发生时会丢多少数据。同城冷备在故障时需要启动应用和数据库、再做数据恢复RTO 一般是小时级老板认为不适合生产业务于是你把它部署到测试环境。为了减少恢复时间你把故障时的前置工作提前准备好让机房 B 平时保持运行机房 A 和 B 组成主备集群并实时同步数据。故障时直接做主备切换再改一下域名解析流量很快就能切到机房 B。这叫同城热备RTO 缩到了分钟级RPO 也很小接近 0取决于同步延迟。老板终于同意在生产环境部署。冷备是平时不跑、坏了手动切、小时级恢复还可能丢数据热备是平时就跑、坏了自动切、分钟级恢复几乎不丢数据。2. 同城双活后来你的软件被一家互联网公司看中他们对你的方案摇摇头觉得冷/热备资源利用率低还得手动切换万一半夜出问题了那不是炸了吗而且主备环境配置万一不一样切过去崩了怎么办你觉得有道理于是在流量入口增加了一个调度层可以动态域名解析在云环境中也可以直接使用负载均衡器。它不仅能按比例分配流量到两个机房还能自动探测应用健康状态实现故障流量的快速切换提升了资源利用率也让切换更加自动化。但还有个问题两个机房的应用都要读写数据库如果数据库各写各的数据不就乱套了吗你讲了个折中的办法所有的写操作都往主机房的主数据库写再同步到备机房的从库读操作就近读取各自机房的库。这样数据能保持最终一致备库还能分担读的压力。这就是同城双活。它能实现分钟级的RTO。不过要注意它的本质是读双活、写单点——写仍然集中在主机房主机房挂了还是需要切换只是读的压力被两个机房分担了。3. 两地三中心有一天你突然想到一个问题要是这个城市发了洪水、地震整个城市都瘫了那我们的机房不就全完蛋了吗于是你跑到另一个城市 B在机房 C 又部署了一套数据库把城市 A 的数据实时同步过去。这样哪怕城市 A 的机房全挂了至少还能靠机房 C 把数据恢复出来。这叫异地灾备。但光有备份你心里还是不踏实万一真要用的时候恢复不了呢所以你在机房 C 也把应用环境搭好定期切一部分生产流量过去跑一跑就当是提前做一次消防演习验证整个容灾恢复流程能不能走通。这就叫容灾演练。最终两个城市、三个机房这套部署架构就叫两地三中心。4. 异地双活有一天你突然想到同城双活虽然能扛住机房故障但万一整个城市出事呢两个机房离得再近洪水地震一来还是一起完蛋。异地灾备虽然能保数据可它平时不跑业务真切过去又要时间资源还白白浪费着。于是你想干脆让城市 B 的机房也真正跑起业务两边同时对外服务这样既扛得住城市级灾难平时资源也不闲着。这就是异地双活。听起来像是把同城双活往外扩了一层但难点完全变了。同城双活里写是单点的所有写都去主机房从库只读不会冲突。可异地双活两边都能写同一个数据城市 A 改了一下城市 B 也改了一下听谁的这就叫写冲突。解决的办法通常是按用户或数据分片比如尾号奇数的走 A 写偶数的走 B 写同一个数据永远只在一个城市写或者直接用 TiDB、OceanBase 这类分布式数据库让底层帮你搞定一致性。另一个麻烦是延迟。同城两个机房距离近同步一毫秒以内异地跨城几百上千公里光速摆在那一次往返几十毫秒。如果每次写都要等另一个城市确认用户就会觉得卡。所以异地双活通常走最终一致先本地写完就返回后台再慢慢同步中间有一个短暂的不一致窗口这就是它 RPO 的来源很小但不是零。所以异地双活和两地三中心经常被搞混两地三中心是两个城市三个机房通常是同城双活加异地灾备第三个机房平时不跑业务异地双活是两个城市两个机房都跑业务没有纯粹的备。它资源利用率更高但技术难度也更大通常只有对可用性要求极高的业务才会用。5.异地多活有一天你突然又想到异地双活虽然两个城市都跑业务但说到底还是两个城市。万一其中一个城市整体出问题流量全压到另一个城市那个城市扛得住吗而且两个城市之间写冲突已经够麻烦了要是再多几个城市岂不是更乱于是你想干脆别只搞两个城市了直接搞三个、四个甚至更多城市每个城市都跑一套完整的业务都能读写流量按规则分到各个城市去。这样一来任何一个城市挂了剩下的城市还能继续扛用户几乎无感。这就是异地多活。听起来像是异地双活的加强版但复杂度完全不是一个量级。异地双活两个城市写冲突还能靠分片或者分布式数据库勉强搞定异地多活三个以上城市数据要在多个城市之间同步冲突处理的难度成倍上升。你不仅要考虑 A 和 B 之间的一致性还要考虑 A、B、C、D 之间的一致性任何一个环节出问题都可能让数据乱掉。所以异地多活通常有这么几个前提一是数据要能按用户或业务维度分片每个分片只在一个城市写从根上避免多写冲突二是要有统一的流量调度层能根据用户位置、城市健康状态、容量情况把流量分到最合适的城市三是底层数据库要支持多副本、多地部署比如 TiDB、OceanBase 这类分布式数据库帮你扛住跨城同步和一致性。和异地双活比异地多活的资源利用率更高容灾能力也更强但成本和复杂度也更高。它通常只有像阿里、腾讯这种体量的公司或者对可用性要求极高的核心业务才会真正去做。对大多数公司来说异地双活已经是很高的配置了异地多活更多是一种“理想形态”。
返回列表