zoukankan      html  css  js  c++  java
  • CAP定理详解

    CAP定理是在分布式系统中的一个基本定理,指出任何分布式系统最多可以有以下三个属性。
    一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
    可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
    分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

    本指南将通过图片总结 吉尔伯特和林奇的规范以及CAP定理的证明

    什么是CAP定理?

    CAP定理指出,分布式系统不能同时保持一致,可用和分区容忍。听起来很简单,但是保持一致意味着什么?可用的?分区容忍?哎呀,分布式系统到底意味着什么?

    在本节中,我们将介绍一个简单的分布式系统,并说明该系统具有可用性,一致性和分区容忍性。有关系统和三个属性的正式说明,请参阅 Gilbert和Lynch的论文

    分布式系统

    让我们考虑一个非常简单的分布式系统。我们的系统由两台服务器组成,G1 和 G2。这两个服务器都在跟踪相同的变量v,其值最初是 v0。 G1 和 G2 可以相互通信,也可以与外部客户端通信。这是我们的系统的外观。

    img

    客户端可以请求从任何服务器进行写入和读取。服务器收到请求后,将执行所需的任何计算,然后响应客户端。例如,这个是write看到的样子。

    img img img

    这个是read看到的样子。

    img img

    现在我们已经建立了系统,接下来让我们了解一下对于系统一致行,可用行和分区容忍分性在整个系统中意味着什么。

    一致性

    这是Gilbert和Lynch描述一致性的方式。

    在write操作完成之后开始的任何read操作都必须返回该值。

    在一致的系统中,客户端将值写入任何服务器并获得响应后,它期望从其读取的任何服务器取的值都是一致的。

    这是一个不一致的系统的示例。

    img img img img img

    我们的客户端发送一个写入请求将 v1 到 G1 并且 G1 接收成功,但是当它从 G2读取改值时,它将获取陈旧的数据:v0。

    另一方面,这是一个一致的 系统的示例。

    img img img img img img img img

    在这个系统中 G1 将其值复制到 G2在向客户发送确认之前。因此,当客户从G2请求改值时,它将获得最新的值 v:v1。

    可用性

    这是Gilbert和Lynch描述可用性的方式。

    系统中非故障节点收到的每个request都必须有一个response结果。

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

    分区容错性

    这是Gilbert和Lynch描述分区的方式。

    网络将被允许任意丢失从一个节点发送到另一节点的多个消息。

    这意味着任何消息 G1 和 G2可以互相发送。如果所有消息都被丢弃,那么我们的系统将如下所示。

    img

    为了容忍分区,我们的系统必须能够在任意网络分区下正常运行。如果出现分区容错性,那就说明G1和G2状态不一致。

    定理证明

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

    假设确实存在一个一致,可用且容忍分区的系统。我们要做的第一件事是对系统进行分区。看起来像这样。

    img

    接下来,我们让客户端发出写入request将v1写到G1。由于我们的系统可用,G1必须回应。但是由于网络是分区的,G1 无法将其数据复制到 G2。吉尔伯特和林奇称之为执行阶段α1。

    img img img

    接下来,我们让客户端发出读取request从 G2读取v值。同样,由于我们的系统可用,G2必须回应。由于网络是分区的,G2无法从G1中更新其值v0->v1 。它返回v0。吉尔伯特和林奇称之为执行阶段α2。

    img img

    G2 返回 v0 在客户端写入v1->G1之后。在我们外部看来,对于整个系统v存在两个版本的值v1 v2,这是不一致的。

    但是我们只是表明存在任何此类系统执行的情况,其中该系统的行为不一致。因此,不存在这样的系统。

    参考链接

    https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/
    https://en.wikipedia.org/wiki/CAP_theorem

  • 相关阅读:
    Timer 实现2秒4秒连环炸
    Java中的注解
    PHP连接打印机
    php同步mysql两个数据库中表的数据
    thinkphp 两表、三表联合查询
    ereg/eregi报错处理办法
    ThinkPHP3.2判断手机端访问并设置默认访问模块的方法
    使用PHP获取时间今天 明天 昨天 时间戳的详解
    jquery获取radio和select选中值
    php开启mysqli扩展之后如何连接数据库
  • 原文地址:https://www.cnblogs.com/O-ll-O/p/14573404.html
Copyright © 2011-2022 走看看