分布式理论之CAP定理

CAP 定理

CAP 定理介绍

CAP 定理(CAP Theorem),又称布鲁尔定理(Brewer’s throrem)。它指出,对一个分布式系统来说,不可能同时满足以下三点:

选项 具体意义
一致性(Consistency) 所有节点访问时都是同一份最新的数据副本
可用性(Availability) 每次请求都能获取到非错的响应,但是不保证获取数据为最新数据
分区容错性(Partition tolarence) 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境发生了故障
  • 一致性(Consistency)- C

    指的是强一致性

    在写操作完成后开始的任何读操作都必须返回该值,或者后续写操作的结果。

    就是说,在分布式系统中,一旦客户端将值写入任何一台服务器并获得相应,那么之后 client 从其他服务器读取的都是刚写入的数据。

image-20220317230127717

  • 客户端向 G1 写入数据,并等待响应

  • 此时,G1 服务器的数据是 v1,G2 服务器的数据是 v0,不一致

  • 在返回数据到客户端之前,G2 服务器会自动同步 G1 服务器的数据,使 G2 服务器的数据也是 v1

  • 一致性保证了,不管向哪台服务器(比如 G1)写入数据,其他服务器都能实时同步数据

  • G2 已经同步了 G1 的数据,会告诉 G1,我已经同步了

  • G1 接收了同步的报告,将”写入成功“的信息返回给 client

  • client 在发起请求,读取 G2 的数据

  • 此时读取到的响应值是 v1

  • 可用性(Availability)- A

    系统中非故障性节点的每个请求都必须有响应。

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

  • 分区容错性(Partition tolarence) - P

    允许网络丢失从一个节点到另一个节点的任意条消息,即不同步。

    就是说,G1 和 G2 发送给客户端的任意消息都可以放弃。

    G1 和 G2 可能会因为各种意外状况,导致无法成功同步,分布式系统能容忍这种情况。

image-20220317232109808

CAP 三者不能同时满足结论

假设存在三者都能满足的系统

1、那么做的第一件事就是分区我们的系统,由于满足分区容错性,也就是说,可能因为网络通信不佳,导致 G1 和 G2 不同步

image-20220317233342357

2、接下来,我们的客户端将 v1 写入 G1,但是 G1 和 G2 之间是不同步的,所以如下,G1 是 v1 的数据,G2 是 v0 的数据

image-20220318095813714

3、由于要满足可用性,即一定要返回数据,所以 G1 必须在数据没有同步给 G2 的前提下返回数据给 client,如下

image-20220318101516244

接下来,client 请求的是 G2 服务器,由于 G2 服务器的数据是 v0,那么 client 得到的数据也是 v0

image-20220318101730019

结论:G1 返回的是 v1 的数据,G2 返回的是 v0 的数据,不满足 C。因此得证,CAP 不可能同时出现。

image-20220318102130059

CAP 三者如何平衡

三选二利弊如何
  • CA(Consistency + Availability),关注一致性和可用性,他需要非常严格的全体一致性协议。

    CA 系统不能容忍网络错误或者节点错误,一旦出现这样的问题,系统就会拒绝写请求。

    因为它并不知道哪个节点挂掉了或者只是网络故障问题。

    唯一安全的做法是把自己变成只读的。

image-20220318102935087

  • CP(Consistency + Pattition tolerance),关注一致性和分区容错性。他关注的是系统中大部分人的一致性协议。这种系统只需要保证大多数节点数据一致,少数节点在没有同步到最新数据时,变成不可用状态。

    这样能够提供一部分可用性。

image-20220318103603711

  • AP(Availability +Pattition tolerance),关系可用性和分区容错性。

    这样的系统不能保证一致性,需要给出数据冲突,给出数据冲突就需要维护数据版本。

image-20220318105221075

三选二如何选择

放弃了一致性,满足容错,那么节点之间可能失去联系,为了高可用,每个节点只能使用本地数据提供服务,而这样容易导致全局不一致性。

对于互联网应用来说,机器数量庞大,节点分散,网络故障很正常,此时就是保障 AP,放弃 C 的场景。实际理解就是,网站偶尔没有一致性是可以接受的,但是不能访问问题就很大。

image-20220318105337120

对于银行来说,C 必须存在,那么只能用 CA 和 CP 两种情况。当保障一致性和可用性时(CA),那么一旦出现通信故障,系统将完全不可用。如果保障了一致性和分区容错性(CP),那么就具备了部分可用性。需要根据实际情况抉择,如果只是查看不做更新,那么不如直接拒绝服务。

image-20220318110449358

作者

Terwer

发布于

2022-04-28

更新于

2023-08-27

许可协议

评论