知识卡片
N+2冗余标配与实例对等独立原则
内容
提高冗余度、多实例运行、用资源换可用性,是最耳熟能详的高可用手段,但真正实现起来有不少容易被忽视的细节。N+2应该是标配:如果一个服务正常运行需要1个实例,生产环境就应该部署1+2=3个节点。N+1(丢失一个实例仍能正常运行)很好理解,一般情况下够用;但对现代分布式软件系统而言,”发布”本身通常不是一个瞬间过程,而是滚动更新——发布过程中正在被更新的那个实例本身就是不可用的,如果这时候再意外丢失另一个实例,N+1就扛不住了,N+2才能保证”发布过程中再丢一个实例”仍能维持业务正常,这和国内常说的”两地三中心”概念有些类似。实例之间必须对等、独立:千万不要搞成一大一小或者相互依赖的关系,否则表面上的N+2根本不是真正的N+2——一个具体的判断标准是,如果两地三中心里的某一个中心需要24小时才能完成迁移,那它就不能算高可用部署,只能叫异地灾备系统,因为真正的N+2要求任意一个实例随时都能承接完整流量,而不是需要漫长准备时间才能顶上的”备胎”。这两条原则合起来说明:N+2不是一个简单的”数字冗余度”概念,它同时隐含着”冗余的实例必须能立刻、独立地承担全部流量”这个更严格的要求——只是把服务器数量堆到3份而不保证每一份都能独立扛起全部服务,得到的只是”看起来安全”的假象,遇到发布期间叠加意外故障这种真实场景时,照样会暴露出脆弱性。
参考来源
- 位置:《高可用架构(第1卷)》第1章《高可用架构案例精选》"1.8 来自Google的高可用架构理念与实践"节,"1.8.2 高可用性方案"(源文件:_epub-src/OEBPS/Text/Chapter1_8_3.xhtml)
- 结论依据:原文说明"对现代分布式软件系统来说,'发布'一般不是一个瞬间过程……N+2可以做到在发布的过程中……再丢失另外一个实例(意外情况)仍能维持业务正常",并强调"千万不要搞一大一小或者相互依赖……如果两地三中心的一个中心需要24小时才能迁移过去,那它就不是一个高可用性部署,还是叫异地灾备系统吧",直接支撑本卡片结论。
- 原始内容:N+2就是说平时一个服务如果需要1个实例正常提供服务,那么在生产环境上就应该部署1+2=3个节点……实例之间必须对等、独立……如果两地三中心的一个中心需要24小时才能迁移过去,那它就不是一个高可用性部署。