NoSQL 数据库:读取一致性如何?
Posted
技术标签:
【中文标题】NoSQL 数据库:读取一致性如何?【英文标题】:NoSQL databases: what about read consistency? 【发布时间】:2012-05-08 05:19:56 【问题描述】:据我所知,NoSQL 数据库对于高强度数据读取应用程序来说可能是一个不错的选择,但如果您需要同时进行大量数据更新并且事务性对您来说非常重要(与没有酸合规性)。正确的?可能太简单了。
但无论如何,假设我部分正确,至少我现在担心 NoSQL 数据库如何维护您正在读取或写入的数据的“读取一致”视图。还是他们?如果他们不这样做,那不是一个很大的问题吗?
我的意思是,如果您正在读取(或更新)的数据在您读取时发生变化,那么您可能会得到不一致/脏的结果集。来自 Oracle rdbms 背景,所有这些都是为您处理的,我发现缺乏读取一致性并不是一个大问题,这让我感到困惑。很可能我错过了所有这一切的一些关键点。谁能直截了当?
【问题讨论】:
【参考方案1】:我是 Oracle NoSQL 数据库的开发人员,将回答您与该特定 NoSQL 系统相关的问题。
Oracle NoSQL 数据库 API 允许程序员通过每个 API 调用指定读取一致性级别。四个可能的值,从最严格到最宽松,是 Absolute、Time、Version 和 None。 Absolute 表示始终从复制主机读取,以便返回最新的值。 “时间”表示系统可以从任何副本中返回一个值,该值至少在主节点的某个时间增量内(例如,从主节点 2 秒内的任何副本中读取值)。对系统的每次读写调用都会返回一个“版本句柄”。当指定 Consistency.Version 时,可以将此版本句柄传递给任何读取调用,并告诉系统从至少与该版本一样最新的任何副本读取。这对于读取修改写入(又名 CAS)场景很有用。最后一个值 Consistency.None 表示可以使用任何副本(即不保证一致性)。
我希望这会有所帮助。
查尔斯·兰姆
【讨论】:
【参考方案2】:NoSQL 数据库可以是读一致的,虽然如果不是严格来说这通常不是什么大问题,请查看CAP theorem。在这方面已经做了很多研究,我建议阅读Amazon's Dynamo paper,以快速了解分布式系统(如 NoSQL 数据库)面临的一些问题和解决方案。
【讨论】:
【参考方案3】:MongoDB 允许应用程序使用“写入关注”来选择所需的读取一致性级别。此概念允许您的应用程序阻塞,直到给定写入满足特定条件。
例如,只要操作与主服务器通信,您就可以认为任何写入都是成功的。或者,您可以阻塞直到写入已传播到副本集中的大多数节点。通过这种方式,您可以根据口味混合性能/一致性。
【讨论】:
您能详细说明一下吗?喜欢,您能否提供一些此类配置的文档参考?【参考方案4】:这取决于您使用的 NoSQL 数据库,因为每个数据库都实施不同的策略。例如,您可以阅读 Riak's explanation 他们的“最终一致性”模型或 Lars Hofhansel 在 ACID in HBase 上的文章
【讨论】:
以上是关于NoSQL 数据库:读取一致性如何?的主要内容,如果未能解决你的问题,请参考以下文章