zoukankan      html  css  js  c++  java
  • 分布式理论(一)CAP 理论

    分布式理论(一) CAP理论

    一.CAP理论前言

          CAP原则又称为CAP理论,主要思想是在任何一个分布式系统中都无法同时满足CAP

    CConsistency):表示一致性,所有的节点同一时间看到的是相同的数据。

    AAvaliablity):表示可用性,不管是否成功,确保一个请求都能接收到响应。

    PPartion Tolerance):分区容错性,系统任意分区后,在网络故障时,仍能操作。

     

    如上所述,正如Gilbert认为,一致性其实就是关系型数据库所讲的ACID,一个用户请求要么是成功,要么是失败的,不能有处于一个中间状态;一旦一个事务完成,将来所有事务都必须基于这个完成后的状态;未完成的事务不会互相影响;一旦一个事务完成,就是持戒的。可用性其实就是对于一个系统而言,所有的请求都应该“成功”并且收到“响应”。分区容错性其实就是指分布式系统的容错性,一个节点出现了故障,不影响整个集群的正常使用。

    二.CAP理论介绍

          如图,在一个网络中,N1N2即分布式系统中的两个节点,他们都共享数据块V,其中有一个值是为V0

     

    在满足一致性的时候,A中的V0应该和B中的V0保持一致的,即V0=V0

    在满足可用性的时候,无论请求访问A或者是B都应该得到响应。

    在满足分区可用性的时候,AB随便一个出现宕机或者网络不通的情况下,都不应该影响整个系统的可用性。

    上述描述如果A程序更新V0值为V1,然后在更新B上的副本为V1,当一个请求访问B时,得到的结果是V1。如下图所示:

     

    但是分布式系统中,有些时候这些并不能按照你想的这样进行,在分布式系统中通常情况下网络是分区的,如果出现了网络延迟,导致N1上更新的消息无法到达N2上,即N2上的数据副本依然是V0,当一个请求访问B时,获取到的结果是V0,而访问A时,获取到的结果是V1,这就导致了在用户看来是同一个请求,得到的结果是不一样的。如下图

     

    在这个时候,方案的设计者就应该在这里做出两种选择:

    1)牺牲数据一致性,保证可用性。响应旧的数据V0给用户。

    2)牺牲可用性,保证数据一致性。阻塞等待,直到网络连接恢复,数据更新操作M完成之后,再给用户响应最新的数据V1

    三.CAP之间取舍

    接下来我们就谈一谈CAP,这三者之间是如何取舍的:

    1CA without P

    如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA

    常见模型例子:

    单站点数据库;集群数据库等,网上找的还有:LDAP协议,xFS文件系统

    实现方式:

    两阶段提交;缓存验证协议

    2CP without A

    如果不要求A(可用),相当于每个请求都需要在节点之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式,以及Zookeeper等中间件

    常见模型例子:

    分布式数据库;分布式锁;大部分的协议;Zookeeper

    实现方式:

    悲观锁;少数分区不可用

    3AP wihtout C

    要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于。

         常见模型例子:

         Web缓存;DNSNoSQL

         实现方式:

         到期或者租赁;解决冲突;乐观锁

    CAP的意义:

    在系统架构时,应该根据具体的业务场景来权衡CAP,就拿大多数的门户网站来说,因为机器数量庞大,部署节点分散,网络故障时常态,可用性是必须要保证的,所以在设计的时候就会考虑舍弃一些一致性而选择AP模型。但是对于数据一致性较高的银行系统来说,可以用于系统临时不可用,但是数据必须要保持一致来说,选择CP模型无可厚非。

  • 相关阅读:
    量身打造自己的MyEclipse(多图)
    DevExpress v17.2新版亮点—WPF篇(五)
    DevExpress WPF入门指南:绑定编辑器对话框
    MyEclipse 2017 Stable 2.0发布|附下载
    springmvc常用注解标签详解
    什么是SpringMVC?
    SpringBoot页面渲染
    怎样理解Spring的IOC和AOP?
    LESS 原理,一款css的预处理程序Less的使用
    移动端web app要使用rem实现自适应布局:font-size的响应式
  • 原文地址:https://www.cnblogs.com/lovegrace/p/11391842.html
Copyright © 2011-2022 走看看