NOSQL(四)放宽一致性约束

《NoSQL精粹》读书笔记,转载请注明出处《jiq?钦‘s technical Blog》

前面已经提到过,催生NoSQL的主要原因是:需要一种能够运行在大集群上的数据库。但是从关系型数据库迁移到面向集群的NoSQL数据库,最大的一个改变就是针对一致性的思考方式。关系型数据库通过“强一致性”避免各种问题,而NoSQL并非如此。

1
更新一致性

两个用户同时修改同一份数据,会发生写冲突。服务器肯定会以特定顺序处理这两个请求,写冲突即后者提交更新请求时所依据的数据都不是前者更新过的。

单服务器必定具备更新一致性,可以通过并发控制机制来保证一致性,有两种方式:“悲观”方式和“乐观”方式,前者是为了避免冲突,在写入之前先请求加锁,而后者允许冲突,最常见的就是条件更新,即在执行更新操作前先判断数据的当前值是否和上次读入的相同,是则成功更新否则更新失败。无论如何数据只能以一种更新顺序被处理,悲观方式和乐观方式都能够用于避免写冲突。

分布式环境处理写冲突:在分布式环境下:

1) 如果是“对等复制”的分布模型,同一份数据有多个备份,每个服务器处理更新请求的顺序可能不同,最终造成更新后保存的值不相同。这时可以采取一种叫做写入仲裁”的方式来避免写冲突,即若发生两个相互冲突的写入操作,只有其中一个操作能为超过半数的节点所认可。

2) 如果是“主从复制”分布模型,采取的方法是:将某份数据的所有更新操作都交由一个节点执行,通过并发控制机制保证更新一致性。

2
读取一致性

某客户端在另一个客户端写入操作过程中读取数据,则会发生“读写冲突考虑一个包含商品项和运费的订单,A用户可以更新,B用户可以读取,A用户更新订单时会先更新了其中商品项,再更新运费,恰巧在两个写入操作之间B用户读出订单,就会导致数据不一致,这就是读写冲突现象。

单服务器必定具备读取一致性,比如关系型数据库通过“事务”这个概念,将两个写入操作封装到一个事务中,确保其它用户读出的数据要么是事务执行之前的值,要么是事务执行之后的值。

分布式环境处理读写冲突:大多数NoSQL数据库,尤其是面向聚合的数据库不支持事务,但是聚合数据单元支持“原子更新”,所以聚合内部可以保持读取一致性,可以将商品项和运费都放在一个订单聚合中。很显然我们不可能将所有数据放入一个聚合,当涉及多个聚合的更新操作时,无法保证读取一致性。

分布式环境下,不论是主从复制还是对等复制(从不同副本读取数据),会引发另一种新的不一致问题,假设某个酒店的在线订房,最后只剩下一间房间,分隔伦敦和洛杉矶两地的A和B两夫妻在电话讨论要不要订这间房,此时C在北京将这间房订下,但是这个更新的数据到达洛杉矶副本的时间比到达伦敦副本的时间早,这就导致A和B再次打开浏览器看到不一样的结果,这也是一种“读取一致性”,从不同的副本获取同一个数据项时,得到的值不同。此时若要保持强一致性:

1) 若是“对等复制”分布模型,可以采取一种叫做“读取仲裁”的方式;

2) 若是“主从复制”分布模型,只需从主节点读取数据就好了。

但是这个更新操作最终还是会传播到所有副本中,这就是所谓的“最终一致性”。

3
放宽一致性约束

要真正做到一致性,必须放弃系统中的其他一些特性,而这些特性偏偏可能是必不可少的,因此通常需要针对不同场景牺牲一定的一致性来保障其他特性。比如单服务器关系型数据库中通过事务保证较强的一致性,然而事务系统通常又具备放松“隔离级别”的功能,甚至有的关系型数据库为了追求性能可以完全放弃事务。

CAP理论:这是NoSQL领域中需要放宽一致性约束的原因。此定理的基本表述是:在一致性(Consistency)、可用性(Availability)、分区忍受性(Partition tolerance)三个属性中,最多只能同时满足其中两个。

一致性:即前面提到的更新一致性、读取一致性、复制一致性等。

可用性:分布式系统中某个无故障节点所接收的每一个请求,无论成功或是失败都必将得到响应。

分区忍受性:发生脑裂是集群仍然可用。脑裂即通信故障导致集群被分割成多个无法相互通信的网络分区。

CAP理论本质:一旦发生脑裂,集群就不可用,这个代价是非常巨大的,因此集群必须要满足“分区忍受性”,即发生脑裂时系统仍然可用。这就是CAP的精髓,CAP又可以表述为:“当分布式系统可能会遭遇脑裂时,我们需要在一致性和可用性之间做一个权衡”。

特别注意,这并不是一个二选一的过程,通常情况下我们都会略微舍弃“一致性”,以获取某种程度的“可用性”,这样产生的系统几部具备完美的可用性也不具备完美的一致性,两种不完美结合起来,却能够满足特定需求。

可用 = 延迟合理:回顾一下可用性的含义,其实与其考虑如何权衡“一致性”和“可用性”,如何考虑如何权衡“一致性”和“延迟”,因为无故障节点处理请求时,若超过了能忍受的最大延迟时间,我们就应该放弃操作,认为节点不可用。

放弃强一致性:从前面一致性介绍可以看到,要想保证较强的一致性,“主从分布”模型需要针对主节点进行读写,“对等复制”分布模型需要通过仲裁的方式,参与的节点越多,获得的一致性越强,可见这两种模型下要保证较强一致性都需要在“延迟”上做很大的牺牲。加之分布式环境下允许出现“更新不一致”或者“读取不一致”的场景很多。因此在分布式环境下,通常需要牺牲一定的一致性来获得较低的延迟。

 

此外、延迟还和持久性相关,可以舍弃一部分“持久性”来减小延迟,比如让数据库大部分时间都在内存中运行,更新操作也直接写入内存,并且定期将数据变更写回磁盘。

时间: 2024-10-10 08:58:32

NOSQL(四)放宽一致性约束的相关文章

NoSQL数据库:数据的一致性

NoSQL数据库:数据的一致性 读取一致性 强一致性 在任何时间访问集群中任一结点,得到的数据结果一致: 用户一致性       对同一用户,访问集群期间得到的数据一致:        解决用户一致性:使用粘性会话,将会话绑定到特定结点来处理:        这样会降低负载均衡器的性能: 最终一致性       集群中各结点间由于数据同步不及时造成暂时的数据不一致,但数据同步完成后,最终具有一致性: 更新一致性 悲观方式 使用写锁 大幅降低系统响应能力 可能导致死锁 乐观方式 先让冲突发生,再检

Nosql 之 Redis数据库

1.redis基础入门2.redis应用进阶 一.概念redis是一个开源的键-值,即是缓存又是存储,支持持久化,借助sentinel实现一定意义的高可用,数据结构服务器:string,list,hash,set ,sorted set,bitmap,hyperloglognosql 四种流派:key-value 键值型 :Memcached redisdocumemtation文档型 :Mongodbcolumu family列式型 : Hbasegraph图像型:Neo4j 二.安装redi

十分钟了解分布式计算:Petuum

Petuum是一个分布式机器学习专用计算框架,本文介绍其架构,并基于文章 More Effective Distributed ML via a Stale Synchronous Parallel Parameter Server,NIPS 2013 重点探讨其核心内容SSP协议. 主要思想 Parameter server提供了一个易于读写Global模型参数的接口,而SSP协议允许distributed workers读写本地缓存中stale版本的参数(而不是每次都花大量时间时间等待cen

《大数据时代》简要笔记

一.大数据时代处理数据理念上的三大转变 1.要全体不要抽样(不用随机的方法,而是采用所有的数据) 2.要效率不要精确(接受数据的不精准和不完美,反而可以更好的进行预测,适用于精确度不要求那么极端的任务) 3.要相关不要因果(不一定非要知道原因,只要知道结果) 二.面对新领域和新概念应有的态度 1.努力在可以应用,可以扩展的地方应用它扩展它 2.在不能应用的地方,就停下来 三.处理技术 1.谷歌的MapReduce和开源的Hadoop平台 2.数据不需要用传统的数据库表格来整齐的排列,如NoSQL

Flask之旅《Flask Web开发:基于Python的Web应用开发实战》学习笔记

<Flask Web开发:基于Python的Web应用开发实战> 点击上方的"目录"快速到达哦! 虽然简单的网站(Flask+Python+SAE)已经上线,但只是入门.开发大型网站,系统地学习一遍还是有必要的. 1 虚拟环境 2016-6-8 书上介绍了 virtualenv,每个venv都会拷贝一份packages到项目 /venv目录. virtualenv venv venv\Scripts\activate.bat (venv) $ pip freeze >

Spring Boot 入门之缓存和 NoSQL 篇(四)

原文地址:Spring Boot 入门之缓存和 NoSQL 篇(四) 博客地址:http://www.extlight.com 一.前言 当系统的访问量增大时,相应的数据库的性能就逐渐下降.但是,大多数请求都是在重复的获取相同的数据,如果使用缓存,将结果数据放入其中可以很大程度上减轻数据库的负担,提升系统的响应速度. 本篇将介绍 Spring Boot 中缓存和 NoSQL 的使用.上篇文章<Spring Boot 入门之持久层篇(三)>. 二.整合缓存 Spring Boot 针对不同的缓存

NoSQL数据模型详解(四)の聚合型小结

背景 在前三篇文章中已经介绍了NoSQL中属于聚合模型的三种数据库:键值型.文档型.列族型.下面针对三种聚合数据模型的共同点和不同点加以分析以便很好的来认识掌握各自的特点. 相同点 三种面向聚合的数据模型的共同点是,他们都是用聚合这一概念,而且聚合中都有一个可以查找其内容的索引键.在集群上运行时,聚合都是重点环节,因为数据库必须保证将聚合内的数据存在同一节点上.聚合还是"更新"操作的最小数据单位,对于事务控制来说,以聚合为操作单元,其大小正合适. 不同点 键值数据模型将聚合看作不透明的

四类NoSQL数据库适用场景总结

键值数据库 适用案例 现在讲几个适合使用键值数据库的情况. 1 存触会话信息 通常来说,每一次网络会话都是唯一的,所以分配给它们的session id 值也各不相同.如果应用程序原来要把session id 存在磁盘上或关系型数据库中,那么将其迁移到键值数据库之后, 会获益良多, 因为全部会话内容都可以用一条PU T 请求来存放,而且只需一条GET 请求就能取得.由于会话中的所有信息都放在一个对象中,所以这种" 单请求操作" (single-request operation ) 很迅

什么是NoSQL

转载自http://www.codingkit.com/mongodb/nosql.html NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". 在现代的计算系统上每天网络上都会产生庞大的数据量. 这 些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理. 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这