知识卡片
多中心是质变而非量变:数据一致性/事务性无通用解法
内容
单机房架构在全局网络层面是单点,无法保证异地容灾场景下的高可用——断电、网络中断、地震、水灾等都可能导致整个数据中心不可用,因此需要多机房设计。多机房设计核心要解决的是”距离带来的延时问题”,常见有三种方式:同城多机房(距离较近,可以投入重金搭建私有高速网络,让多机房性能接近单机房,但因为投入成本太高,只有大公司才能这样做,且遇到极端地震、水灾等波及全城的灾难时依然存在风险);跨城多机房(不同城市的机房,数据通过网络进行复制,例如MySQL主备复制,但由于跨城网络延迟较大,业务上要接受一定妥协——不需要数据实时强一致,只需要最终一致即可,比如微博,A用户在北京机房发布微博,B用户在广州机房不需要实时看到,10分钟后看到也可以接受;这种方式实现简单,但和具体业务强相关,微博能接受,但类似支付宝转账这种要求余额强一致的业务就不能这样做);跨国多机房(与跨城类似,但地理距离更远、延迟更大,由于延迟过大、跨国用户访问速度慢,跨国多机房一般只用于备份,以及服务当地用户)。而”多中心”和”多机房”有本质区别,绝非同一件事的简单升级:多机房设计的首要目标是”容灾”——数据中心出问题后,业务能够比较快地切换到另一个数据中心,但这个切换允许一定的中断时间(例如10分钟、1小时),且允许一定的业务损失(例如部分没有同步的数据无法立即恢复,甚至可能永远无法恢复);而多中心要求每个中心都同时对外提供服务,业务能自动在多个中心之间切换,做到故障后自动恢复,无需或仅需很少的人工干预。多中心设计的核心难点在于要保证”数据一致性”和”数据事务性”,而这两点又和具体业务紧密相关,目前没有很成熟的通用方案,都需要基于业务特点进行详细的分析和设计——比如淘宝号称实现了多中心,但实际上商品浏览、订单、支付等不同业务都是各自独立设计和实现多中心方案的,并不存在一个统一的多中心方案可以套用所有业务。正因为难度如此之高,目前国内银行和支付宝这类系统实际上都还没有真正做到多中心(曾经发生过挖掘机意外挖断光缆导致支付宝服务中断4小时的真实案例,正说明了这个差距)。
结构图:
flowchart TB
A["单机房:全局网络单点故障<br/>无法应对断电/地震/水灾等异地容灾场景"]
A --> B["多机房:解决延时问题的三种方式"]
B --> B1["同城多机房:投入重金追近单机房性能<br/>成本高,仍怕波及全城的极端灾难"]
B --> B2["跨城多机房:接受最终一致<br/>与业务强相关,微博可以,支付宝转账不行"]
B --> B3["跨国多机房:延迟过大<br/>一般只做备份+服务当地用户"]
B --> C["多中心(质变,非量变)"]
C --> D["多机房目标=容灾<br/>切换允许中断+允许部分数据损失"]
C --> E["多中心目标=自动切换、故障自愈<br/>核心难点:数据一致性+数据事务性"]
E --> F["无通用方案,须按业务独立设计<br/>淘宝:浏览/订单/支付各自独立实现"]
F --> G["难度极高:银行/支付宝仍未做到<br/>案例:挖掘机挖断光缆致支付宝中断4小时"]