CAP和BASE理论可以说是分布式系统的基础理论了,只要面试的时候遇到分布式的问题,基本上都会问到这两个理论 。但是好多没毕业的同学,或者参加工作时间不长的同学,可能没有在实际开发中接触过分布式系统,这种情况我的建议是多看优质博客,自己多思考,然后找一些开源的项目看一下理论的实际运用 。当然有相关经验的同学也可以复习巩固一下 。
一、CAP定理
CAP定理又被称为布鲁尔定理,是加州大学计算机科学家埃里克·布鲁尔提出来的猜想,后来被证明成为分布式计算领域公认的定理 。不过布鲁尔在出来CAP的时候并没有对CAP三者(Consistency,AvAIlability,Partition tolerance)进行详细的定义,所以在网上也出现了不少对CAP不同解读的声音 。
CAP定理在发展中经历过两个版本,后一个版本比较完善,我们以第二个版本为准:在一个分布式系统中(指互相连接并共享数据的节点集合)中,当涉及到读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲 。
其中的关系如下图所示:
文章插图
为了方便理解,我们先用相对通俗的语言来解释一下一致性、可用性、分区容错性的具体体现是什么,也就是保证的到底是什么 。
一致性(Consistence) , 这个是针对数据来说的,比如数据库MySQL中的数据,一个分布式系统中,某个节点修改了一个数据,那么之后其他所有节点读取这条数据的时候,得到的一定是最新的数据 。
可用性(Availability),分布式系统中某些节点挂掉了,但是不会影响整体的业务,比如 C 这个微服务,有10个实例组成一个集群,其中5个挂了,另外5个正常,这种情况下整个系统还是可用的,不会因为挂了那5个,导致系统整体不可用 。
分区容错性(Partition Tolerance),分布式系统出现网络分区的时候,仍然能够对外提供服务 。
什么是网络分区?
分布式系统中,多个节点之前的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)某些节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区 。
文章插图
1.1只能三选二?
我在网上看了一些博客,有些说这三个特性只能三选二,不可能同时满足 。这其实是一个具有误导性质的说法 。
因为在分布式系统中,网络不是100%可靠的,网络分区是必选项,也就是P是必选的,如果我们不选P,选CA,这个时候如果网络发生了分区,那么为了保证C,系统就会禁止写入数据,这样就与A产生了冲突,如果为了保证A,那么正常的分区可以写入数据,有故障的分区就不能写入了,这就与C产生了冲突 。
简单来说,就是P是必须要实现的,因为网络不是100%可靠的,在此基础上C 和 A 二选一组成 CP 或者 AP 架构 。
比如Zookeeper 是CP架构,Eureka是AP架构,Nacos 不仅支持 CP 架构也支持 AP 架构 。
对于服务注册来说,针对同一个服务,即使注册中心的不同节点保存的服务注册信息不相同,也并不会造成灾难性的后果,对于服务消费者来说,能消费才是最重要的,就算拿到的数据不是最新的数据,消费者本身也可以进行尝试失败重试 。总比为了追求数据的一致性而获取不到实例信息整个服务不可用要好 。
所以,对于服务注册来说,可用性比数据一致性更加的重要,选择AP 。
1.2 CAP的实际应用
1.2.1 注册中心
注册中心主要做两件事:
- 服务注册:实例把自身的信息给注册中心,信息包括服务的IP地址和服务Port,以及暴露服务自身状态和访问协议信息 。
- 服务发现:实例请求注册中心,拿到想要请求的服务信息,IP+Port,就可以访问具体的实例了 。
文章插图
常见的注册中心组件有:Zookeeper、Eureka、Nacos等等,我们以Zookeeper和Eureka为例,分别说明一下CP和AP 。
Zookeeper 保证的是CP 。任何时刻对Zookeeper的读请求都能得到一致的结果,但是zookeeper不`能保证服务的可用性,比如在选举Leader的时候,或者一半以上的机器不可用,那么整个系统就是不可用状态 。
Eureka保证的是AP 。因为在设计的时候就是优先保证AP,而且Eureka集群中没有Leader节点,每个节点都是一样的,所以Eureka可以做到只要有一个节点可用,那么系统就是可用的,只不过这个节点上的数据不能保证是最新的 。
推荐阅读
- 再聊聊分布式数据库,你知道了吗?
- 分布式数据库的几个事实,你知道了吗?
- 聊聊本地缓存和分布式缓存
- 网友分享 Win11 原生功能 Live Captions 使用体验
- 一文看懂Redisson分布式锁的Watchdog机制源码实现
- 分布式能源是什么(四川能投分布式能源有限公司)
- capital是什么意思
- SpringBoot 与RabbitMQ、RocketMQ高可靠、高性能、分布式应用实践
- 用树莓派集群进行并行和分布式计算
- 常见分布式协议和算法的说明和对比