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 数据库:读取一致性如何?的主要内容,如果未能解决你的问题,请参考以下文章

Nosql

NoSQL数据库相关概念

如何选择合适的NoSQL数据库

NoSQL究竟是哪里比SQL强?以四种类型的非关系型数据库为例!

如何正确选择NoSQL数据库?选型要点有哪些?

SQL VS NoSQL 如何选择数据库