5

据我所知,NoSQL 数据库对于高强度数据读取应用程序可能是一个不错的选择,但如果您需要做大量数据更新并且事务性对您来说非常重要(如果没有酸合规性)。正确的?可能太简单了。

但无论如何,假设我部分正确,至少我现在担心 NoSQL 数据库如何维护您正在读取或写入的数据的“读取一致”视图。还是他们?如果他们不这样做,那不是一个很大的问题吗?

我的意思是,如果您正在阅读(或更新)的数据在您阅读时发生变化,那么您可能会得到一个不一致/脏的结果集。来自 Oracle rdbms 背景,所有这些都是为您处理的,我发现缺乏读取一致性并不是一个大问题,这让我感到困惑。很可能我错过了所有这一切的一些关键点。有人可以让我直截了当吗?

4

4 回答 4

5

我是 Oracle NoSQL 数据库的开发人员,将回答您与该特定 NoSQL 系统相关的问题。

Oracle NoSQL 数据库 API 允许程序员通过每个 API 调用指定读取一致性级别。四个可能的值,从最严格到最宽松,是 Absolute、Time、Version 和 None。Absolute 表示始终从复制主机读取,以便返回最新的值。“时间”表示系统可以从任何副本返回一个值,该值至少在主节点的某个时间增量内(例如,从主节点 2 秒内的任何副本读取值)。对系统的每次读写调用都会返回一个“版本句柄”。当指定 Consistency.Version 时,可以将此版本句柄传递给任何读取调用,并告诉系统从至少与该版本一样最新的任何副本读取。这对于读取修改写入(又名 CAS)场景很有用。最后一个值 Consistency.None 表示可以使用任何副本(即不保证一致性)。

我希望这是有帮助的。

查尔斯·兰姆

于 2012-04-30T14:53:06.103 回答
3

NoSQL 数据库可以是读一致的,尽管如果不是严格如此,这通常不是什么大问题,请查看CAP 定理。在这方面已经进行了大量研究,我建议阅读Amazon 的 Dynamo 论文,以快速了解分布式系统(如 NoSQL 数据库)面临的一些问题和解决方案。

于 2012-04-27T13:24:43.120 回答
2

MongoDB 允许应用程序使用“写关注”来选择所需的读取一致性级别。此概念允许您的应用程序阻塞,直到给定写入满足特定条件。

例如,只要将操作传送到主服务器,您就可以认为任何写入都是成功的。或者,您可以阻塞直到写入已传播到副本集中的大多数节点。通过这种方式,您可以根据口味混合性能/一致性。

于 2012-05-04T17:36:17.003 回答
1

这取决于您使用的 NoSQL 数据库,因为每个数据库都实施不同的策略。例如,您可以阅读Riak对其“最终一致性”模型的解释或 Lars Hofhansel 关于HBase 中 ACID 的文章

于 2012-04-27T14:50:43.623 回答