数据工程cap定理初学者指南(图解CAP定理)
数据工程cap定理初学者指南(图解CAP定理)分区容错性是指,当节点间出现网络分区的时候,系统仍然可以正常提供服务。接下来的可用性和分区容错性就比较好理解了。可用性就是说,客户端向其中一个节点发起一个请求,且该节点正常运行无故障,那么这个节点最终必须响应客户端的请求。为了便于理解,举一个具体的例子。考虑一个非常简单的分布式系统,它由两台服务器Node1和Node2组成,这两台服务器都存储了同一份数据的两个副本,我们可以简单认为这个数据是一个键值对,初始的记录为V=0。服务器Node1和Node2之间能够互相通信,并且都能与客户端通信。这个例子如图3-17所示。现在客户端向Node1发送写请求V=1。如果Node1收到写请求后,只将自己的V值更新为1,然后直接向客户端返回写入成功的响应,这时Node2的V值还是等于0,此时客户端如果向Node2发起了读V的请求,读到的将是旧的值0。那么,此时这两个节点是不满足一致性的。如果Node1先把
CAP定理也叫布鲁尔定理(Brewer's Theorem),是2000年由加州大学伯克利分校(University of California Berkeley)的计算机科学家埃里克·布鲁尔(Eric Brewer)在分布式计算原理研讨会(PODC)上提出的一个猜想。虽然当时就命名为“CAP定理”,但还未被证实。
两年后,麻省理工学院的Seth Gilbert和Nancy Lynch教授证明了布鲁尔的猜想,CAP定理正式诞生。
CAP定理指出在一个异步网络环境中,对于一个分布式读写存储(Read-Write Storage)系统来说,只能满足以下三项中的两项,而不可能满足全部三项:
- 一致性(Consistency)。
- 可用性(Availability)。
- 分区容错性(Partition Tolerance)。
一致性可以这么理解,客户端访问所有节点,返回的都是同一份最新的数据。可用性是指,每次请求都能获取非错误的响应,但不保证获取的数据是最新数据。分区容错性是指,节点之间由于网络分区而导致消息丢失的情况下,系统仍能继续正常运行。需要强调的是,这里的一致性是指线性一致性,至于什么是线性一致性,我们会在3.7节中详细解释。这里读者只需要理解为,对于单个对象,读操作会返回最近一次写操作的结果,这也叫线性一致性读。
为了便于理解,举一个具体的例子。考虑一个非常简单的分布式系统,它由两台服务器Node1和Node2组成,这两台服务器都存储了同一份数据的两个副本,我们可以简单认为这个数据是一个键值对,初始的记录为V=0。服务器Node1和Node2之间能够互相通信,并且都能与客户端通信。这个例子如图3-17所示。
现在客户端向Node1发送写请求V=1。如果Node1收到写请求后,只将自己的V值更新为1,然后直接向客户端返回写入成功的响应,这时Node2的V值还是等于0,此时客户端如果向Node2发起了读V的请求,读到的将是旧的值0。那么,此时这两个节点是不满足一致性的。
如果Node1先把V=1复制给Node2,再返回客户端,那么此时两个节点的数据就是一致的。这样,无论客户端从哪个节点读取V值,都能读到最新的值1。此时系统满足一致性(在3.7节中我们会给出一致性的严格定义)。
接下来的可用性和分区容错性就比较好理解了。可用性就是说,客户端向其中一个节点发起一个请求,且该节点正常运行无故障,那么这个节点最终必须响应客户端的请求。
分区容错性是指,当节点间出现网络分区的时候,系统仍然可以正常提供服务。
为什么CAP定理说一个系统不能同时满足一致性、可用性和分区容错性?这里给出简要的证明。
我们使用反证法证明。假设存在一个同时满足这三个属性的系统,我们第一件要做的事情就是让系统发生网络分区,就像图3-18中的情况一样,服务器Node1和Node2之间的网络发生故障导致断开连接。
客户端向Node1发起写请求,将V的值更新为1,因为系统是可用的,所以Node1必须响应客户端的请求,但是由于网络分区,Node1无法将其数据复制到Node2,如图3-19所示。
接着,客户端向服务器Node2发起读V的请求,再一次因为系统是可用的,所以Node2必须响应客户端的请求。还是因为网络分区,Node2无法从Node1更新V的值,所以Node2返回给客户端的是旧的值0,和客户端刚才写入的V的值不同,如图3-20所示。
这显然违背了一致性,因此证明不存在这样的系统。
CAP定理的重要意义在于,它帮助软件工程师在设计分布式系统时,施加基本的限制,不必浪费时间去构建一个完美的系统。软件工程师应该意识到这些特性需要进行取舍,进而选择适合的特性来开发分布式系统。
内容摘自《深入理解分布式系统》,作者唐伟志,曾任网易游戏、腾讯基础架构工程师。毕业后一直从事分布式系统相关工作,在知乎和公众号“多颗糖”上分享对分布式系统论文的解读和算法的讲解。开源爱好者、TiDB Reviewer和Kubernetes Contributor。
面向初学者:通过理论和实践结合的方式介绍分布式系统,帮助读者夯实分布式基础知识;
面向实践者:实现简单的Paxos共识算法,分析HDFS、ZooKeeper、etcd、Kubernetes等分布式系统案例。