写点什么

架构师训练营 - 第六周作业

用户头像
chenlovehx
关注
发布于: 2020 年 11 月 01 日

CAP 原理介绍


C(Consistency):一致性。每次读取的数据都应该是最近写入的数据或者返回一个错误,而不是过期数据。这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致。


A(Availability):可用性。每次请求都应该得到一个响应,而不是返回一个错误或者失去响应。不过这个响应不需要保证数据是最近写入的,也就是说系统需要一直都是可以正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的。


P(Partition tolerence):分区耐受性。即使因为网络原因,部分服务器之间消息丢失或者延迟了,系统依然应该是可以操作的。


对于一个分布式系统而言,网络失效一定会发生。也就是说分区耐受性是必须要保证的,那么在可用性和一致性上就必须二选一。


所以,关于 CAP 原理,更准确的说法是:在分布式系统必须要满足分区耐受性的前提下,可用性和一致性无法同时满足。


CAP 原理简单证明


假设有节点 data1 和节点 data2,一开始有个数据 num=1。之后向 data1 提交更新,将数据 num 设置为 2。接着 data1 需要将更新推送给 data2,让 data2 也更新 num 数据。


  1. 在保证 C 和 P 的情况下


为了保证数据一致性,data1 需要将数据复制给 data2,即 data1 和 data2 需要进行通信。但是由于网络是不可靠的,系统保证了分区容忍性,也就是说系统可以容忍网络是不可靠的。这个时候 data2 就不一定能及时收到 data1 的数据复制消息,当有请求向 data2 访问 num 数据时,为了保证数据的一致性,data2 只能阻塞等待数据真正同步完成后再返回,也就没办法保证高可用性。


  1. 在保证 A 和 P 的情况下


为了保证高可用性,data1 和 data2 都要在有限时间内返回。由于网络的不可靠,在有限时间内,data2 可能还没收到 data1 发来的数据更新消息,这时候返回给客户端的可能是旧的数据,和访问 data1 的数据是不一致的。


  1. 在保证 A 和 C 的情况下


如果要保证可用性和一致性,只有在网络情况良好且可靠的情况下才能实现,这样 data1 才能立即将消息发送给 data2.但是网络是不可靠的,是会存在丢包的情况。所以要满足及时可靠更新,只有将 data1 和 data2 放到一个区内才可以,也就丧失了 P 这个保证。这个时候整个系统也不能算是一个分布式系统了。


总结


关于 CAP 原理,需要注意的一点:虽然说我们设计系统时不能同时保证拥有三点。但是也并不是说,保证了其中两点后,就要完全抛弃另外一点。只是相对的要做一些牺牲。比如在保证 CP 的情况下,虽然没办法保证高可用性,但这不意味着可用性为 0,我们可以通过合理的设计尽量的提高可用性,让可用性尽可能的接近 100%。同理,在 AP 的情况下,也可以尽量的保证数据的一致性,或者实现弱一致性,即最终一致性。


发布于: 2020 年 11 月 01 日阅读数: 25
用户头像

chenlovehx

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 第六周作业