分布式系统架构设计 – 第21式 - 基础理论 - 从CAP到PACELC

前言

分布式系统是一门讲究实践的软件工程,只有PK过设计方案,从微观处手把手的敲过一行行的代码,才能知道细节在哪里,难点在哪里,痛点、挑战点在哪里。同时,分布式系统也是一门讲究理论的软件工程,从宏观处着眼深刻理解系统设计的理论,将理论与实践相结合,想好、做好、说好才是真的好。因此,宏观处着眼,微观处着手,才能真正掌握分布式系统。自此,本系列文章开始讲诉分布式系统设计里的基础理论,本文为CAP与PACELC理论。

CAP理论与PACELC理论

CAP理论

CAP理论是分布式系统最为基本的指导理论之一,是分布式系统设计时最为基本的取舍依据,CAP理论认为一致性、可用性、分区容忍性不能同时满足,即:

  • 一致性(Consistency): 所有的节点在同一时刻看到同样的数据;

  • 可用性(Availability): 节点失效不会影响系统的读写;

  • 分区容忍性(Partition Tolerance): 系统能支持网络分区,即使分区之间的消息丢失系统也正常工作。

但是,CAP理论也有其自身的局限性。在工程实践中CAP理论的应用可以一分为二:系统整体以及系统内部。比如,系统整体可以选择CA或者CP,但是系统内部微观处有些特性却可以同时满足CAP三要素,因为分区是件极少发生的事,为了追求卓越的设计理念可以尽量同时满足CAP三要素。根据业务场景的不同,不同的分布式系统会根据自身业务的需求在CAP三者中进行取舍, CAP理论的意义是一种在分布式系统设计时取舍的参考因素,而非绝对的三者必舍其一。

此外,在CAP理论中是没有提到系统的时延(Latency)的,而访问时延(Latency)却是很重要的可用性(Availability)因素,因此又延申出了PACELC理论。

PACELC理论

PACELC理论是CAP理论的扩展,PACELC理论在wiki上的定义是:

It states that in case of network partitioning (P) in a distributed computer system, one has to choose between availability (A) and consistency (C) (as per the CAP theorem), but else (E), even when the system is running normally in the absence of partitions, one has to choose between latency (L) and consistency (C).

意思就是:

如果有分区partition (P),系统就必须在availability 和consistency (A and C)之间取得平衡; 否则else (E) 当系统运行在无分区情况下,系统需要在 latency (L) 和 consistency (C)之间取得平衡

如下图,在PACELC里添加了Latency要素:

cap-pacelc

当前分布式系统设计指导理论应当采用PACELC理论替代CAP理论,理由如下:

  • PACELC更能满足实际操作中分布式系统的工作场景是更好的工程实现策略;

  • 当partition (P)存在的场景下,需要在availability 和consistency (A and C)之间取舍,但是实际上分布式系统中绝大多数时间里partition (P)是不存在的,那么就需要在latency (L) 和 consistency (C)之间作取舍;

  • Availability在不存在partition (P)的场景下跟 latency关联,在partition (P)时跟”可靠性“指标相关联;

  • PACELC 可以在 latency 与 consistency之间获得平衡;

  • CAP 理论忽略了 一致性和时延之间的取舍;

PACELC理论是建立在CAP理论之上的,二者都描述了一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)之间的约束与取舍。而PACELC理论则更进一步描述了即使在没有Partition的场景下,也存在Latency和Consistency之间的取舍,从而为分布式系统的Consistency模型提供了一个更为完整的理论依据。

理论应用

要保证系统数据的高可用(high availability)那么有个技术方案是采用数据冗余备份的方式,那么就涉及到复制数据,而进行分布式系统的数据复制,就会出现在Consistency和Latency之间做个取舍的要求。举个例子,如下图所示:

consistency-latency

在强一致性复制场景下,需要三副本都下盘才能返回OK确认信息给client端,假设Master节点向 Slave 节点复制数据,时延的限制是 20ms,有时候,slave 2 硬盘或网络出现故障,Master 往 Slave 复制数据的时延超过 了20ms,这个时候如果还一直等待 slave 2 返回结果再通知给client就会出现性能和时延抖动,而且这种抖动是经常会发生的长尾效应。

依据PACELC理论,我们可以在 consistency和Latency之间做个取舍,比如 slave 2 节点的时延超过 20ms了,就不等待slave 2 返回,master 和 slave 1 返回结果给client即可,如果 slave 2 出现 超时的 次数超过 5次那么就认为 这个节点可能出现故障,打个故障标签,进行后续的处理。采用这种方式可以消除写时的长尾抖动,获得更优雅的写时性能曲线。

小结

本文遵循理论与实践相结合的指导思想讲述了CAP理论与PACELC理论。日拱一卒,功不唐捐,分享是最好的学习,与其跟随不如创新,希望这个知识点对大家有用。另作者能力与认知都有限,”我讲的,可能都是错的“,欢迎大家拍砖留念。

作者简介

常平,中国科学技术大学硕士研究生,深度学习首席软件主管工程师,前EMC 大数据资深首席工程师,主要从事Linux内核以及分布式产品的架构设计、开发以及交付工作。

参考文献

[1] https://en.wikipedia.org/wiki/PACELC_theorem

[2] CAP理论与分布式系统设计,S先生

版权申明

本文的版权协议为 CC-BY-NC-ND license:https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh

在遵循署名、非商业使用(以获利为准)以及禁止演绎的前提下可以自由阅读、分享、转发、复制、分发等。