系统化的学习技术、研究技术而不是使用技术

了解CAP定理

2018/11/22 17:17:29 | 浏览(17) 分布式

分布式系统正变得越来越重要,大型网站几乎都是分布式的。 分布式系统存在一个最大的难点,就是各个节点的状态如何同步。要解决这个问题,就必须提到分布式系统的一个基本定理--CAP定理。

一、什么是CAP定理

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance(分区容错)

他认为任何分布式系统最多满足这三个特性中的两个,用图形表示就是这样:

CAP定理

二、分区容错(Partition Tolerance)

大多数分布系统存在多个子网络,每个子网络就叫做一个区(partition)。分区容错的意思是允许网络通信存在失败。比如两台服务器G1和G2,如果二者通信另一方是可能收不到的,系统设计的时候必须考虑到这种情况。

如果在网络出错,消息丢失的情况下,系统如果还能正常工作,就是有比较好的分区容错性。

image

一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

三、一致性(Consistency)

一致性的意思是,在写操作之后的读操作,必须返回该值。在一致的系统中,一旦客户端将值写入任何服务器并获得响应,它就会从其读取的任何服务器获得该值(或更新的值)。

举例来说,某条数据的值为v0,将新值v1写入到G1后,再从G2读取,得到的应该是新值v1,这就是一致性。

在这个系统中,首先是写操作,客户端将新值v1更新到G1,G1将新值v1同步到G2,G2返回响应给G1,G1返回响应给客户端;然后客户端访问G2进行读操作,此时获得的是新值v1。

四、可用性(Availablity)

系统中非故障节点收到的每个请求都必须产生响应。

在可用系统中,如果我们的客户端向服务器发送请求并且服务器未崩溃,则服务器必须最终响应客户端。不允许服务器忽略客户端的请求。

五、一致性和可用性的矛盾

一致性和可用性,为什么不可能同时成立?答案很简单,因为可能通信失败(即出现分区容错)。

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性。

如果保证 G2 的可用性,那么势必不能锁定 G2,一致性不成立。

所以,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

六、如何选择CP和AP

I、可用性高于一致性(AP without C)

以12306为例,当你在买票的时候,提示是有余票的,但当你下单后,系统可能会提示你余票不足,下单失败。这其实就是先在可用性方面保证了系统可以正常的服务,然后在数据的一致性方面做了牺牲。

对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证P和A,舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。

II、一致性高于可用性(CP without A)

无论是像Redis、HBase这种分布式存储系统,还是像Zookeeper这种分布式协调组件。数据的一致性是它们最基本的要求。
如果一个分布式系统不要求强的可用性,即容许系统停机或者长时间无响应的话,就可以在CAP三者中保障CP而舍弃A。

总的来说,在设计或开发分布式系统的时候,不可避免的要在CAP中做权衡。需要根据自己的系统的实际情况,选择最适合自己的方案。

参考资料

留言(1)

222@2018/10/30 18:10:19

棒棒的

给我留言