分区容错性是什么意思_一篇文章搞清楚什么是分布式系统 CAP 定理

专注于Java领域优质技术号,欢迎关注

来自:小旋锋

CAP定理是分布系统中的一个基本定理,它指出任何分布系统最多可以具有以下三个属性中的两个。

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

本文将以图解的形式简明地对 Gilbert and Lynch's specification and proof of the CAP Theorem (CAP定理的规范和证明) 进行概括总结

什么是 CAP 定理?

CAP定理指出分布式系统不可能同时具有一致性、可用性和分区容错性。听起来很简单,但一致性、可用性、分区容错性到底是什么意思呢?确切地来说分布式系统又意味着什么呢?

在本文中,我们将介绍一个简单的分布式系统,并对分布式系统的可用性、一致性和分区容错性进行诠释。有关分布式系统和这三个属性的正式描述,请参阅 Gilbert 和 Lynch 的论文。

分布式系统

让我们来考虑一个非常简单的分布式系统,它由两台服务器G1和G2组成;这两台服务器都存储了同一个变量v,v的初始值为v0;G1和G2互相之间能够通信,并且也能与外部的客户端通信;我们的分布式系统的架构图如下图所示:

e13ade4f05fcc067494f9fadf8e1b12f.png

一个简单的分布式系统

客户端可以向任何服务器发出读写请求。服务器当接收到请求之后,将根据请求执行一些计算,然后把请求结果返回给客户端。譬如,下图是一个写请求的例子:

44dc21effd55970ef677eb9ba45f0d64.png

客户端发起写请求

接着,下图是一个读请求的例子

93ff217fb8c1c21da1e9be6eaedf44a3.png

客户端发起读请求

现在我们的分布式系统建立起来了,下面我们就来回顾一下分布式系统的可用性、一致性以及分区容错性的含义。

一致性 (Consistency)

Gilbert 和 Lynch 在论文中的描述是:

any read operation that begins after a write operation completes must return that value, or the result of a later write operation

也就是说,在一个一致性的系统中,客户端向任何服务器发起一个写请求,将一个值写入服务器并得到响应,那么之后向任何服务器发起读请求,都必须读取到这个值(或者更加新的值)。

下图是一个不一致的分布式系统的例子:

d909be52f2801e6bf2660b9b5efe02f3.png

不一致的分布式系统

客户端向G1发起写请求,将v的值更新为v1且得到G1的确认响应;当向G2发起读v的请求时,读取到的却是旧的值v0,与期待的v1不一致。

下图一致的分布式系统的例子:

9ff44a51a8391c32975af010d5fd08bc.png

一致的分布式系统

在这个系统中,G1在将确认响应返回给客户端之前,会先把v的新值复制给G2,这样,当客户端从G2读取v的值时就能读取到最新的值v1

可用性 (Availability)

Gilbert 和 Lynch 在论文中的描述是:

every request received by a non-failing node in the system must result in a response

也就是说,在一个可用的分布式系统中,客户端向其中一个服务器发起一个请求且该服务器未崩溃,那么这个服务器最终必须响应客户端的请求。

分区容错性 (Partition tolerance)

Gilbert 和 Lynch 在论文中的描述是:

the network will be allowed to lose arbitrarily many messages sent from one node to another

也就是说服务器G1和G2之间互相发送的任意消息都可能丢失。如果所有的消息都丢失了,那么我们的系统就变成了下图这样:

85f3b45610841292ae2a90c32cf869f0.png

网络分区

为了满足分区容错性,我们的系统在任意的网络分区情况下都必须正常的工作。

CAP定理的证明

现在我们已经了解了一致性、可用性和分区容错性的概念,我们可以来证明一个系统不能同时满足这三种属性了。

假设存在一个同时满足这三个属性的系统,我们第一件要做的就是让系统发生网络分区,就像下图的情况一样:

1c82dbf5a4de7000457876d2fe7be5f0.png

网络分区

客户端向G1发起写请求,将v的值更新为v1,因为系统是可用的,所以G1必须响应客户端的请求,但是由于网络是分区的,G1无法将其数据复制到G2

89e46f25570631ec13b42f1bdca14f42.png

由于网络分区导致不一致

接着,客户端向G2发起读v的请求,再一次因为系统是可用的,所以G2必须响应客户端的请求,又由于网络是分区的,G2无法从G1更新v的值,所以G2返回给客户端的是旧的值v0

c0c636e1ec61b84d8ab59776d2f277ae.png

由于网络分区导致不一致

客户端发起写请求将G1上v的值修改为v1之后,从G2上读取到的值仍然是v0,这违背了一致性。

总结

我们假设了存在一个满足一致性、可用性、分区容错性的分布式系统,但是我们展示了在一些情况下,系统表现出不一致的行为,因此证明不存在这样一个系统

对于一个分布式系统来说,P 是一个基本要求,CAP 三者中,只能根据系统要求在 C 和 A 两者之间做权衡,并且要想尽办法提升 P

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAP定理又称布鲁尔定理,是分布式系统设计中的一个基本原则。它指出,对于一个分布式系统来说,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个要素,最多只能同时满足其中的两个,无法三者兼备。 C:一致性(Consistency)指的是数据在多个副本之间是否保持一致的特性。在一个一致性的系统中,读操作总是能够读取到最新的数据,并且写操作对所有的后续读操作都是可见的。一致性往往是指强一致性,即所有节点的数据都是一致的。 A:可用性(Availability)指的是系统提供的服务必须一直处于可用状态,对于用户的请求必须保证能够得到及时的响应。在一个可用性的系统中,节点可以随时宕机,但是系统依然可以继续提供服务,只是可能会引起一些部分的延迟或者降级。 P:分区容错性(Partition tolerance)指的是系统在遇到网络分区的情况下依然能够正常工作的能力。在一个分布式系统中,节点之间的通信是基于网络进行的,网络分区是不可避免的,因此系统需要具备分区容错性来保证数据的一致性和可用性。 根据CAP定理,我们可以在设计系统时,根据实际需求选择满足其中两个要素,而舍弃另一个要素,以达到最优的系统效果。例如,互联网公司的大型分布式系统往往更注重可用性和分区容错性,而牺牲一致性;而银行等金融机构则更注重一致性和分区容错性,而牺牲可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值