分布式基础 - CAP理论
当一个从逻辑上被视为整体的系统,拆散到多个节点部署时,则能称之为分布式系统,分布式领域中的
CAP 理论,即是图中三个单词的首字母缩写组合, CAP 由三个指标组成:
C : Consistency (一致性);
A : Availability (可用性);
P : Partition tolerance (分区容错性)。
Consistency一致性
分布式和以往集中式部署的单体架构不同,它可以部署在多个节点上,以 Redis 为例,如果只部署一个
节点,则属于单机版本,采用主从、分片等集群模式部署,称之为分布式版本。所谓的一致性,即是在
同一个分布式系统中,同一时刻的所有节点,能看到的数据完全相同。
Availability可用性
分布式系统因为部署在多个节点,虽然避免了单点故障问题,但也会增加整个系统的风险出错率,还是
上面 Redis 的例子, A、B、C 三个节点都有可能出现故障。而 CAP 里的可用性,即是指分布式系统中,
能够始终对请求做出响应,好比 B 节点发生错误,整个 Redis 服务依旧要能够正常处理并响应外部的请
求,不能由于某一个或部分节点的损坏,导致整个系统陷入不可用状态。
Partition tolerance分区容错性
组成分布式系统的多个节点,可以部署在任意节点上,这意味着我们可以用物理位置不同的服务器来部
署系统,不同节点间的协调与数据同步,都依靠网络来完成。当组成分布式系统的多个节点,其中某个
节点出现网络故障时(如网络中断、抖动、网络设备损坏等),对系统内其余正常的节点来说,无法通
过网络感知到该节点,它成为无法通信的孤立区域,从而造成了网络分区。
CAP三者选其二问题
一致性要求所有节点在同一时间看到相同的数据;
可用性则要求系统能够始终对请求做出响应;
分区容错性则是指系统在遇到网络分区时,仍然能够保持一定的可用性和一致性。
通常而言,如果更关注性能,可以选择 AP 类型的组件,毕竟 AP 舍弃了数据一致性,只需等数据写入主
节点,就可以向客户端返回写入成功,这无疑会大幅度提升请求的响应时间。但 AP 组件存在数据丢失的
风险,比如数据刚写进主节点,还没来得及同步给从机,主节点就宕机了,此时切换上来的新主,就会
丢失这部分数据。
反之,如果更关注数据安全性,则可选用 CP 类型的组件, CP 放弃了可用性,优先保证数据一致性,当
数据写进主节点后,往往需要等到从节点也写入完成,最后才能给客户端返回写入成功,这显然会拖慢
响应速度,因为从机未写入成功,请求则需要一直阻塞等待。不过这种模式有个好处,就是当主节点宕
机时,无论是哪台从机成为新主,都能保证拥有最完整的数据,不会存在数据丢失现象。
分布式核心 - BASE理论
BA :Basically Available(基本可用);
S :Soft state(软状态);
E :Eventually consistent(最终一致性);
Basically Available基本可用
基本可用的核心思想就是:当系统出现故障或意外情况时,允许放弃掉部分可用性,保证核心功能可
用,或能响应外部请求(返回自定义的错误提示也可以)即可。
Soft state软状态
软状态在有些地方也叫弱状态,是指允许系统存在中间状态,并且该中间状态不会影响系统整体的可用
性。
这就好比传统关系型数据库里的事务机制,假设没有事务机制,写入数据就只有成功、失败两种状态:
成功:数据成功保存到数据库,当出现读取请求时,能正常读到写入(或更新)后的值;
失败:数据未保存到数据库,当出现读取请求时,只能看到之前的值,或看不到值;
而有了事务机制后,在成功与失败之间,多了一个中间态,即:数据写入成功,事务暂未提交,这个中
间态的存在,也不会影响数据库整体的可用性。
Eventually consistent最终一致性
在 BASE 理论中,最终一致性是和软状态绑定的,两者需要结合在一起理解。软状态允许系统内存在中
间态,但要记住:如果这个中间态,一直不变成终态,而是卡在那里的话,就会影响系统整体的可用
性。
BASE 理论里的最终一致性,就是为了填补“卡在中间态不变化”这个逻辑漏洞,代表系统内出现中间态
时,经过一定时间推移后,最终肯定能达到一致的状态(终态)。
总结
CAP 理论更偏向于分布式存储这个领域,而且并非所有分布式存储领域都会用到 CAP ,只有哪些存在数
据副本的分布式存储场景,如所谓的主从集群、多主集群、镜像集群、复制集群、副本集群……等场景
时,才会用到 CAP ,因为这些情况下才会涉及到数据同步,才会涉及到数据一致性问题!
BASE 里的一致性维度更高,关注点是:分布式系统里的状态一致性,即中间态最终会演变成终态
BASE 理论与 ACID 完全相反, ACID 是悲观思想,在每次操作结束时强制要求保持一致性(即事务结束
必须落入终态)。而 BASE 是乐观思想,可以接受数据库一致性处于不断变化的状态。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。