今天学习CAP定理(布鲁尔定理),这个2000年提出的猜想在2002年被证明,使它成为分布式计算领域公认的一个定理。这意味着只要是设计分布式系统,CAP是必须要掌握和考虑的,就好像发射卫星一定要研究和遵循宇宙第一速度定律一样。可惜一些真理用在人身上就失效了,因为很多人即使知道了真理也未必去遵循。
对于CAP,有两个版本的定义:
第一版定义:对于一个分布式计算系统,不可能同时满足一致性(consistence)、可用性(availability)、分区容错性(partition tolerance )。
第二版定义:在一个分布式系统(互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性、可用性、分区容错性三者之中的两者,另一个必须被牺牲。
第二版重点强调了互相连接和共享数据,因为分布式系统不一定会互相连接和共享数据,比如memcache集群,相互之间就没有连接和共享数据,因此这类分布式系统不符合CAP理论探讨的对象,对于mysql集群来说是需要互联和进行数据复制的,因此符合这个理论的对象。
第二版还强调了读写操作,那么意思是说CAP不涉及所有操作,只关注对数据的读写,比如一些选举操作就不是CAP 探讨的对象。
有了上面精确的范围和对象限定,我想到了"鱼和熊掌不可兼得",想到了"因地制宜"。和人生一样,我们也要学会取舍:当家庭、事业、健康、财富发生失衡的时候要取舍。
一致性
含义:
第一版:所有的节点在同一时刻都能看到相同的数据。
第二版:对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。
差异:
第一版从节点的角度描述,第二版从客户端的角度描述,视角不同,世界不同。
第一版的关键字是看到,其实本质上就是节点要拥有数据,第二版从客户端的读写角度来描述一致性,定义更加精确。
就像左手指月一样,相同的真理需要大量的解释,而真理很难被简单的诠释出来。
可用性
第一版含义:每个请求都能得到成功或失败响应。
第二版含义:非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。
分区容忍性
第一版解析:尽管出现消息丢失或分区错误,但系统能够继续运行。
第二版解析:当出现网络分区后,系统能够继续"履行工作"。
上面看起来就是带病工作呗。
CAP的应用
CAP理论定义三个要素中只取两个,但是放到分布式环境下,我们会发现必须选择P(分区容忍)要素,因为网络本身无法100%可靠。因为这个原因,CA这个组合基本排除了,只考虑CP或AP架构。
CAP细节
1.CAP关注的粒度是数据,而不是整个系统。
2.CAP是忽略网络延迟的。