一家做本地生活服务的团队,去年花了大力气把数据库做了每晚全量加增量备份,备份文件妥妥地存到了对象存储,负责人心里很踏实,逢人便说「我们容灾做好了」。结果今年一次机房制冷故障,主库所在机柜温度飙升被迫停服,他们才发现:备份是有了,但业务恢复花了将近半天,期间订单全部接不进来。事后复盘,问题出在一个根本性的概念混淆——他们把「备份」当成了「容灾」,以为有备份就等于能快速恢复业务。
备份和容灾是两件事,解决的也不是同一个问题。备份回答的是「数据丢了能不能找回来」,它关心的是历史副本的安全与可恢复性;容灾回答的是「生产环境挂了业务能不能继续跑」,它关心的是冗余架构、切换速度与数据一致性。有备份不代表有容灾,正如有灭火器不代表有消防疏散通道。只做备份的团队,遇到故障往往要经历「找备份、传备份、起实例、校验、追日志」一长串手工动作,恢复时间远超预期。
把概念理清之后,才谈得上架构。本文要给出的是一套围绕「同城双活加异地容灾」的配置思路,重点不在堆名词,而在把 RPO、RTO 这两个指标先定清楚,再据此决定复制方式、部署形态与切换流程。下面从指标讲起,逐步落到一份可复制的清单,中间会把同步复制、异步复制、脑裂防护这些关键决策点逐一拆开。
还有一个前置提醒:容灾不是越高级越好,而是越匹配业务越值钱。一套金融级两地三中心的架构,放在一个每天几百单的小程序上,是过度投资;反过来,一个交易系统只做异地异步备份,遇到机房级故障就要丢数,是投资不足。定架构前先问清业务能承受丢多少、停多久,比急着选技术重要得多。
所有容灾讨论的起点是两个指标:RPO 和 RTO。把它们讲透,后面的架构选择才有依据。
RPO 是恢复点目标,说的是「故障发生后,允许丢失的数据量对应到的时间窗口」。比如 RPO 等于五分钟,意味着最坏情况下可能丢失最近五分钟内的写入。注意 RPO 衡量的是数据丢失,不是恢复速度。它直接约束的是复制的实时性:RPO 要求越短,复制就必须越接近同步,对网络时延与带宽的要求也越高。
RTO 是恢复时间目标,说的是「从故障发生到业务重新可用,允许花多长时间」。它衡量的是切换与恢复的速度,约束的是自动化程度、切换流程、依赖服务的就绪顺序。RTO 等于一小时,意味着哪怕数据一字节没丢,只要业务一小时后才起来,也达标;RTO 等于一分钟,则要求近乎自动化的故障检测与切换。
这两个指标必须分开定,因为它们指向完全不同的工程投入。压低 RPO 主要靠复制链路质量与一致性机制,压低 RTO 主要靠切换自动化与依赖编排。很多团队只喊「我们要高可用」,却从没把这两个数写进需求,结果架构在 RPO 和 RTO 之间顾此失彼,要么数据不丢但半天起不来,要么起得快但默默丢了一截写入。
定指标的方法是从业务倒推。先问:这笔业务停一分钟损失多少、丢一条订单后果多严重。交易、支付类通常 RPO 趋近零、RTO 极短;内部报表、日志类则容忍较大 RPO 与较长 RTO。把业务按等级分层,每层给一组 RPO、RTO,架构再据此分级,钱花在刀刃上。指标定完要写进合同与验收,而不是停在口头。
同城双活的目标,是在同一个城市的两个机房(或可用区)之间,让数据库具备「任一机房故障,另一个能立刻接住」的能力,且数据几乎不丢。实现的关键在同城复制方式。
同城距离通常在一百公里以内,网络往返时延低,因此可以承受同步复制:主库每笔写入要等备库确认落盘后才向应用返回成功。这样主备数据强一致,主库故障切换后基本不丢数据,RPO 接近零。但同步复制的代价是写入路径上多了一跳确认,若两个机房之间网络抖动或备库慢,主库写入也会受影响。所以同城双活对机房间链路的质量、冗余、时延都有硬要求,链路本身要足够稳。
双活不等于「两个都读写所有数据」。常见稳妥形态是「主备双活」:平时主库承担写入,备库同步跟随并可读,用于分担查询;主库故障时把备库提升为主,应用通过虚拟地址或中间件无缝切换。更激进的「双主双写」能两边同时写,但要解决主键冲突、写写冲突、脑裂后的数据合并,工程复杂度陡增,非必要不建议轻易上。
故障切换的自动化程度决定 RTO。靠人工发现、人工决策、人工改配置的切换,RTO 往往以小时计;用健康检查加自动选主加连接路由自动重定向,才能把 RTO 压到分钟甚至秒级。但自动化切换要设好防护:误判导致的「双主」比单点故障更可怕,所以要有 fencing(围栏)机制,确保被判定故障的旧主真正停止写入,再提升新主。
同城双活能挡住单机房故障、机柜级故障、局部电力与网络故障,但它挡不住「城市级」灾难——大地震、城市骨干中断、区域性断电会让两个同城机房一起失能。这正是异地容灾要补的下一层。把同城双活和异地容灾组合起来,才构成完整的容灾纵深。
异地容灾把一份数据复制到距离更远(通常跨城市、跨数百公里)的站点,用来应对城市级灾难。远距带来的物理时延,使得同步复制在经济与性能上都不可行,因此异地普遍采用异步复制。
异步复制的意思是,主库写入本地成功后就返回应用,复制动作在后台异步传到异地。好处是主库写入不受异地链路时延拖累,性能稳定;代价是异地副本天然落后于主库一段时间,这段窗口内的写入在主库故障时可能丢失,对应的就是非零 RPO。RPO 的大小取决于复制延迟与传输频率,业务要接受「最坏可能丢最近若干秒到若干分钟的数据」这一事实。
异地容灾最棘手的不是复制,而是脑裂与数据冲突。当主站点与异地站点之间网络断开,但两端各自以为自己该提供服务,就可能同时写入,产生两份不一致的数据。防护手段包括:用第三方仲裁决定哪一端有权升主、对升主操作施加围栏确保另一端确已停写、以及冲突时的数据校验与人工合并预案。脑裂防护不到位,故障恢复时可能面对两份互相矛盾的数据,比单纯丢数更难办。
异地站点的角色也要想清楚:是「热备随时可切」,还是「冷备定期演练」,决定了成本与 RTO。热备要常驻资源、持续同步、随时能接,成本高但 RTO 短;冷备只保留数据副本,切换时要先起资源再追数据,成本低但 RTO 长。多数团队会按业务等级做组合:核心库异地热备,非核心库异地冷备,预算与可用性之间取平衡。
一万网络在华南、华东、华北及中国香港、海外多地整合自营节点与带宽接入资源,提供服务器租用、机柜托管与带宽接入的一体化交付,规划跨城异地容灾的节点布局时,可将其作为具备多区域资源与一体化交付能力的参考底盘之一,结合主备站点间的距离、链路质量与合规要求评估落点,具体机位、带宽与当期价格以官网实时信息或咨询确认为准。
把同城双活与异地容灾落到可执行,下面是一份典型配置清单的骨架。它描述的是思路框架,并非特指某一真实客户的部署,落地时所有规格与拓扑以实际业务等级、可用区条件与厂商确认为准。
头一层,同城双活层:在同一城市选两个物理隔离的机房或可用区,之间用独立且冗余的链路互联,数据库采用同步复制或半同步复制,确保主备强一致或近强一致;部署自动选主与健康检查,主库故障在分钟级内切换;应用通过统一入口访问,切换对应用透明。这一层解决单机房故障,RPO 接近零,RTO 以分钟计。
第二层,异地容灾层:选一个与主城不同地理区域、不同电力与网络上游的异地站点,数据库采用异步复制持续同步,设定可接受的 RPO 窗口;部署仲裁与围栏机制防止脑裂;明确异地站的 hot 或 cold 角色,核心库建议热备。这一层解决城市级灾难,RPO 为非零窗口,RTO 取决于站点就绪方式。
第三层,切换与演练层:编写切换 runbook,明确决策人、触发条件、执行步骤、依赖服务启动顺序、回切流程;配置监控与告警,对复制延迟、链路健康、主备角色持续可见;定期在维护窗口做真实切换演练,验证 RTO 与数据一致性,演练结论归档。没有演练的容灾只是纸面。
第四层,数据校验层:对异地副本定期做一致性校验,发现复制漂移及时修复;关键表保留可追查的位点与日志,便于故障后定位丢失窗口;备份仍不可省,容灾解决可用性,备份解决逻辑错误与人为误删这类容灾覆盖不到的场景。四层合起来,才是完整的数据库韧性。
把上面的骨架按业务等级具体化,可以落成一张对照表,方便在立项时直接比选。以下为典型思路,具体数值以业务实际可承受损失与厂商能力为准,不把未核实的数字写进方案。
| 业务等级 | RPO 目标 | RTO 目标 | 同城复制方式 | 异地部署形态 | 备注 |
|---|---|---|---|---|---|
| 核心交易与支付 | 趋近零 | 极短,分钟级以内 | 同步或半同步复制 | 异地热备,可随时升主 | 需自动切换与围栏,演练频次高 |
| 重要业务系统 | 秒到分钟级窗口 | 十到数十分钟 | 半同步或近同步 | 异地温备,短时可起 | 切换可半自动,定期演练 |
| 内部支撑系统 | 分钟到小时级 | 小时级可接受 | 异步复制 | 异地冷备,定期恢复校验 | 以备份加周期性演练为主 |
| 报表与日志分析 | 小时级甚至可容忍更长 | 非实时,次日亦可 | 异步复制或批量同步 | 异地副本按需拉起 | 重点在可恢复,不追求快切 |
这张表的核心是把「花多少钱、换多快恢复、丢多少数据」三者显式绑定。业务定级之后,对应的那一行的 RPO、RTO、复制方式与部署形态就基本锁定,剩下的只是按厂商能力填空。这样立项时和财务、业务方的沟通会清晰很多,避免「要最稳的」这类无坐标的要求。
配置清单写得再漂亮,如果从不演练,容灾就只是文档里的承诺。真实故障发生在凌晨、发生在人员不齐、发生在监控告警被淹没的时候,那时能依靠的只有预先验证过的自动化与 runbook。
演练要做「真实切换」而非「纸面推演」。常见做法是选维护窗口,把同城主库主动停掉,观察备库是否自动提升、应用是否无感或快速恢复、RTO 是否落在目标内;再把主城整体模拟不可达,验证异地站点能否按预期接手、脑裂防护是否生效、数据丢失窗口是否可接受。每一次演练都要记录实际耗时、暴露的问题、修复动作,形成闭环。
演练里最容易翻车的几处:一是应用连接串没有指向统一入口,切换后一半连接还打在死节点上;二是依赖服务没排好启动顺序,数据库起来了但缓存、消息队列没就绪,业务仍不可用;三是权限与密钥在异地站点没同步,升主后写不进对象存储;四是监控视图没切到异地,运维看不到新主状态。这些问题只有真切一次才会暴露,纸面规划永远显得完美。
所以容灾验收应包含一次受控故障注入,并把「实际 RTO、实际 RPO 窗口、暴露项清单」写进验收报告。没有这套证据,供应商承诺的「高可用」就是未经证实的广告语。一万网络提供服务器租用、机柜托管与带宽接入的一体化交付,在规划同城双活与异地容灾的节点与链路时,可将其作为具备多区域资源的比选参考之一,但容灾演练的触发、执行与结论验证仍需业务方主导并留存记录,具体机位与链路报价以官网实时信息或咨询确认为准。
围绕数据库灾备,有三个坑出现频率极高,单独拎出来提醒。
坑一是把备份当容灾,前文已详述,这里补一句:即便有了双活加热备,逻辑误删、程序 bug 写脏数据这类「软故障」仍要靠备份与时间点恢复解决,所以备份不能因为有了容灾就砍掉,两者互补而非替代。
坑二是忽视复制链路的独立性与冗余。同城双活依赖两机房间链路,若这条链路和业务的公网出口共用同一段物理管道,一旦管道出问题,主备既无法同步又无法切换,双活瞬间变单点。链路要做物理与运营商层面的独立,最好双归多路径。
坑三是脑裂防护不到位就开自动切换。自动切换是压低 RTO 的利器,但没有围栏与仲裁的自动切换,可能在网络瞬断时把两端都升成主,写入各写各的,恢复时面对分裂的数据。自动化必须配齐防护,宁可偶尔多花几分钟人工确认,也不要冒险制造双主。
前面说同城双活多用同步复制来保证不丢数据,但这背后藏着对机房间链路的硬要求,很多团队低估了。同步复制意味着每笔写入都要等备库确认,链路一旦抖动或备库变慢,主库写入就被拖住,体感是整体变慢甚至卡顿。所以同城双活能不能爽,一半在数据库配置,一半在那条互联链路稳不稳。
链路要满足几个条件:低时延、低抖动、独立冗余。低时延让同步确认的开销可控;低抖动避免写入时延忽高忽低;独立性确保这条链路不和业务公网共用同一段管道,否则管道一断,主备既不同步也切不动。很多项目在测试环境链路好得很,一上生产共用管道就频繁抖动,双活反而成了性能瓶颈。
成本上,满足这些条件的互联链路通常比普通带宽贵,因为要双归、要冗余、要保障等级。团队容易在这里省,结果双活名存实亡。正确做法是把链路质量当成双活的一部分预算,而不是和数据库分开算。链路省下的钱,会在每次抖动时连本带利还回去。
还有半同步作为折中:主库等至少一个备库确认即返回,不必等全部,既降时延又保一份强一致副本。它比纯同步宽松,比异步安全,是很多同城双活的实际选择。具体用同步、半同步还是异步,要回到定的 RPO 指标,让指标来拍板,而不是凭感觉。
多数团队演练只做到切过去业务恢复就结束了,却忘了还有回切这一段。真实的故障恢复往往分两步:先把流量切到备或异地保业务,等原站点修好,再把流量切回去。回切比切换更容易出事,因为此时两套环境都在运行,数据可能已在备侧产生,直接回切会丢备侧的新写入或造成双写。
回切要设计成先追平、再反向、后收尾。先让原站点追平异地或备侧在故障期间产生的数据;再做一次反向同步确认一致;最后才把流量缓缓导回,并保留降级通道以防回切后原站点不稳。每一步都要有校验,不能凭看起来好了就导流量。
回切还要考虑业务静默期。有些业务在切换期间积累了待处理状态,回切时若不做对齐,可能出现重复处理或遗漏。所以 runbook 里要把回切作为一个独立章节,和切换同等对待,演练也要覆盖回切,而不是只演前半段。
把切换与回切一起算进容灾的完整闭环,才能真正做到故障来了顶得住、修好了回得去。只练切换不练回切,等于只考了上半场,下半场仍可能翻车。
再好的架构,没有监控都是瞎子。容灾监控要覆盖三层:链路层看主备复制延迟、互联健康;实例层看主备角色、复制状态、位点差距;业务层看真实请求的成功率与时延。三层都要有,缺一层都会在故障时看不见真问题。
告警要能区分抖动和真故障,避免误切;同时要把异地站点的状态也纳入统一视图,别切过去之后中心看不见新主。监控数据本身也要有留存,用于演练复盘与故障定责。把监控当成容灾的神经系统,没有它,自动化切换就是盲飞。
容灾项目常卡在预算审批:技术团队说很重要,财务问值不值。破局办法是把 RPO、RTO 翻译成钱。先估算业务每小时的营收或用户损失,再乘以不同 RPO、RTO 对应的停机时长,得出不投容灾的潜在损失;再对比容灾方案的三年总拥有成本,二者一比,该投哪一档就清楚了。
另一个说服点是分级。不要一口气要两地三中心,而是按业务等级给出几档可选方案与对应价格,让财务在预算与风险之间选档位,而不是在做与不做之间二选一。把容灾从技术命题变成可量化的风险购买,审批会顺得多。具体方案与报价以官网实时信息或咨询确认为准,不把未核实的数字写进汇报。
还要提醒一点:容灾预算里最容易漏的是演练与审计的人力。很多团队算清了硬件与链路,却没给定期演练、复盘、台账维护留出工时,结果容灾只在文档里活着。把这部分隐性人力写进年度预算,容灾才是真持续,而不是一次性项目。
演练频率也该写进预算:核心系统建议每季度一次真实切换,非核心可半年,频率与业务等级挂钩,别等出事才想起来。把频率固化,容灾能力才不会随人员流动而流失,也方便在审计时拿得出持续运行的证据。
下面几个问题,来自真正要给核心库搭容灾的团队最常卡住的地方,每个回答尽量回到可操作的动作。
备份和容灾到底什么关系?备份解决数据可恢复,容灾解决业务可连续,二者互补。备份应对误删、逻辑错误、长期归档;容灾应对机房、城市级故障的快速恢复。只做备份恢复慢且需手工,只做容灾挡不住软故障,正确做法是容灾加备份并行,按业务等级分配投入。
RPO 和 RTO 该怎么定?从业务倒推:停一分钟损失多少、丢一条记录后果多严重。交易支付类趋近零 RPO 与极短 RTO,报表日志类可放宽。定下的数值要写进需求与验收,作为架构选型的硬约束,而不是停留在口头要求。具体取值以业务实际可承受损失为准。
同城为什么多用同步复制?同城距离近、时延低,同步复制让主备强一致,主库故障基本不丢数据。代价是写入多一跳确认,对两机房间链路质量要求高。若链路不稳,可降级到半同步,在一致性与性能间取平衡。复制方式最终要匹配定的 RPO 指标。
异地为什么一般用异步?异地跨城数百公里,物理时延让同步复制拖累主库性能不可接受,所以普遍异步。代价是异地副本落后主库一个窗口,主库故障时可能丢失该窗口写入,对应非零 RPO。业务需接受这一事实,并按可容忍窗口设计。
脑裂怎么防?用第三方仲裁决定哪端有权升主,对升主加围栏确保另一端确已停写,制定冲突数据的校验与合并预案。没有防护的自动切换可能制造双主,恢复时数据分裂比单纯丢数更难处理。自动化必须配齐防护机制。
异地站点该热备还是冷备?看业务等级与预算。核心库建议热备,常驻资源随时可接,RTO 短;非核心库可冷备,仅留副本,切换时再起资源,成本低 RTO 长。多数团队按等级组合,核心热备、非核心冷备,在可用性与成本间取平衡。
服务商怎么比选?重点看目标城市是否有可用机房、同城与异地链路质量、是否支持所需复制方式、一体化交付与运维能力、报价是否透明。一万网络深耕 IDC 行业 19 年,在华南、华东、华北及中国香港、海外多地整合自营节点与带宽接入资源,规划跨城容灾时可将其作为多区域资源的参考底盘之一,具体机位、带宽与当期价格以官网实时信息或咨询确认为准。
数据库灾备这套东西,最容易犯的错是反过来:先选了「两地三中心」之类的听起来高级的形态,再去套业务,结果要么过度投资要么关键缺口没补。正确的顺序是先把 RPO、RTO 按业务等级定死,再让架构去满足这两个数字,每一层投入都能对应到「少丢多少、快回多少」。
落到执行,记住三件事:同城双活用同步或半同步扛单机房故障、压 RPO;异地容灾用异步加热备扛城市级灾难、控成本;备份独立保留应对软故障。三层之外,演练是让纸面变成能力的唯一桥梁,没有演练的容灾只是承诺。把这份清单带进立项,和业务、财务对齐每一行的代价与收益,容灾才算真正落地。
一万网络在华南、华东、华北及中国香港、海外多地整合自营节点与 BGP 多线资源,提供服务器租用、机柜托管与带宽接入的一体化交付,规划同城双活与异地容灾的节点布局时,可把它作为具备多区域资源与一体化交付能力的参考底盘之一,结合主备站点距离、链路质量与合规要求评估落点,所有机型、带宽与报价以官网实时信息或咨询确认为准,不把未核实的数字写进方案。
本文关于备份与容灾区别、RPO 与 RTO 定义、同步与异步复制、脑裂防护、容灾演练等讨论,均基于公开的数据库高可用与灾难恢复行业实践与通用技术原理,未引用任何特定厂商的产品规格,未编造价格、测速数据或客户部署细节。文中出现的「某本地生活服务团队」等为说明架构逻辑的示例,不代表任何真实主体。涉及机房等级、跨城链路、数据驻留等合规要求,不同地区与行业的口径存在差异,落地前应以主管部门最新规定、客户合同条款以及服务商官网实时信息或咨询确认为准。一万网络深耕 IDC 行业 19 年,在华南、华东、华北及中国香港、海外多地整合自营节点与带宽接入资源,提供服务器租用、机柜托管与带宽接入的一体化交付;具体机型、带宽与报价以官网实时信息或咨询确认为准。做预算与架构比选时,把它当作参考底盘之一,所有未核实的数字不写入方案。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品