CAP 与数据一致性
分布式系统的假设是,工作在网络环境下的系统拥有多个节点,而这些节点本身会由于各种原因而变得不稳定。这其中就有一个非常重要的概念——CAP原理。这个原理指导着大多数分布式系统的设计过程,CAP原理大致是说分布式系统中一定存在三个特性:一致性(Consistency)、分区容忍性(Partition)和可用性(Availability),且这三个特性在分布式系统的设计中不可能全部同时满足。

举个例子,一个分布式系统中有N个节点通过网络链接在一起协同工作。首先你不能将完整的数据X只存放在一个节点上,这是因为一旦这个节点由于各种原因停止工作了,数据X就不能被访问那肯定就不满足系统可用性了,并且一旦这个节点不能再被恢复,数据X就永远丢失了。所以数据X至少也应该在不同的节点上存储多份,存储的副本量越多越能保证数据X的安全,也更能保证即使在多个节点同时不可用的情况下,数据X也同样能够被访问。这就是分区性的要求,按照普遍经验,数据X的副本数至少应该有三份。在这种情况下,当数据X发生变化时如何对这些副本进行更新呢?最理想的效果是,当如果客户端要求发出数据X的更新请求后,从任何一个节点访问数据X都可以拿到它最新的状态,这就是一致性要求。当然这个最理想的效果太理论化了,要知道基于网络工作的分布式系统受很多外在因素影响:要是同步过程中发现某个副本节点无法连接了怎么办?要是同时又有一个客户要求再次更新数据X怎么办?如果真要达到这么理论的一致性要求,那就只能让所有需要读/写数据X的客户端等待,直到完成数据X的所有副本同步后,再进行响应,但显然这从可用性的角度出发又是不满足要求的。

再例如,关系型数据库的设计通常基于ACID原理,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),而且关系型数据库普遍采用事务技术实现ACID原理,其中每一个事务就是最小化的原子操作,还可以设置不同的事务级别,包括可读未提交、可重复读这样的事务级别;关系型数据库还规定了一旦事务正确提交就不能进行数据回滚,如果要继续修改数据就只能启动一个新的事务。而这一切都是为了保证数据库系统是一个强一致性系统。就连架设在各个关系型数据库实例之上的分布式事务机制,也是为了保证这个目标:只要有任何一个参与分布式事务过程的数据库实例出现异常,整个分布式事务就无法正常提交,当然也就无法完成数据写操作。当然老数据是可以进行读操作的,即使某些节点出现了问题其他数据库节点也可以承担这个读操作,因为这样的操作不存在一致性改变的风险。
任何分布式系统都不可能以CAP原理中三个特性同时作为主要设计目标,要到达非常高的强一致性和较高的分区容忍性,就必须以牺牲可用性作为代价(注意是牺牲而不是完全放弃)。而分区容忍性又是分布式系统成立的基础,没有任何分区容忍性的分布式系统甚至都不能称为分布式系统;高压力的环境下又不能过度牺牲分布式系统的可用性,要知道99.99%的可用性和99.999%的可用性完全就是两个档次的分布式系统。
1-2. 数据一致性
所以类似分布式事务机制那样过度强调数据一致性的设计思路就不太受主流分布式系统设计思想欢迎,至少从目前各种分布式系统公布的设计原理来看是这样的。例如HDFS这样的分布式文件系统,首先强调的是高可用性和一定的分区容忍性其次才是数据一致性,数据一致性通过副本保证。但并不是所有副本都完成写入动作后HDFS才认为数据一致,而是只要一部分数据副本完成了写入动作,HDFS就认为数据成功写入且客户端可以调用新数据,而没有完成同步的副本将会接着进行数据同步,达到数据的最终一致性。DNS也是一种需要首先考虑高可用性和分区容忍性的分布式系统,由于DNS服务跨不同网络,所以当一个DNS配置更改后新的域名解析请求要等全球所有DNS节点都更改生效了才继续工作,但DNS的组织结构能够保证多个DNS服务节点解析www.XXXX.com这个域名的结果最终是一致的。这种牺牲系统一致性保证系统可靠性和分区容忍性的设计思路,在分布式系统领域有一个特定的称呼:BASE。基本可用(Basically Availble)、软状态(Soft-state)和最终一致(Eventual Consistency)。
在上一小节简单说明CAP原理和示例的内容中,提到两个关于一致性的概念:强一致性和最终一致性。强一致性可以概括为任何时刻客户在分布式系统中获取数据X,无论它在分布式系统的哪一个节点进行这个操作,其获取到的数据X都是一致的。从这个定义来看,分布式事务机制就是一种强一致性的实现。有强一致性就有对应的弱一致性定义,弱一致性不是说不保持数据的一致性,而是说不保证数据每时每刻都一致,也不承诺什么时候才能保证分布式系统的任何节点都能读取到一致的数据。而最终一致性是弱一致性的一种特定结果,既是承诺基于弱一致性,在经过一个数据不一致的时间窗口后,最终能保证数据一致。这个数据不一致的时间窗口在客户端看来非常短,而且分布式系统还可以通过多种方式向客户端屏蔽不一致的数据,例如主从副本方式。
————————————————
版权声明:本文为CSDN博主「说好不能打脸」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yinwenjie/article/details/60584554
CAP 与数据一致性的更多相关文章
- 初识云计算 -《AWS云端企业实战圣经》读书笔记
		原书中涉及实操的地方,在本文中被省略.一是篇幅太长,放入文中太过累赘,二是原书成书过早,现在 AWS 的界面早已变化很大,不具备参考性. 第一章 谁在使用云计算 1.什么是云计算 云计算(cloud ... 
- SpringCloud之Eureka注册中心原理及其搭建
		一.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCl ... 
- 分布式系列文章——从ACID到CAP/BASE
		事务 事务的定义: 事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元(Unit),狭义上的事务特指数据库事务. 事务的作用: 当多个应用程序并发访问 ... 
- 分布式系统理论基础 - CAP
		引言 CAP是分布式系统.特别是分布式存储领域中被讨论最多的理论,“什么是CAP定理?”在Quora 分布式系统分类下排名 FAQ 的 No.1.CAP在程序员中也有较广的普及,它不仅仅是“C.A.P ... 
- Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况
		转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点 ... 
- CAP定理
		from wikipedia CAP定理 CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致 ... 
- 关于CAP定理的个人理解
		CAP定理简介 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(C ... 
- 从分布式一致性谈到CAP理论、BASE理论
		问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ... 
- Cassandra中的数据一致性
		Cassandra中数据一致性指的是数据行在各个复制节点(replicas)上的更新和同步程度.通过提供tunable consistency,Cassandra扩展了eventual cons ... 
随机推荐
- (八)Struts2中的参数封装
			一.静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变. 例子: (1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User exten ... 
- vue Element-ui 表格多选 修改选中行背景色
			实现的效果: 整体思路方式: 1.给获取到的数据添加自定义的className 2.在点击行(row-click)和手动点击勾选框的事件(select-all)中获取到当前的row的className ... 
- 《C标准库》学习笔记整理
			简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ... 
- matlab帮助文档
			matlab的纯文本帮助命令有多种,help.lookfor.which.doc.get.type等 help命令 help命令用来查询一个函数的使用方式. help fun %fun是函数名称 ... 
- Day05_22_实例化对象的JVM内存分析
			创建对象的 JVM 内存分析 *new 运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 *方法区内存:在类加载的时候,class字节码文件被加载到该内存空间当中 *栈内存(局部变量):方法代 ... 
- python 函数对象、函数嵌套、名称空间与作用域
			一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素二 利用该特性,优雅的取代多分支的if def ... 
- 基于MATLAB的手写公式识别(7)
			今天晚上通过对原有T4模型的修改实现: 1.可以识别真彩图形.(这基本是一样大的,通过这个了解图像分割的原理) 2.在识别心脑管血药类的基础上实现数字的识别.(了解图像识别原理,熟练掌握图像分割技术) ... 
- Fiddler高级用法
			Fiddler高级用法 1. 简单用法 Fiddler作为一个基于http协议的抓包工具,一直在业界有广泛使用.很多测试或者前端在使用Fiddler时,仅仅用于查看前端和服务端之间的请求信息.包括我作 ... 
- day-26-封装-property装饰器-反射
			一.super进阶 在多继承中:严格按照mro顺序来执行 super是按照mro顺序来寻找当前类的下一类 在py3中不需要传参数,自动就帮我们寻找当前类的mro顺序的下一个类中的同名方法 在py2中的 ... 
- vue-cli 各文件夹的用途
