CAP理论
基本概念
- Consistency 一致性
所有节点
访问同一份最新
的数据副本,最新 意味着所有的数据不能都是错误的
- Availablity 可用性
- 每次请求都能获取到
非错的
响应,但是不能保证数据时最新的
- 每次请求都能获取到
- Partition Tolerance 分区容错性
- 分区相当于对
通信时限
的要求,系统如果不能在一定时限内达成数据一致性,就意味着出现了分区 - 必须在 可用性 和 一致性 之间做出选择
- 也就是容忍分布式节点之间的网络包丢失或者延时,让系统仍然能正常运行
- 分区相当于对
在分布式系统中,当节点之间由于出现故障,分区节点之间不连通,导致无法访问指定数据。这时的分区是不能容忍的。 为了提高分区容错性能,就需要将数据保存在不同的节点上,使用多个副本。但是副本越多,修改数据时,保持数据一致性的代价就越大。如果要保证一致性,那么就需要花更多的时间来同步数据。 这一延迟如果很长,又将导致可用性降低。 这就是 CAP 的核心矛盾所在。
这里的一致性,和关系型数据库事务ACID的C一致性不同。
- 分布式C:同一副本的一致性
- 事务C:一种一致性关系,a和b转账,那么在转账前中后,金额总数都是一样的。
对于一个分布式系统而言,不可能同时满足以上三点。
- 若没有网络波动和网络分区,只需要CA,P无从谈起;
- 若出现网络波动和网络分区,为了保证P,C和A只能选择其一。 注意这里的二选一,是在要达到严格的C或者A条件下。可以存在二者的折中选择,这也是各种系统优化算法的目的。可用性是可以在 0% 到 100% 之间连续变化的。一致性可以细分为强一致、弱一致和最终一致。系统的不同分区也可以有不同的认知。
退一步讲,我们使用缓存,不就是在追求访问速度吗?那么,如果系统对一致性性要求很高,那么也许该系统就不适合使用缓存。使用缓存,就表示着系统应该接受弱一致性或者最终一致性。一般情况下,是通过一定方案,来最大限度地避免数据不一致或者减少达到最终一致的时间,比如延时双删、异步更新、串行化等。
CAP示例
CAP是个说明什么是不可行的理论。
假设一个分布式系统有三台server,用户向其进行写入操作。若其中一个server写入成功就算向系统写入成功。
此时,若出现网络问题,三台server数据就可能出现不一致,C无法保证。但是系统认为成功,返回了结果,A得到保证。
假设一个分布式系统有三台server,用户向其进行写入操作。若三个server都写入成功才算向系统写入成功。
此时,若出现网络问题,三台server数据不能同时写入成功,系统返回错误,A无法保证。但是副本一致性得到保证,A得到保证。
分布式系统中的CAP
首先,分布式环境下,一般P是一定存在的,需要权衡的是 C 和 A。
- 对于NoSQL,注重可用性,是一个 AP 系统
- 对于分布式关系型数据库,必须要保证一致性,是一个 CP 系统 分布式关系型数据库,不能保证完全的100%可用性,但是一般要求 99.999% 的高可用性。所以被定义为 CP + HA 系统。其有两个指标:
- RPO(Recovery Point Objective):恢复点目标。一般分布式数据库不会全部同时宕机或者受灾,只要有一台保留下了最新数据,RPO就为0。
- RTO(Recovery Time Objective):恢复时间目标。事故后整个系统恢复正常所需的时间,通过主备切换、重新选主等,仍可以恢复正常服务。一般而言 RTO 会在几分钟内。像一些使用raft协议的数据库,RTO会在30秒内。
分布式方案
Quorum Replication
要求 数据总副本数N,要小于,写入成功副本数W 与 读取成功副本数R 之和。即,永远会有至少一个副本是最新的且正确返回的。 在此基础上,进行 trade off。
- 比如,W=N、R=1。此时所有节点都写入成功,才返回系统写入成功,保证了写一致性,写可用性差。只要有一个节点可读到数据,就让系统返回结果,保证了读可用性,读一致性差。
- W=1、R=N。此时有一个节点写入成功,就返回系统写入成功,保证了写可用性,写一致性差。所有节点都可读到最新数据,才让系统返回结果,保证了读一致性,读可用性差。
共识算法
不同节点间有通信交互,同时有一个leader节点管理读写服务,保证了一致性。但是leader节点出现问题,就不能保证可用性。通过选举算法,快速建立一个新leader,保证 99.999% 的高可用性。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!