架构师训练营 - 第六周作业
CAP 原理介绍
C(Consistency):一致性。每次读取的数据都应该是最近写入的数据或者返回一个错误,而不是过期数据。这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致。
A(Availability):可用性。每次请求都应该得到一个响应,而不是返回一个错误或者失去响应。不过这个响应不需要保证数据是最近写入的,也就是说系统需要一直都是可以正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的。
P(Partition tolerence):分区耐受性。即使因为网络原因,部分服务器之间消息丢失或者延迟了,系统依然应该是可以操作的。
对于一个分布式系统而言,网络失效一定会发生。也就是说分区耐受性是必须要保证的,那么在可用性和一致性上就必须二选一。
所以,关于 CAP 原理,更准确的说法是:在分布式系统必须要满足分区耐受性的前提下,可用性和一致性无法同时满足。
CAP 原理简单证明
假设有节点 data1 和节点 data2,一开始有个数据 num=1。之后向 data1 提交更新,将数据 num 设置为 2。接着 data1 需要将更新推送给 data2,让 data2 也更新 num 数据。
在保证 C 和 P 的情况下
为了保证数据一致性,data1 需要将数据复制给 data2,即 data1 和 data2 需要进行通信。但是由于网络是不可靠的,系统保证了分区容忍性,也就是说系统可以容忍网络是不可靠的。这个时候 data2 就不一定能及时收到 data1 的数据复制消息,当有请求向 data2 访问 num 数据时,为了保证数据的一致性,data2 只能阻塞等待数据真正同步完成后再返回,也就没办法保证高可用性。
在保证 A 和 P 的情况下
为了保证高可用性,data1 和 data2 都要在有限时间内返回。由于网络的不可靠,在有限时间内,data2 可能还没收到 data1 发来的数据更新消息,这时候返回给客户端的可能是旧的数据,和访问 data1 的数据是不一致的。
在保证 A 和 C 的情况下
如果要保证可用性和一致性,只有在网络情况良好且可靠的情况下才能实现,这样 data1 才能立即将消息发送给 data2.但是网络是不可靠的,是会存在丢包的情况。所以要满足及时可靠更新,只有将 data1 和 data2 放到一个区内才可以,也就丧失了 P 这个保证。这个时候整个系统也不能算是一个分布式系统了。
总结
关于 CAP 原理,需要注意的一点:虽然说我们设计系统时不能同时保证拥有三点。但是也并不是说,保证了其中两点后,就要完全抛弃另外一点。只是相对的要做一些牺牲。比如在保证 CP 的情况下,虽然没办法保证高可用性,但这不意味着可用性为 0,我们可以通过合理的设计尽量的提高可用性,让可用性尽可能的接近 100%。同理,在 AP 的情况下,也可以尽量的保证数据的一致性,或者实现弱一致性,即最终一致性。
版权声明: 本文为 InfoQ 作者【chenlovehx】的原创文章。
原文链接:【http://xie.infoq.cn/article/af4ecfde1d4f8ecb4be62d77a】。文章转载请联系作者。
评论