> CAP理论指的是分布式系统最多同时满足C-consistency、A-available和P-partition tolerance中的两项
![](https://img.kancloud.cn/79/54/79548951608588ea99e442a429f54191_268x216.png)
![](https://img.kancloud.cn/30/2b/302b898391a2b3f1624156f28edd7ff5_619x210.png)
## 1. consistency一致性
1. all nodes see the same data at the same time即为更新数据完成并响应客户端后,其他节点获取的都是最新的值(同步完成,强一致性)
2. 对于一致性,可以分为从客户端和服务端两个不同的视角。从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。
从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。
3. 对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。
4. 如果能容忍后续的部分或者全部访问不到,则是弱一致性。
5. 如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。
## 2. available可用性
reads and writes always available,服务一直可以提供响应,即使数据不是最新的。
## 3. 分区容忍性(Partition tolerance)
> 1. 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,也就是说,服务器A和B发送给对方的任何消息都是可以放弃的,也就是说A和B可能因为各种意外情况,导致无法成功进行同步,分布式系统要能容忍这种情况。除非整个网络环境都发生了故障。
> 2. P是分布式的基础,不满足分区容忍,就是单体应用了
![](https://img.kancloud.cn/ef/dd/efddc079786a94273958c3d0b24dc9aa_256x227.png)
AP: 即时G1和G2数据同步失败,也要保证可用性
CP:G1和G2数据同步失败,就一直等着,不提供服务,因为要保证数据的一致性
### 同步策略
保证可用性和分区容错,舍弃强一致性,但保证最终一致性,比如一些高并发的站点(秒杀、淘宝、12306)。最终近似于兼顾了三个特性。
## 4. 数据一致性
> **一致性可以分为强一致性、弱一致性和最终一致性。所谓强一致性,即复制是同步的,弱一致性,即复制是异步的。**
CAP理论告诉我们一个悲惨但不得不接受的事实——我们只能在C、A、P中选择两个条件。而对于业务系统而言,我们往往选择牺牲一致性来换取系统的可用性和分区容错性。不过这里要指出的是,所谓的“牺牲一致性”并不是完全放弃数据一致性,而是牺牲**强一致性**换取**弱一致性**。
### 4.1 强一致性
> 系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值;
也称为:原子一致性(Atomic Consistency)线性一致性(Linearizable Consistency)
**1. 两个要求:**
* 任何一次读都能读到某个数据的最近一次写的数据。
* 系统中的所有进程,看到的操作顺序,都和全局时钟下的顺序一致。
简言之,在任意时刻,所有节点中的数据是一样的。例如,对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。
**2. 总结:**
* 一个集群需要对外部提供强一致性,所以只要集群内部某一台服务器的数据发生了改变,那么就需要等待集群内其他服务器的数据同步完成后,才能正常的对外提供服务。
* 保证了强一致性,务必会损耗可用性。
### 4.2 弱一致性
> 系统中的某个数据被更新后,后续对该数据的读取操作**可能**得到更新后的值,也可能是更改前的值。
但即使过了**不一致时间窗口**这段时间后,后续对该数据的读取也不一定是最新值
所以说,可以理解为数据更新后,如果能容忍后续的访问只能访问到部分或者全部访问不到,则是弱一致性。
### 4.3 最终一致性
> 是弱一致性的特殊形式,存储系统保证在没有新的更新的条件下,最终所有的访问都是最后更新的值。
> 不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。
简单说,就是在一段时间后,节点间的数据会最终达到一致状态。
**一致性总结**
弱一致性即使过了不一致时间窗口,后续的读取也不一定能保证一致,而最终一致过了不一致窗口后,后续的读取一定一致
## 5. Base理论
* BA:Basic Available基本可用
* 整个系统在某些不可抗力的情况下,仍然能够保证“可用性”,即一定时间内仍然能够返回一个明确的结果。只不过“基本可用”和“高可用”的区别是:
* “一定时间”可以适当延长 当举行大促时,响应时间可以适当延长
* 给部分用户返回一个降级页面 给部分用户直接返回一个降级页面,从而缓解服务器压力。但要注意,返回降级页面仍然是返回明确结果。
* S:Soft State柔性状态: 是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统不同节点的数据副本之间进行数据同步的过程存在延时。
* E:Eventual Consisstency最终一致性: 同一数据的不同副本的状态,可以不需要实时一致,但一定要保证经过一定时间后仍然是一致的。
BASE理论是对CAP中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(`Eventual consistency`)。
- springcloud
- springcloud的作用
- springboot服务提供者和消费者
- Eureka
- ribbon
- Feign
- feign在微服务中的使用
- feign充当http请求工具
- Hystrix 熔断器
- Zuul 路由网关
- Spring Cloud Config 分布式配置中心
- config介绍与配置
- Spring Cloud Config 配置实战
- Spring Cloud Bus
- gateway
- 概念讲解
- 实例
- GateWay
- 统一日志追踪
- 分布式锁
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安装
- 1.2 特性
- 1.3 实例
- 1. 整合nacos服务发现
- 2. 整合nacos配置功能
- 1.4 生产部署方案
- 环境隔离
- 原理讲解
- 1. 服务发现
- 2. sentinel
- 3. Seata事务
- CAP理论
- 3.1 安装
- 分布式协议
- 4.熔断和降级
- springcloud与alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服务框架付费
- SkyWalking
- 介绍与相关资料
- APM系统简单对比(zipkin,pinpoint和skywalking)
- server安装部署
- agent安装
- 日志清理
- 统一日志中心
- docker安装部署
- 安装部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定时清理数据
- index Lifecycle Management
- 没数据排查思路
- ELK自身组件监控
- 多租户方案
- 慢查询sql
- 日志审计
- 开发
- 登录认证
- 链路追踪
- elk
- Filebeat
- Filebeat基础
- Filebeat安装部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安装
- rpm安装
- docker安装Logstash
- grok调试
- Grok语法调试
- Grok常用表达式
- 配置中常见判断
- filter提取器
- elasticsearch
- 安装
- rpm安装
- docker安装es
- 使用
- 概念
- 基础
- 中文分词
- 统计
- 排序
- 倒排与正排索引
- 自定义dynamic
- 练习
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- kibana
- 安装
- docker安装
- rpm安装
- 整合
- 收集日志
- 慢sql
- 日志审计s
- 云
- 分布式架构
- 分布式锁
- Redis实现
- redisson
- 熔断和降级