用太极拳讲分布式理论,真舒服!
背景:倚天屠龙记中赵敏郡主携带一帮高手围攻武当,武当派掌门张三丰被暗算,传了一套武功给张无忌用来对付赵敏的手下。这套武功就是太极拳。
张三丰:无忌,你可记得多少招式?
张无忌:我全忘了!
张三丰:很好,你只要记住把玄冥二老打趴下就可以了。
上篇用三国杀讲分布式中的拜占庭将军问题,还挺有意思的,这次我们用倚天屠龙记中的太极拳来聊下剩下的三大理论:
CAP 理论
ACID 理论
BASE 理论
太极拳的精髓:以柔克刚,刚柔并进,四两拨千斤,无招胜有招。
我把 CAP 理论称作太极,ACID 理论称为阳或刚,BASE 理论称为阴或柔。ACID 理论追求一致性,BASE 理论本来就叫做柔性事务,追求的是可用性。那张无忌为什么会全忘了还打败了玄冥二老呢?因为太极拳的精髓是拳意,无招胜有招。
一、太极的两面CAP 理论是对分布式系统的特性做了一个高度的抽象,变成了三大指标:
一致性(Consistency)
可用性(Availability)
分区容错性(Partition Tolerance)
分布式中的一致性,我们可以理解为客户端的每次读操作,不管访问的是哪个几点,要么督导的都是同一份最新写入的数据,要么读取失败。这就很刚了,不能说这种刚不好,在很多场景中,也确实需要保证高度的一致性。
为了帮助大家理解一致性,我举个倚天屠龙记的故事:六大派围攻光明顶。
峨眉派灭绝师太作为统领,带领江湖六大派围攻光明顶,最开始的进攻策略是从北边进攻。灭绝师太发现从北边进攻不妙,于是飞鸽传书给武当派和少林派从南边进攻的命令,但是少林派的飞鸽被明教轻功绝顶的青翼蝠王韦一笑截获了,最后的结果是少林派从北边进攻,武当派从南边进攻,这不就乱套了吗?如下图所示: 1.1 理解分布式中的 CAP
CAP 放到分布式系统中该如何理解呢?下面举个例子帮助大家理解。
初始环境:客户端查询或更新节点 1 和 节点 2,两个节点存的值 A = 1。
客户端更新节点 1 中 A 的值,设置 A = 5。
节点 1 将 A 的值更新为 5 后,返回更新成功给客户端。
客户端访问到了节点 2 ,请求获取 A 的值,结果返回 A = 1。这和节点 1 中存储的 A 的值就不一致了。
那么怎么保证两个节点中的值都是 A = 5 呢?客户端将节点 1 更新后,节点 2 也需要更新,才能告诉客户端更新成功了。
两个节点都更新成功后,客户端访问其中任意一个节点获取到的都是 A = 5。这个就叫做一致性。
一致性强调的是数据正确,每次读取节点中的数据都是最新写入的数据。这个我称作刚。
但是我们生产的集群环境下如果发生分区故障时(节点失联,节点无法响应,节点无法写入数据),客户端查询节点时,我们不能返回错误信息给客户端。比如说业务集群中的一些关键系统,如注册中心,不能因为某个节点失联了,就不响应最新的数据。那么相关的业务也获取不到正确的注册信息而导致系统瘫痪。
可用性就派上用场了,牺牲数据准确性,每个节点使用本地数据来响应客户端的请求。另外当节点不可用时,可以使用快速失败策略,至少不能让服务长时间不能响应可用性强调的是服务可用,不保证数据正确。这个我称作柔。