分布式理论之CAP定理
CAP 定理
CAP 定理介绍
CAP 定理(CAP Theorem),又称布鲁尔定理(Brewer’s throrem)。它指出,对一个分布式系统来说,不可能同时满足以下三点:
选项 | 具体意义 |
---|---|
一致性(Consistency) | 所有节点访问时都是同一份最新的数据副本 |
可用性(Availability) | 每次请求都能获取到非错的响应,但是不保证获取数据为最新数据 |
分区容错性(Partition tolarence) | 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境发生了故障 |
一致性(Consistency)- C
指的是强一致性
在写操作完成后开始的任何读操作都必须返回该值,或者后续写操作的结果。
就是说,在分布式系统中,一旦客户端将值写入任何一台服务器并获得相应,那么之后 client 从其他服务器读取的都是刚写入的数据。
客户端向 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 可能会因为各种意外状况,导致无法成功同步,分布式系统能容忍这种情况。
CAP 三者不能同时满足结论
假设存在三者都能满足的系统
1、那么做的第一件事就是分区我们的系统,由于满足分区容错性,也就是说,可能因为网络通信不佳,导致 G1 和 G2 不同步
2、接下来,我们的客户端将 v1 写入 G1,但是 G1 和 G2 之间是不同步的,所以如下,G1 是 v1 的数据,G2 是 v0 的数据
3、由于要满足可用性,即一定要返回数据,所以 G1 必须在数据没有同步给 G2 的前提下返回数据给 client,如下
接下来,client 请求的是 G2 服务器,由于 G2 服务器的数据是 v0,那么 client 得到的数据也是 v0
结论:G1 返回的是 v1 的数据,G2 返回的是 v0 的数据,不满足 C。因此得证,CAP 不可能同时出现。
CAP 三者如何平衡
三选二利弊如何
CA(Consistency + Availability),关注一致性和可用性,他需要非常严格的全体一致性协议。
CA 系统不能容忍网络错误或者节点错误,一旦出现这样的问题,系统就会拒绝写请求。
因为它并不知道哪个节点挂掉了或者只是网络故障问题。
唯一安全的做法是把自己变成只读的。
CP(Consistency + Pattition tolerance),关注一致性和分区容错性。他关注的是系统中大部分人的一致性协议。这种系统只需要保证大多数节点数据一致,少数节点在没有同步到最新数据时,变成不可用状态。
这样能够提供一部分可用性。
AP(Availability +Pattition tolerance),关系可用性和分区容错性。
这样的系统不能保证一致性,需要给出数据冲突,给出数据冲突就需要维护数据版本。
三选二如何选择
放弃了一致性,满足容错,那么节点之间可能失去联系,为了高可用,每个节点只能使用本地数据提供服务,而这样容易导致全局不一致性。
对于互联网应用来说,机器数量庞大,节点分散,网络故障很正常,此时就是保障 AP,放弃 C 的场景。实际理解就是,网站偶尔没有一致性是可以接受的,但是不能访问问题就很大。
对于银行来说,C 必须存在,那么只能用 CA 和 CP 两种情况。当保障一致性和可用性时(CA),那么一旦出现通信故障,系统将完全不可用。如果保障了一致性和分区容错性(CP),那么就具备了部分可用性。需要根据实际情况抉择,如果只是查看不做更新,那么不如直接拒绝服务。