CAP理论与分布式数据库

合集下载

分布式CAP理论

分布式CAP理论

分布式CAP理论在弄清楚这个问题之前,我们先了解⼀下什么是分布式的CAP定理。

根据百度百科的定义,CAP定理⼜称CAP原则,指的是在⼀个分布式系统中,Consistency(⼀致性)、 Availability(可⽤性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。

⼀、CAP的定义Consistency (⼀致性):“all nodes see the same data at the same time”,即更新操作成功并返回客户端后,所有节点在同⼀时间的数据完全⼀致,这就是分布式的⼀致性。

⼀致性的问题在并发系统中不可避免,对于客户端来说,⼀致性指的是并发访问时更新过的数据如何获取的问题。

从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终⼀致。

Availability (可⽤性):可⽤性指“Reads and writes always succeed”,即服务⼀直可⽤,⽽且是正常响应时间。

好的可⽤性主要是指系统能够很好的为⽤户服务,不出现⽤户操作失败或者访问超时等⽤户体验不好的情况。

Partition Tolerance (分区容错性):即分布式系统在遇到某节点或⽹络分区故障的时候,仍然能够对外提供满⾜⼀致性或可⽤性的服务。

分区容错性要求能够使应⽤虽然是⼀个分布式系统,⽽看上去却好像是在⼀个可以运转正常的整体。

⽐如现在的分布式系统中有某⼀个或者⼏个机器宕掉了,其他剩下的机器还能够正常运转满⾜系统需求,对于⽤户⽽⾔并没有什么体验上的影响。

⼆、CAP定理的证明现在我们就来证明⼀下,为什么不能同时满⾜三个特性?假设有两台服务器,⼀台放着应⽤A和数据库V,⼀台放着应⽤B和数据库V,他们之间的⽹络可以互通,也就相当于分布式系统的两个部分。

在满⾜⼀致性的时候,两台服务器 N1和N2,⼀开始两台服务器的数据是⼀样的,DB0=DB0。

在满⾜可⽤性的时候,⽤户不管是请求N1或者N2,都会得到⽴即响应。

分布式数据库优化考试

分布式数据库优化考试

分布式数据库优化考试(答案见尾页)一、选择题1. 分布式数据库中,什么是读写分离?A. 读操作和写操作分别在不同的数据库服务器上进行B. 将多个数据库服务器分为主服务器和从服务器,主服务器处理写操作,从服务器处理读操作C. 通过数据分片技术将数据分布到多个数据库服务器上D. 使用缓存技术提高查询性能2. 在分布式数据库中,什么是分库分表?A. 将一个大型数据库拆分成多个较小的数据库,以提高性能和可扩展性B. 将一个数据库表拆分成多个较小的表,以提高查询性能C. 将多个数据库服务器合并为一个高性能的数据库服务器D. 使用分布式事务解决分布式数据一致性问题3. 什么是分布式数据库中的CAP理论?A. 一致性、可用性和分区容错性无法同时满足B. 一致性、可用性和分区容错性可以同时满足C. 一致性、可用性和分区容错性之间存在权衡D. 分布式数据库的性能只取决于单个服务器的性能4. 在分布式数据库中,什么是全局事务?A. 跨多个数据库服务器执行的事务B. 由多个用户或应用同时执行的事务C. 保证数据库事务的原子性、一致性、隔离性和持久性的特性D. 仅涉及单个数据库服务器的事务5. 分布式数据库中的数据一致性是指什么?A. 数据在多个节点之间保持一致的状态B. 数据在单个节点上保持一致的状态C. 数据在所有节点上保持一致的状态D. 数据在特定时间点保持一致的状态6. 在分布式数据库中,什么是复制策略?A. 决定哪些数据需要复制到哪些节点的策略B. 决定哪些节点需要复制数据的策略C. 决定如何复制数据的策略D. 决定何时复制数据的策略7. 分布式数据库中的负载均衡是指什么?A. 将写操作分散到多个数据库服务器上,以平衡写入负载B. 将读操作分散到多个数据库服务器上,以平衡读取负载C. 将数据和查询分散到多个数据库服务器上,以平衡性能和负载D. 将数据存储在不同的节点上,以平衡数据管理和访问负载8. 在分布式数据库中,什么是分布式锁?A. 一种用于同步多个节点上的数据访问的机制B. 一种用于保护数据不被修改的机制C. 一种用于确保数据一致性的机制D. 一种用于限制并发访问的机制9. 分布式数据库中的数据分片是指什么?A. 将一个大型数据库拆分成多个较小的数据库,以提高性能和可扩展性B. 将一个数据库表拆分成多个较小的表,以提高查询性能C. 将多个数据库服务器合并为一个高性能的数据库服务器D. 使用缓存技术提高查询性能10. 在分布式数据库中,什么是灰度发布?A. 一种用于评估新功能或更改的影响的方法B. 一种用于测试新功能或更改的方法C. 一种用于逐步推出新功能或更改的方法D. 一种用于减少风险的方法11. 分布式数据库中,什么是主键和外键?它们各自的作用是什么?A. 主键是唯一的,用于标识数据库中的每条记录。

Redis CAP理论、数据类型、详细讲解

Redis CAP理论、数据类型、详细讲解

Redis CAP理论、数据类型、详细讲解一、知识点1、CAP理论C:Consistency(强一致性)A:Availability(可用性)P:Partition tolerance(分区容错性)CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。

Redis(CP单线程)zookeeper CP2、redis数据类型都⽤过哪些数据类型?分别介绍下使⽤场景?2.1、Spring:字符串内部数据结构在Redis内部,String类型通过int、SDS(simple dynamic string 简单动态字符串)作为结构存储,int用来存放整型数据,sds存放字节/字符串和浮点型数据。

在C的标准字符串结构下进行了封装,用来提升基本操作的性能,同时也充分利用已有的C的标准库,简化实现逻辑。

我们可以在redis的源码中【sds.h】中看到sds的结构如下;typedef char *sds;redis3.2分支引入了五种sdshdr类型,目的是为了满足不同长度字符串可以使用不同大小的Header,从而节省内存,每次在创建一个sds时根据sds的实际长度判断应该选择什么类型的sdshdr,不同类型的sdshdr 占用的内存空间不同。

这样细分一下可以省去很多不必要的内存开销,下面是3.2的sdshdr定义Len:已使用长度Alloc:总长度Flags:1字节标识当前类型Buf[]:柔性数据,存放数据len和alloc的类型不同(uint8、uint16、uint32、uint64)如果是type5并且是空字符串,强制转化为type8,避免后期扩容引响性能。

SDS扩容:1、获取当前可用空间长度avail,若大于等于新增长度addlen则无需扩容,直接返回2、若avail小于addlen,len+addlen<1M,则按新长度的2倍扩容3、若avail小于addlen,len+addlen>1M,则按新长度+1M4、根据新长度选择sds类型,如果sds类型和原类型相同,则通过realloc扩大柔性数组5、如果sds类型和原类型不相同,则malloc重新申请内存,并把原buf内容移动到新位置6、对新串的属性进行赋值后返回2.2、Hash:哈希结构(map)数据结构map提供两种结构来存储,一种是hashtable、另一种是ziplist,数据量小的时候用ziplist. 在redis中,哈希表分为三层,源码地址【dict.h】,分别是dictEntry相当于JAVA中的NODE、dictht->数组、dict->hashMap2.3、list:链表内部数据结构redis3.2之前,List 类型的value 对象内部以linkedlist(双向链表)或者ziplist 来实现, 当list 的元素个数和单个元素的长度比较小的时候,Redis 会采用ziplist (压缩列表)来实现来减少内存占用。

简述cap理论

简述cap理论

简述cap理论CAP理论(即可用性,可靠性和可变性理论)是由Eric Brewer 在2000年提出的,用于解释分布式系统及其特性之间的不可分割性质。

CAP理论指出,在分布式计算环境中,实现容错性的用户能够选择以下三个特性中的任意二个:可用性(Availability),可靠性(Consistency)以及可变性(Partition Tolerance)。

1、可用性(Availability)可用性是指系统从发起请求到处理请求所需要的时间,它描述了系统中所有节点的可用性程度。

可用性的高低取决于系统能够在发生异常情况时以较快的方式恢复其正常功能。

例如,在一个web应用程序中,可用性取决于程序的准备情况,即应用程序是否可以处理用户发起的请求。

2、可靠性(Consistency)可靠性是指分布式系统的每个节点具有相同的数据状态。

可靠性是指系统总是保持数据完整性(即数据从一个节点到另一个节点之间保持一致性),并确保执行操作时数据永远不会出现冲突。

它还涉及到确保系统有足够的安全措施去防止意外情况发生,从而保障系统的数据完整性和安全性。

3、可变性(Partition Tolerance)可变性是指系统处理分区故障的能力,是指系统在节点间数据传输发生故障时,系统仍能够正常运行,保证消息的交付性。

在发生分区故障时,系统可以采取一定的措施,比如重新发送数据,或采取备份和恢复机制等来解决此问题。

至此,CAP理论表明,分布式系统可以同时具备可用性、可靠性和可变性的特性,但只能同时具有两个特性,而不能同时具有三个特性,这是因为在分布式系统的特性之间存在一定的矛盾性,即当可用性和可靠性都被保证时,系统的可变性就会受到影响,而当可变性和可靠性都被保证时,系统的可用性也会受到影响。

虽然CAP理论表明必须做出取舍,但仍有一些可以让系统获得更高性能的方法,比如利用数据库中改进的锁定机制,实现分布式事务处理(Distributed Transaction Processing),以及利用本地缓存,实现本地数据一致性等。

分布式原则cap

分布式原则cap

分布式原则capCAP原则(Consistency、Availability、Partition tolerance)是分布式系统设计中的重要原则之一。

它描述了在分布式系统中,三个核心属性之间的冲突和权衡。

一、一致性(Consistency)一致性是指分布式系统中的所有节点在同一时间点上看到的数据是一致的。

换句话说,当一个节点对数据进行了修改后,其他节点应该能够立即看到修改后的结果。

这个属性确保了数据的准确性和可靠性,但在分布式系统中实现一致性是一项复杂的任务。

二、可用性(Availability)可用性是指分布式系统在任何时间点都能够提供正常的服务。

即使系统中的某些节点出现故障或不可用,系统依然可以继续运行并提供服务。

可用性是分布式系统中的一个重要指标,它关注系统的稳定性和可靠性。

三、分区容错性(Partition tolerance)分区容错性是指分布式系统在面对网络分区的情况下仍然能够正常工作。

网络分区是指系统中的节点之间由于网络故障或其他原因导致无法通信的情况。

分区容错性确保了系统的弹性和鲁棒性,使系统能够应对各种故障和意外情况。

CAP原则指出,分布式系统中的这三个属性无法同时满足,只能在一致性、可用性和分区容错性之间做出权衡。

具体而言,当系统面临网络分区的情况时,只能保证一致性和可用性中的其中一个。

这是因为在网络分区的情况下,无法保证所有节点都能够及时通信和同步数据,必须在一致性和可用性之间做出选择。

以分布式数据库为例,如果选择保证一致性和可用性,那么在网络分区的情况下,系统将无法提供服务。

如果选择保证可用性和分区容错性,那么在网络分区的情况下,系统可能会出现数据不一致的情况。

因此,根据具体的应用场景和需求,需要权衡这三个属性,并选择最合适的策略。

总结一下,CAP原则是分布式系统设计中的重要原则,它描述了一致性、可用性和分区容错性之间的冲突和权衡。

在设计分布式系统时,需要根据具体的应用需求和场景,权衡这三个属性,并选择最合适的策略。

CAP超详细名词解释

CAP超详细名词解释

CAP超详细名词解释⽬录引⾔2000年7⽉,加州⼤学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。

2年后,⿇省理⼯学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。

之后,CAP理论正式成为分布式计算领域的公认定理。

概述CAP 理论对分布式系统的特性做了⾼度抽象,形成了三个指标:⼀致性(Consistency)可⽤性(Availability)分区容错性(Partition Tolerance)CAP定理我们常见的描述是⼀个分布式系统最多只能同时满⾜⼀致性(Consistency)、可⽤性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

但布鲁尔在提出 CAP 猜想的时候,并没有详细定义 Consistency、Availability、Partition Tolerance 三个单词的明确定义。

因此如果初学者去查询 CAP 定义的时候会感到⽐较困惑,因为不同的资料对 CAP 的详细定义有⼀些细微的差别。

这⾥不展开讲述这些细微差别,本⽂选取Robert Greiner的⽂章来作为参考。

需要注意CAP Theorem: Explained这篇⽂章已经被标明outdated(已过时)。

⽹上说的⼤多数定义是根据第⼀篇⽂章来的。

下⾯带你逐步理解CAP定理中分布式,⼀致性,可⽤性,分区容错性这4个关键词。

分布式我们都知道CAP定理说的是分布式系统下的定理,但是分布式系统有很多类型,有异构的,⽐如节点之间是上下游依赖的关系,有同构的,⽐如分区/分⽚型的、副本型的(主从、多主)。

那么CAP说的分布式包含以上所有吗,⽹上很少有提到CAP说的分布式系统是否有具体的类型。

在CAP Theorem: Explained⽂中描述CAP定理⽤的是Distributed systems,也没有具体指明CAP理论下分布式系统的特征,但是在CAP Theorem: Revisited是这样描述CAP的:in a distributed system (a collection of interconnected nodes that share data), you can only have two out of the following three guarantees across awrite/read pair: Consistency, Availability, and Partition Tolerance - one of them must be sacrificed.翻译过来就是:在⼀个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证⼀致性(Consistence)、可⽤性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外⼀个必须被牺牲。

简述cap理论

简述cap理论

简述cap理论CAP理论(ConsistencyAvailabilityPartitiontolerance)是由美国计算机科学家EricBrewer提出的,关于分布式系统中数据一致性模型的一种理论。

CAP理论是一个模型,用于决定分布式系统中的数据一致性如何,也就是说,它给予了开发者在系统中的策略,以便在满足系统要求的情况下实现数据一致性。

CAP理论提出了三个核心概念:一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。

根据CAP 理论,任何分布式系统可以满足下列两种状态:(1)强一致性和可用性(CA),即系统中的所有节点都必须保持一致,并且在任何时候都能实现最高可用性;(2)系统要能够容忍部分故障,这是分区容错性(CP)。

在CAP理论的框架下,开发者可以根据具体的系统需求,来决定数据一致性的策略。

有时,开发者会选择CA,即将可用性和一致性作为主要目标,这种情况下,通常使用的是2PC(两阶段提交)或Paxos 算法;有时,开发者可能会选择CP,至少在相关服务不可用的情况下,也能满足项目要求,这种情况下,一般会使用到复制策略。

CAP理论在分布式系统中的实施非常重要,因为它可以帮助系统能够保持数据一致性,同时也尽可能地实现最高可用性。

虽然CAP理论可以帮助开发者在系统中实现数据一致性,但它有一些局限性。

最常见的是,CAP理论假设系统在特定的时间段内不会发生故障,而实际上,系统中随时可能发生某些无法预料的故障,这可能会影响到系统的正常运行。

此外,由于CAP理论中只涉及到三个核心概念,因此,它不能完整地表述分布式系统中更复杂的情况,而且在实际应用中,也会受到许多因素的影响,如网络连接的延迟、系统的复杂度和负载均衡等。

由于CAP理论的重要性,目前有许多研究正在努力突破CAP理论的局限,比如,在一致性和可用性之间增加更多的平衡,来实现对故障的更强的容错性;或是研究出新的一致性算法,用于提高系统的性能和可用性;或是开发出新的算法,用于改善系统中数据一致性的实施。

系统架构师知识:什么是CAP

系统架构师知识:什么是CAP

系统架构师知识:什么是CAP系统架构师知识:什么是CAPCAP、BASE理论是当前在互联网领域非常流行的NoSQL的理论基础。

那么什么是CAP呢?我们一起来了解一下!1、什么是CAP著名的CAP理论是由Brewer提出的,所谓CAP,即一致性(Consistency)、可用性(Availability)和分区容错性(PartitionTolerance)。

(1)、Consistency(一致性):更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致(Allnodesseethesamedataatthesametime)。

这里的一致性,一定要和传统的RDBMS中的事务一致性区分开。

在传统的RDBMS中,事务具有ACID4个属性,即原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durable)。

ACID是关系型数据库的最基本原则,遵循ACID原则强调一致性,对成本要求很高,对性能影响很大。

a、原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

b、一致性(Consistency):在事务开始和完成时,数据都必须保持一致状态。

这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

c、隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。

这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。

d、持久性(Durability):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

MIT的Gilbert和Lynch在证明CAP的过程中改变了Consistency的概念,也就是将Consistency转化为Atomic。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

根据CAP理论,一致性(C),可用性(A),分区容错性(P),三者不可兼得,必须有所取舍。

而传统数据库保证了强一致性(ACID模型)和高可用性,所以要想实现一个分布式数据库集群非常困难,这也解释了为什么数据库的扩展能力十分有限。

而近年来不断发展壮大的NoSQL运动,就是通过牺牲强一致性,采用BASE模型,用最终一致性的思想来设计分布式系统,从而使得系统可以达到很高的可用性和扩展性。

但是,对于CAP理论也有一些不同的声音,数据库大师Michael Stonebraker就撰文《Errors in Database Systems, Eventual Consistency, and the CAP Theorem》,表示为了P而牺牲C是不可取的。

事实上,数据库系统最大的优势就对一致性的保证,如果我们放弃了一致性,也许NoSQL比数据库更有优势。

那么,有没有可能实现一套分布式数据库集群,即保证可用性和一致性,又可以提供很好的扩展能力呢?回答是:有的。

目前,有很多分布式数据库的产品,但是绝大部分是面向DSS类型的应用,因为相比较OLTP应用,DSS应用更容易做到分布式扩展。

Michael Stonebraker提到了一种新型的数据库VoltDB,它的定义是Next-Generation SQL Database for Fast-Scaling OLTP Applications。

虽然产品还没有问世,但是从技术资料上来看,它有几个特点:1.采用Share nothing架构,将物理服务器划分为以CPU core为单位的Virtual node,采用Sharding技术,将数据自动分布到不同的Virtual node,最大限度的利用机器的计算资源;2.采用内存数据访问技术,类似于内存数据库(In-memory database),区别于传统的数据库(Disk-based database),消除了传统数据库内存管理的开销,而且响应速度非常快;3.每个Virtual node上的操作是自治的,利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销(比如Latch和Lock);4.数据同步写多个副本,不存在单点故障,而且消除了传统数据库需要记录redo log的开销。

V oltDB与传统数据库的对比,可以看到V oltDB即支持传统数据库的ACID模型,又提供了类似NoSQL产品很高的扩展能力。

这个产品,让我想到了MySQL cluster,同样是shared-nothing架构,NDB存储引擎也要求将数据存放在内存中,数据根据PK被分布到多个不同的节点上,同一份数据可以保存多个副本,防止单点故障。

MySQL cluster目前的主要问题是性能不佳,但是我认为MySQL cluster的架构是分布式数据库未来的趋势,Oracle收购MySQL后,很多人对MySQL的前途表示担忧,而我作为一个用户,除了可能会收费这件事以外,我一点也不担心MySQL的前景,反而有所期待,因为在数据库领域没有任何一个公司比Oracle更懂数据库,而Oracle也正在大力发展MySQL cluster,MySQL cluster一定会成为分布式数据库领域内最好的解决方案之一。

NoSQL数据库异军突起,随着Digg和大型应用不断采取NoSQL,NoSQL运动已经蓬勃发展,NoSQL数据库很多,如何对他们分类,以便方便地根据自己应用特色选择不同的NoSQL数据库呢?NoSQL = HVSP 无(传统关系数据库的)join或明显事务的高容量简单处理。

按照数据模型保存性质将当前NoSQL分为四种:1.Key-value stores键值存储, 保存keys+BLOBs (二进制大对象Binary Large OBjects)2.Table-oriented 面向表, 主要有Google的BigT able和Cassandra.3.Document-oriented面向文本, 文本是一种类似XML文档,MongoDB 和CouchDB4.Graph-oriented 面向图论. 如Neo4J.NoSQL一般都是分布式数据库,高性能是其特点,因此,数据是如何被分布、复制/碎片以及合成就成为关键,这其中涉及你的应用对数据一致性的要求,见CAP原理,不同一致性处理方式决定不同类型:1.基本上基于Dynamo. 核心思想就是在多个节点之间获得最终一致性就可以,即使你有时会读到脏数据. 好处是写数据时从来不会阻塞。

那种强制性节点一致性,如2PC,两段事务提交将会让你的写关闭停顿,使用Dynamo-like风格你能将数据写到多个节点中,通过一致hashing,然后你可以从这些节点读取数据,返回正确结果给用户。

2.基本基于BigT able. 这种模型中,使用常用方式保持节点充分的一致性。

比如同步复制,由数据自己活或数据所在位置来实现一致性,不同产品实现细节不一样。

比如:MongoDB有一个面向文本类型的数据模型, 它采取类似BigTable-like 复制策略;Cassandra有面向表table-like数据模型, 采取的是Dynamo-like风格.以后应该有数据是如何被持久化保存到磁盘上的区分,不同NoSQL处理策略不一样,有的是写一次保存一次;有的是定期保存,后者性能要好些。

←NoSQL数据库最终一致性/BASE VS ACID→CAP理论六月22nd, 2010 · No Comments ·存储&NoSQL作者: 阎斌| 可以转载, 但必须以超链接形式标明文章原始出处和作者信息网址: 10年前,Eric Brewer教授提出了非常著名的CAP理论,后人也论证了CAP理论的正确性。

CAP理论指出:一个分布式系统不可能同时满足一致性(Consistency),可用性(Availibility)和分区容忍性(Partition Tolerance)这三个需求。

最多只能同时满足其中的两个。

▪一致性(Consistency):对于分布式的存储系统,一个数据往往会存在多份。

简单的说,一致性会让客户对数据的修改操作(增/删/改)要么在所有的数据副本(在英文文献中常称为Replica)全部成功,要么全部失败。

即,修改操作对于一份数据的所有副本而言,是原子(Atomic)的操作。

如果一个存储系统可以保证一致性,那么则客户读写的数据完全可以保证是最新的。

不会发生两个不同的客户端在不同的存储节点中读取到不同副本的情况。

▪可用性(Availability):可用性很简单,顾名思义,就是指在客户端想要访问数据的时候,可以得到响应。

但是注意,系统可用(Available)并不代表存储系统所有节点提供的数据是一致的。

比如客户端想要读取文章评论,存储系统可以返回客户端数据,但是评论缺少最新的一条。

这种情况,我们仍然说系统是可用的。

往往我们会对不同的应用设定一个最长响应时间,超过这个响应时间的服务我们仍然称之为不可用的。

分区容忍性(Partition Tolerance):如果你的存储系统只运行在一个节点上,要么系统整个崩溃,要么全部运行良好。

一旦针对同一服务的存储系统分布到了多个节点后,整个存储系统就存在分区的可能性。

比如,两个存储节点之间联通的网络断开(无论长时间或者短暂的),就形成了分区。

对当前的互联网公司(例如Google)来说,为了提高服务质量,同一份数据放置在不同城市乃至不同国家是非常正常的。

因此节点之间形成分区也很正常。

Gilbert 和Lynch将分区容忍性定义如下:No set of failures less than total network failure is allowed to cause the system to respond incorrectly除全部网络节点全部故障以外,所有子节点集合的故障都不允许导致整个系统不正确响应。

我在另外一篇文章(BASE: An Acid Alternative)中找到了一个对分区容忍性更为恰当好理解的解释:Operations will complete, even if individual components are unavailable. (即使部分的组件不可用,施加的操作也可以完成)CAP说明:在设计一个分布式存储系统时,你不得不在三个特性中选择放弃一个。

如果选择Partition Tolerance和Consistency,那么即使坏了节点,操作必须又一致,又能顺利完成。

所以就必须100%保证所有节点之间有很好的连通性。

这是很难做到的。

最好的办法就是将所有数据放到同一个节点中。

但是显然这种设计是不满足Availability的。

如果要满足Availability和Consistency,那么,为了保证可用,数据必须要有Replica。

这样,系统显然无法容忍Partition。

当同一数据的两个副本(Replica)分配到了两个无法通信的Partition上时,显然会返回错误的数据。

最后看一下满足Availability和Partition Tolerance的情况。

满足可用,就说明数据必须要在不同节点中有replica。

然而还必须保证在产生Partition的时候仍然操作可以完成。

那么,必然操作无法保证一致性。

基于ACID的关系型数据库选择的是C和P。

因此能够提供很高的一致性,但是却在系统繁忙的时候不可用(Service Unavailable)。

但是对于大多数互联网应用来讲,强一致性对他们来说并不一定非要满足,可用性往往是更加重要的。

比如,某博客网站在北京和上海的存储服务器突然不联通,北京用户和上海用户无法看到对方的评论显然要比北京用户和上海用户访问网站都返回HTTP 500错误要好的多。

当然,对于银行这种业务来讲,一致性是不能放弃的。

这不在我们的讨论范围之内。

相关文档
最新文档