CAP定理:

一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本要求,最多只能满足其中的两项

一致性

在分布式环境中,一致性是指数据在多个副本之间是否能够保持强一致的特性。

对于一个将数据副本分布在不同节点上的分布式系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是更新前的数据(称为脏数据),这就是典型的分布式数据不一致情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都能读取到最新的值,那么这样的系统就被认为具有强一致性(或严格的一致性)。

可用性

可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间返回结果,如果超过了这个时间范围,那么系统就被认为是不可用的。

『有限的时间内』是一个在系统设计之初就设定好的运行指标,不同的系统会有很大的差别。比如对于一个在线搜索引擎来说,通常在0.5秒内需要给出用户搜索关键词对应的检索结果。而对应Hive来说,一次正常的查询时间可能在20秒到30秒之间。

『返回结果』是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出对请求的处理结果,及成功或失败,而不是一个让用户感到困惑的返回结果。

让我们再来看看上面提到的在线搜索引擎的例子,如果用户输入指定的搜索关键词后,返回的结果是一个系统错误,比如"OutOfMemoryErroe"或"System Has Crashed"等提示语,那么我们认为此时系统是不可用的。

分区容错性

分区容错性要求一个分布式系统需要具备如下特性:分布式系统在遇到任何网络分区故障的时候,仍然能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络等)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域

以上就是对CAP定理中一致性、可用性和分区容错性的讲解。

既然一个分布式系统无法同时满足上述三个要求,而只能满足其中的两项,因此在对CAP定理应用时,我们就需要抛弃其中的一项,下表是抛弃CAP中任意一项特性的场景说明。

CAP 说明
放弃P 如果希望能够避免系统出现分区容错性问题,一种较为简单的做法是将所有的数据(或者仅仅是哪些与事务相关的数据)都放在一个分布式节点上。这样做虽然无法100%保证系统不会出错,但至少不会碰到由于网络分区带来的负面影响。但同时需要注意的是,放弃P的同时也就意味着放弃了系统的可扩展性
放弃A 一旦系统遇到网络分区或其他故障或为了保证一致性时,放弃可用性,那么受到影响的服务需要等待一定的时间,因此在等待期间系统无法对外提供正常的服务,即不可用
放弃C 这里所说的放弃一致性,实际上指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时的一致性,但是能够承诺的是,数据最终会达到一个一致的状态

需要明确的一点是:对于一个分布式系统而言,分区容错性可以说是一个最基本的要求。因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓的分布式系统了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然需要面对和解决的问题。因此系统架构师往往需要把精力花在如何根据业务特点在C(一致性)和A(可用性)之间寻求平衡

BASE是Basically Available(基本可用)Soft state(软状态)Eventually consistent(最终一致性)三个短语的简写。BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方法来使系统达到最终一致性。接下来,我们着重对BASE中的三要素进行讲解。

基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用。一下就是两个"基本可用"的例子。

  • 响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1~2秒。

功能上的损失:正常情况下,在一个电子商务网站(比如淘宝)上购物,消费者几乎能够顺利地完成每一笔订单。但在一些节日大促购物高峰的时候(比如双十一、双十二),由于消费者的购物行为激增,为了保护系统的稳定性(或者保证一致性),部分消费者可能会被引导到一个降级页面,如下:

软状态

软状态是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同的数据副本之间进行数据同步的过程存在延时

最终一致性

最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

最终一致性是一种特殊的弱一致性:系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问都能够获取到最新的值。同时,在没有发生故障的前提下,数据到达一致状态的时间延迟,取决于网络延迟、系统负载和数据复制方案设计等因素。

最终一致性并不是只有那些大型分布式系统才涉及的特性,许多现代的关系型数据库都采用了最终一致性模型。在现代关系型数据库中(比如MySQL和PostgreSQL),大多都会采用同步或异步方式来实现主备数据复制技术。在同步方式中,数据的复制过程通常是更新事务的一部分,因此在事务完成后,主备数据库的数据就会达到一致。而在异步方式中,备库的更新往往会存在延时,这取决于事务日志在主备数据库之间传输的时间长短。如果传输时间过长或者甚至在日志传输过程中出现异常导致无法及时将事务应用到备库上,那么很显然,从备库中读取的数据将是旧的,因此就出现了数据不一致的情况。当然,无论是采用多次重试还是人为数据订正,关系型数据库还是能够保证最终数据达到一致,这就是系统提供最终一致性保证的经典案例。

最新文章

  1. javaweb project create
  2. dotfiles管理
  3. [转]用Linq取CheckBoxList選取項目的值
  4. GitHub帮助文档翻译2——contribution
  5. delphi参数传递
  6. UIApplicationMain方法介绍
  7. 常用Jquery插件整理大全
  8. 文件系统满的话(filesystem full),该如何处理。
  9. 关于CentOS 6下Hadoop占用系统态CPU高的处理办法【转】
  10. Appium 并发测试基于unitest
  11. Navicat for oracle cannot load OCI DLL
  12. Jmeter中文乱码
  13. Windows Phone Silverlight 8.1 apps
  14. 【javascript】javascript设计模式mixin模式
  15. Codeforces Round #306 (Div. 2)A B C D 暴力 位/暴力 暴力 构造
  16. JqGrid 获取所有数据
  17. OSAL的原理
  18. Codeforces 949E Binary Cards
  19. Ajax基础(五)--封装库
  20. QCache 缓存(模板类,类似于map,逻辑意义上的缓存,方便管理,和CPU缓存无关。自动获得被插入对象的所有权,超过一定数量就会抛弃某些值)

热门文章

  1. JqGrid参考实例
  2. .net list转树状结构
  3. RabbitMQ学习之Routing(4)
  4. 2d图片依次排列在屏幕中间(SpriteRenderer)
  5. 详细的Hadoop的入门教程-伪分布模式Pseudo-Distributed Operation
  6. 2019 中钢网java面试笔试题 (含面试题解析)
  7. mybatis关联映射一对多
  8. MYSQL中的时间类型
  9. MySQL安装和使用
  10. postgresql基于备份点PITR恢复