分布式基础-CAP定理的含义
随着微服务的发展,分布式系统(distributed system)正变得越来越重要,java后端系统多是分布式系统,很少有单机部署了。
在引入分布式系统的同时,也带来了复制性,只有了解了分布式系统的基本定理,才会明白引入分布式系统会带来哪些问题?以及如何去解决。
可以这么说,CAP定理是理解分布式系统的起点。
如果想要更深入的了解,可以参考Seth Gilbert;Nancy A. Lynch 的论文 Perspectives on the CAP Theorem。
一.分布式系统的三个指标
- Consistency(一致性)
- Availability(可用性)
- Partition tolerance(分区容错)
取首字母分别为:C、A、P,CAP定理简单的说,就是分布式系统不能同时满足三个指标。
1.1 Partition tolerance(分区容错)
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。
Partition tolerance 的含义是:区间通信可能失败,比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。
对于分布式系统,区间通信无法保证一定成功,分区容错无法避免。即CAP中的P一定存在,CAP定理告诉我们,剩下的C和A,无法同时成立。
1.2 Consistency(一致性)
Consistency的含义是:在写操作之后,在访问分布式系统中任一节点查询数据的时候,都是最新的数据。
假设分布式系统中有两个节点:S1和S2,每个节点都存储一个变量V0,这时候客户端client开始对S1进行写操作,更新V0 -> V1,然后S1更新完成会通知client。
这时候,很明显是不满足一致性的,由于S2节点变量value还是V0,假如client在write操作完成之后,read操作S2节点,value还是V0,不是最新的V1。
因此为了满足一致性,S1节点在将变量V0更新为V1之前,会先锁定S2节点的读写操作,在将S1节点变量更新为V1之后,会通知S2更新变量为V1,S2更新成功会通知S1,S1在确保S1、S2节点都更新成功之后,解锁S2节点的读写操作,并返回client更新成功。
具体操作如下图所示:
此时就是满足一致性的分布式系统。
1.3 Availability(可用性)
Availability的含义是:任何时候,client向任意一个节点S1或者S2发送请求,都能立马得到响应,不管获得的数据是V0还是V1。
二.分布式系统中Consistency 和 Availability 为啥不能同时满足
一致性和可用性,为什么不可能同时成立?答案很简单,因为可能通信失败(即出现分区容错)。
如果保证 S2 的一致性,那么 S1 必须在写操作时,锁定 S2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,S2 不能读写,可用性无法满足。
如果保证 S2 的可用性,那么势必不能锁定 S2,所以一致性不成立。
综上所述,S2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。即要么AP,要么CP。
引用:
1.https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/
2.https://www.ruanyifeng.com/blog/2018/07/cap.html
3.https://blog.csdn.net/hzygcs/article/details/86534670