• CAP


    wiki上这样定义CAP:it is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees。

    首先CAP是针对分布式数据存储系统来说的,然后该理论指出了系统最多只能保证CAP三项中的两项。

    那么CAP是哪三项呢?

    ConsistencyAvailabilityPartition tolerance
    Every read receives the most recent write or an error Every request receives a (non-error) response – without guarantee that it contains the most recent write The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes

    一致性,每一个读操作都会读到最新数据;

    可用性,每一个请求(读或写)都会收到非错误响应(即操作成功),但不保证读请求读到的是最新数据;

    分区容忍性,即便节点间无法正常通信(从而产生分区),整个系统仍然可以照常运行。

    正常情况

    假设我们用一台服务器A对外提供存储服务,为了避免这台服务器宕机导致服务不可用,我们又在另外一台服务器B上运行了同样的存储服务。每次用户在往服务器A写入数据的时候,A都往服务器B上写一份,然后再返回客户端。一切都运行得很好,用户的每份数据都存了两份,分别在A和B上,用户访问任意一台机器都能读取到最新的数据(一致性)。

    异常情况

    不幸的事情发生了,A和B之间的网络断开导致A和B无法通信,也就是说网络出现了分区,那么用户在往服务器A写入数据的时候,服务器A无法将该数据写入到服务器B。这时,服务器A就必须要做出一个艰难的选择:

    1. 选择一致性(C)而牺牲可用性(A):为了保证服务器A和B上的数据是一致的,服务器A决定暂停对外提供数据写入服务,从而保证了服务器A和B上的数据是一致,但是牺牲了可用性。
    2. 选择可用性(A)而牺牲一致性(C):为了保证服务不中断,服务器A先把数据写入到了本地,然后返回客户端,从而让客户端感觉数据已经写入了。这导致了服务器A和B上的数据就不一致了。

    CAP就是要在异常情况下做出抉择。

     

    分布式系统无法放弃网络分区容忍性

    网络分区准确地说是指两台机器无法在期望的时间内完成数据交换。这不仅仅是指两台机器之间的网络完全断开了,还可能有其他情况产生网络分区,比如对方机器宕机了,网络延时等情况。分布式系统是基于网络的多节点系统,因此,在分布式系统中,通常是无法放弃Partition Tolerance的,也就只能在CP和AP之间做选择了。如果有个分布式系统号称是CA的,那一定是扯淡。

     

    可用性和一致性的选择

    可用性和一致性之间的选择不是非此即彼的,而是根据业务的需求在它们两者之间做妥协。比如,我们可以放弃对强一致性的追求,让其变成最终一致性,也就是说当服务器A不能把数据传给服务器B时,它先将数据缓存在其本地,等到网络恢复以后再将数据传给服务器B。这样,服务还是可用的,只是在一定的时间窗口内两者的数据是不一致的。

     

    对网络分区的处理

    对网络分区的处理有以下几个步骤:

    1. 检测网络是否出现分区
    2. 当分区出现了,进入分区模式并限制某些操作
    3. 当网络恢复后,启动分区恢复

    参考:http://blog.csdn.net/jewes/article/details/43495639

      https://www.zhihu.com/question/54105974?from=profile_question_card

  • 相关阅读:
    JS 利用数组拼接html字符串
    IE浏览器下读取客户端上传的文件大小
    PrintWriter out = response.getWriter() 输出中文乱码问题
    非常有用的Java程序片段
    sql之left join、right join、inner join的区别
    JAVA 数组常用技巧
    java 图片文件格式转换(多页tif转jpg 、jpg转tif)
    SQL Server 字段状态判断语句
    sql server 2008中id如何设为自增
    java基于xml配置的通用excel单表数据导入组件(五、Action处理类)
  • 原文地址:https://www.cnblogs.com/holoyong/p/7629315.html
Copyright © 2020-2023  润新知