前言
众所周知,CAP理论是架构师在设计分布式系统过程中,处理数据一致性问题时必须考虑的基石级理论(圣经级的,^V^)。大意是说,在分布式网络分区环境中,数据的一致性、可用性和分区容忍性三者之间,至多只能保证两者,无法三者同时保证。对于CAP理论,个人刚接触时感觉很容易理解,不就是讲的一个在分布式环境下鱼和熊掌不能兼得的问题吗?诚然,如果从直观上泛泛而谈,的确不难,即在多节点的网络环境中,当要求数据强一致性时,一定会牺牲掉可用性,反之亦然。
然而,在最近的一次公司内部技术分享会上,一个同事问我,能不能顺便通俗易懂地给大家讲一下关于CAP理论如何理解?我随即问了在场的其他几个同事,大家也认为可以给大家仔细讲一下,原因是大家对CAP理论的理解基本也处于是懂非懂的状况。最先提问的同事的问题点在于,大家普遍认为关系型数据库多采用CA,而NoSql多采用AP,然而为什么大多数关系型数据库又支持Master-Slave式的分区复制功能呢?难道关系型数据库是CAP理论的一个例外?
理解第一步:分布式是前提
为了彻底讲清楚这个问题,首先需要明白的是,CAP理论的主要场景是在分布式环境下,在单机环境下,基本可不考虑CAP问题。如果不明白什么是分布式场景,请看下面这张图(此图借用自如何正确理解CAP理论一文)。图中除最上面那台标记为“客户端”电脑以外的部分(包括横着的那根粗线,以及A\B\C三个节点)共同组成了一个分布式系统。
理解第二步:C、A、P准确定义
其次,需要搞清楚Eric Brewer大神对CAP三者的准确定义。这里借用一下维基百科CAP理论一文中关于C、A、P三者的定义。(其实也试图想参考国人的某百科,但发现貌似仍然讲得不清不楚)。
Consistency | Availability | Partition tolerance |
---|---|---|
Every read receives the most recent write or an error | Every request receives a (non-error) response – without guarantee that it contains the most recent write | The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes |
三者的定义及个人理解如下:
Consistency:一致性,原文翻译过来是说,对于任何从客户端发达到分布式系统的数据读取请求,要么读到最新的数据要么失败。换句话说,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据,不难看出,其强调的是数据正确。
Availability:可用性,原文翻译过来是说,对于任何求从客户端发达到分布式系统的数据读取请求,都一定会收到数据,不会收到错误,但不保证客户端收到的数据一定是最新的数据。换句话说,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:我一定会给您返回数据,不会给你返回错误,但不保证数据最新,强调的是不出错。
Partition tolerance:分区容忍性,这个词有点怪,如果直接看中文的确有点不太好理解。那么看原文翻译怎么说的,分布式系统应该一直持续运行,即使在不同节点间同步数据的时候,出现了大量的数据丢失或者数据同步延迟。
(PS:^V^,您瞧瞧,包容度多高,简直是打不死的小强,现在应该能够理解为什么用tolerance容忍度这个词了吧。)
换句话说,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:我会一直运行,不管我的内部出现何种数据同步问题,强调的是不挂掉。
理解第三步:串起来,So easy
搞明白三个字母的准确含义之后,结合到上面那张图,应该比较容易理解了。
对于一个分布式系统而言,P是前提,必须保证,因为只要有网络交互就一定会有延迟和数据丢失,这种状况我们必须接受,必须保证系统不能挂掉。试想一下,如果稍微出现点数据丢包,我们的整个系统就挂掉的话,我们为什么还要做分布式呢?所以,按照CAP理论三者中最多只能同时保证两者的论断,对于任何分布式系统,设计时架构师能够选择的只有C或者A,要么保证数据一致性(保证数据绝对正确),要么保证可用性(保证系统不出错)。
PS:其实维基百科的原文里面也有这么一段,说的也是上面的意思,我就不翻译了:
CAP is frequently misunderstood as if one has to choose to abandon one of the three guarantees at all times. In fact, the choice is really between consistency and availability only when a network partition or failure happens; at all other times, no trade-off has to be made.
结语
最后回答一下本文开头俺的同事关于关系数据库的问题,个人理解,其实关系型数据库同时保证CA时,指的并非是分布式环境下,简单地说就是单机环境下。如果在Master-Slave类复制式分布式环境下,默认保证的是CP,用过Mysql Master-Slave或者Mssql的复制-订阅模式的同仁应该知道,一旦主从机数据复制时出错,出现数据不一致的情况,必须人工干预或者重新同步。
注:如有更多疑问,欢迎加私友一起探讨学习,我的联系方式可在脑链网上找到