之前对CAP理论一直不太清楚,尤其是对分区容忍性(之前一直以为是叫分区容错性)没有一个正确的认知。通过查阅资料,现在对CAP理论有了一个新的认知。
从分区容忍性开始思考
分区容忍性,此前一直以为是叫分区容错性,所以不太明白这个性质到底是什么,错应该指的是网络场景下的消息丢失或者部分节点机器的不可预知错误,那容错是如何实现的呢?
从分布式系统的角度思考
其实所谓的容错是不存在的,只有对分区的容忍。从分布式系统的演进来思考这个理论。原本的系统是单机系统,所有的程序或应用部署在一台机器上,这时候就不存在分区的问题,并且由于是一台机器,可以比较容易实现当前条件下的高可用。同样,由于数据只有一份,也不存在一致性问题。
但是逐渐单机系统已经不能满足大量请求场景的需求,我们开始出现集群部署。刚开始集群也是在同一个局域网下,不考虑网线断开这种小概率物理故障的发生,并且有类似nginx这种负载均衡应用的存在,也很难出现分区的问题。
但这时候由于数据库的集群部署,就需要保持各冗余数据的一致性,此时体现出的高可用性我认为也与CAP中的高可用有区别,这里更多是负载均衡做出的贡献。
而当出现横向拓展、纵向拆分,并且服务器分布在各地通过网络连接的分布式系统时,我们理解的CAP理论(分区容忍性、高可用性、强一致性三者不可兼得)才有了意义。
分区容忍性是不可避免的!现在的分布式应用都是AP或者CP的实现,就是因为分区容忍性是必须有的,如果不容忍分区,就只能将整个系统部署在一个局域网下,不通过网络传输数据,就可以不容忍分区了。但这与分布式系统出现的初衷是违背的,因此P这个点必须有!
场景:
那为什么在P存在的基础上,必须在C和A当中选一个呢?我们假设一个场景:当两个请求p(写操作)、q(读操作)对同一个数据D进行操作,nginx 将p请求分发给web服务器A,将q请求分发给web服务器B。A将p通过zookeeper注册中心发送给M服务器并正常响应,这时数据D的所有冗余还没有同步,B将q发送给N服务器等待响应(M、N连接的不是同一个数据冗余)。
这时系统有两种选择,第一种,高可用,N直接将未同步的冗余响应给q;第二种,强一致,N等待冗余同步完毕后再将结果响应给q。第一种情况就是满足AP的应用,第二种情况就是满足CP的应用。
结论:
简而言之,现在的分布式系统架构是基于网络的,而网络存在不确定性,因此分区容忍性无法拒绝。在此基础上,确保读\写请求数据的所有冗余是一致的就是CP应用;确保迅速响应(哪怕结果并不正确)就是AP应用。
(本人愚见,如有错误,欢迎指出)