是否有符合 ACID 的 NoSQL 数据存储?

有没有符合 NoSQL数据存储?

112790 次浏览

“ NoSQL”不是一个定义明确的术语。这是个很模糊的概念。因此,甚至不可能说什么是“ NoSQL”产品,什么不是。并非几乎所有带有该标签的典型品牌产品都是键值商店。

更新(2012年7月27日) : 维基百科文章的链接已经更新,以反映这个答案发布时文章的最新版本。请注意,最新的维基百科文章已被广泛修订!

根据 关于 NoSQL 的维基百科文章的旧版本:

NoSQL 是一个促进 定义松散的类 破碎的非关系数据存储 有着悠久的关系历史 数据库和 ACID 保证。

还有:

这个名字是试图描述 越来越多的 非关系的分布式数据 经常没有尝试过的商店 提供 ACID 担保。

还有

NoSQL 系统通常提供弱 一致性保证,例如 最终一致性及交易 仅限于单个数据项,甚至 虽然可以施加完全的酸性 通过增加补充条款来保证 中间件层中间件层。

因此,简而言之,“ NoSQL”数据存储的主要好处之一是它独特的 属性 缺乏。此外,恕我直言,一个人越是试图实现和强制 属性,就越远离“ NoSQL”数据存储的“精神”,也就越接近“真正的”关系数据库(当然,相对而言)。

然而,尽管如此,“ NoSQL”是一个非常模糊的术语,可以有不同的解释,并且在很大程度上取决于您有多少纯粹主义的观点。例如,大多数现代 RDBMS 系统实际上并不坚持 埃德加 · F · 科德12条规则所有关系模型

从实用的角度来看,Apache 的 CouchDB似乎最接近于体现 ACID 兼容性,同时保留了松散耦合、非关系的“ NoSQL”思想。

看看 CAP 定理

编辑: RavenDB 似乎是酸兼容的

如果您正在寻找符合 ACID 的键/值存储,那么有 伯克利尸体。在 图形数据库中,至少 Neo4jHyperGraphDB提供 ACID 事务(HyperGraphDB 目前实际上使用 Berkeley DB 进行低级存储)。

VoltDB 是一个声称遵循 ACID 的参与者,虽然它仍然使用 SQL,但它的目标在可伸缩性方面是相同的

Db4o

不像滚动你自己的坚持或 序列化,db4o 是 ACID 交易安全,并允许 查询、复制和模式 在运行时发生更改

Http://www.db4o.com/about/productinformation/db4o/

我将把它作为一个纯粹支持对话的答案发布出去—— Tim MahyNawrothCraigTP都建议使用可行的数据库。由于使用 二郎CouchDB将是我的首选,但还有其他的在那里。

我想说的是,并不矛盾或否定的概念 NoSQL... 虽然似乎有一个趋势以下的意见表达的 鸽子,我想说的概念是不同的。

NoSQL 基本上是关于简单的键值(例如 Redis)或文档样式的模式(在“文档”模型中收集的键值对,例如 MongoDB) ,作为经典 RDBMS 中显式模式的直接替代。它允许开发人员不对称地处理 事情,而传统引擎在数据模型中强制执行严格的 一样。这之所以如此有趣,是因为 它提供了一种应对变化的不同方式以及对于更大的数据集,它为处理容量和性能提供了有趣的机会。

ACID 提供了有关如何将更改应用于数据库的原则。它以一种非常简单的方式陈述(我自己的版本) :

  • (A)当您更改数据库时,更改应作为一个整体工作或失败
  • (C)数据库应该保持一致(这是一个相当宽泛的主题)
  • (I)如果其他事情在同一时间发生,他们不应该能够看到中期更新的东西
  • (D)如果系统崩溃(硬件或软件) ,数据库需要能够自行恢复; 如果它说它完成了应用更新,它需要确定

当谈到 传播和约束的想法时,谈话变得更加激动人心。一些 RDBMS 引擎提供强制约束(例如外键)的能力,这些约束可能包含传播元素(如 瀑布)。简单地说,一个“东西”可能与数据库中的另一个“东西”有关系,如果更改其中一个的属性,可能需要更改另一个(更新、删除... ... 很多选项)。NoSQL数据库主要(目前)关注于高数据量和高流量,似乎正在解决分布式更新的想法,这种更新发生在(从消费者的角度来看)任意的时间框架内。这基本上是通过 交易管理的一种特殊形式的 复制——所以我想说,如果传统的分布式数据库可以支持 ACID,那么 NoSQL 数据库也可以。

进一步阅读的一些资源:

是的,MarkLogicServer 是一个 NoSQL 解决方案(我喜欢称之为文档数据库) ,可以处理 ACID 事务

等待结束了。

符合 ACID 的 NoSQL DB 已经出局——————看看 柑橘叶

在这个问题中,必须有人提到 东方数据库: OrientDB 是少数几个完全支持 ACID 事务的 NoSQL 数据库之一。ACID 不仅适用于关系数据库管理系统,因为它不是关系代数的一部分。因此,有一个支持 ACID 的 NoSQL 数据库是可能的。

这是 MongoDB 中我最怀念的一个特性

NoSQL 不仅在设计上不兼容 ACID。NoSQL 运动拥抱基础(基本可用,软状态,最终一致性)声称是相反的 ACID。 NoSQL 数据库通常称为最终组成数据库。 为了理解这些差异,你应该深入研究 CAP 定理(又名布鲁尔定理)

访问 http://www.julianbrowne.com/article/viewer/brewers-cap-theorem

要添加到备选列表中,另一个完全符合 ACID 的 NoSQL 数据库是 GTM

虽然 只有是一个嵌入式引擎,而不是服务器,但是 Leveldb具有 WriteBatch,并且能够打开同步写操作来提供 ACID 行为。

ZODB 是符合 ACID 的

但是,这只是 Python。

FoundationDB 与 ACID 兼容:

Http://www.foundationdb.com/

它具有适当的事务,因此可以以 ACID 方式更新多个不同的数据项。这是在更高层维护索引的基础。

Hyperdex 翘曲(Hyperdex Warp) http://Hyperdex.org/Warp/ Warp (ACID 功能)是专有的,但 Hyperdex 是免费的。

节点 levelUP 是事务性的,构建在 leveldb https://github.com/rvagg/node-levelup#batch

BergDB 是一个轻量级、开源的 NoSQL 数据库,从一开始就设计用于运行 ACID 事务。实际上,BergDB 比大多数 SQL 数据库“更”ACID,因为改变数据库状态的 唯一的办法是运行具有最高隔离级别的 ACID 事务(SQL 术语: “ Series alable”)。脏读、不可重复读或幻像读永远不会出现任何问题。

在我看来,数据库仍然是高性能的; 但不要相信我,我创建了软件。你自己试试吧。

请确保 您阅读了 Martin Fowler 关于 NoSQL 数据库的介绍。和相应的视频。

首先,我们可以区分两种类型的 NoSQL 数据库:

  1. 面向聚合的数据库;
  2. 面向图的数据库(例如 Neo4J)。

按照设计,最 面向图的数据库是 ACID

那其他人呢?

在面向聚合的数据库中,我们可以放置三个子类型:

  • 基于文档的 NoSQL 数据库(例如 MongoDB、 CouchDB) ;
  • 键/值 NoSQL 数据库(例如 Redis) ;
  • 列族 NoSQL 数据库(例如 Hibase、 Cassandra)。

这里我们称之为 总数,是 Eric Evans 在其 领域驱动设计中定义的,在给定的有界上下文中,实体和价值对象的自给自足。

因此,聚合就是我们所需要的数据的集合 聚集体形成了 ACID 的边界 操作数据库。(马丁福勒)

那么,在聚合级别,我们可以说大多数 NoSQL 数据库可以像 ACID RDBMS 一样安全,用适当的设置。在源代码中,如果您调优服务器以获得最佳速度,那么您可能会遇到一些非 ACID 的情况。但复制会有所帮助。

我的主要观点是,您必须使用 NoSQL 数据库,而不是将其作为 RDBMS 的(廉价)替代品。我见过太多的项目滥用文档之间的关系。这不可能是酸。如果您停留在文档级别,即聚合边界,则不需要任何事务。您的数据将与 ACID 数据库一样安全,即使它不是真正的 ACID,因为您不需要这些事务!如果您需要事务并同时更新多个“文档”,那么您就不再处于 NoSQL 世界中了——所以使用 RDBMS 引擎吧!

一些2019年的更新: 从4.0版本开始,对于需要原子性来更新多个文档或读取多个文档之间的一致性的情况,MongoDB 提供了 复制集的多文档事务

ACID 和 NoSQL 是完全正交的,一个并不意味着另一个。

我的桌子上有一个笔记本,我用它来记录我还要做的事情。这个笔记本是一个 NoSQL 数据库。我使用带有“页面缓存”的线性搜索来查询它,所以我不必总是搜索每一个页面。它还兼容 ACID,因为我确保一次只编写一个内容,而且不会在阅读时编写。

NoSQL 只是意味着它不是 SQL。许多人感到困惑,认为它意味着高度可扩展的——狂野西部——超级快速存储。不会的。这并不意味着键值存储或最终一致性。这意味着“不是 SQL”,这个星球上有很多数据库,其中大多数不是 SQL[需要引证]

你可以在其他答案中找到很多例子,所以我不需要在这里列出它们,但是有一些非 SQL 数据库符合各种操作的 ACID,有些只是单个对象写入的 ACID,而有些则保证了更多。每个数据库都是不同的。

新 SQL

这个概念 维基百科贡献者定义为:

[ ... ]一类现代关系数据库管理系统,寻求为在线事务处理(olTP)读写工作负载提供与 NoSQL 系统相同的可伸缩性能,同时仍然保持传统数据库系统的 ACID 保证

参考文献

南希 · 林奇和赛斯 · 吉尔伯特,Brewer 的猜想以及一致的、可用的、分区容忍的 Web 服务的可行性,ACM SIGACT 新闻,第33卷第2期(2002) ,第51-59页。

2010年3月2日 julianbrowne.com

[3] 分布式系统上的 Brewers CAP 定理,roans.net

Tarantool 是一个完全 ACID NoSQL 数据库。您可以发出 CRUD 操作或存储过程,所有操作都将严格按照 ACID 属性运行。你也可以在这里读到: http://stable.tarantool.org/doc/mpage/data-and-persistence.html

许多现代 NoSQL 解决方案不支持 ACID 事务(原子隔离的多密钥更新) ,但是它们中的大多数都支持允许您在应用程序级实现事务的原语。

如果一个数据存储支持每个键的线性化和比较和设置(文档级原子性) ,那么它就足以实现客户端事务,除此之外,您还有几个选项可供选择:

  1. 如果你需要串行化隔离级别,那么你可以遵循相同的算法,谷歌使用的 Percolator系统或蟑螂实验室的 蟑螂尸体。我已经在博客上介绍过了,并且创建了一个 逐步可视化,我希望它能帮助你理解这个算法背后的主要思想。

  2. 如果你期望高竞争,但它是罚款,你有读提交的隔离级别,然后请看看在 RAMP 事务的彼得拜利斯。

  3. 第三种方法是使用补偿事务(也称为 saga 模式)。它在80年代后期的 传奇故事论文中有所描述,但随着分布式系统的提出,它变得更加实际。请参阅 应用传奇模式演讲获得灵感。

适合客户端事务的数据存储列表包括具有轻量级事务的 Cassandra、具有一致存储桶的 Riak、 Rethinking DB、 ZooKeeper、 Etdc、 HBase、 DynamoDB、 MongoDB 等。

MarkLogic 也支持 ACID,我认为它是目前最大的参与者之一。

MongoDB 宣布其4.0版本将兼容多文档事务的 ACID。

版本4.2. 应该在分片设置下支持它。

Https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb

YugaByte DB 支持查询层上的 符合 ACID 的分布式 txns以及 Redis 和 CQL API 兼容性。

FoundationDB 被提及,当时它还不是开源的,两天前它已经被苹果公司开源了: Https://www.foundationdb.org/blog/foundationdb-is-open-source/

我相信它符合酸性标准。

DynamoDB 是一个 NoSQL 数据库,具有 酸性物质交易

作为 NoSQL 的发明者之一(我是 Apache CouchDB 的早期贡献者,也是2009年在 CBS Interactive/CNET 举办的 第一个 NoSQL 事件大会上的演讲者) ,我很高兴看到新的算法创造了以前不存在的可能性。卡尔文协议提供了一种新的思考物理约束的方法,比如 CAP 和 PACELC

Calvin 不使用主动/被动异步复制或主动/主动同步复制,而是使用 类似 RAFT 的协议来维护事务日志,从而在副本中断期间保持正确性和可用性。此外,每个副本上的 确定性地处理交易消除了死锁的可能性,因此只需要一轮共识就可以达成一致。这使得它甚至可以在全球范围的多云部署中快速运行。

FaunaDB 是唯一使用 Calvin 协议的数据库实现,这使得它非常适合需要类似大型机的数据完整性和 NoSQL 规模和灵活性的工作负载。

如果你加入足够的纯水并成功地掷硬币,任何东西都会变酸,或者变碱。

说一个数据库符合 ACID 意味着四个特定的事情。在定义系统(限制范围)时,我们可以任意淡化含义,使结果符合 ACID。

  • A ーー如果 NoSQL 数据库一次只允许一个记录操作,并且记录要么运行,要么不运行,那么 那是原子弹
  • C ーー如果您只允许简单的约束,比如根据已知的模式检查 JSON 模式,那么使用 这是一致的
  • I ーー如果只支持只追加事务(并且不允许模式更改) ,那么任何事情都不可能依赖于其他任何事情,即 那是独立的
  • D ーー如果您在晚上关闭所有机器并同步磁盘,那么事务将处于同步状态,或者不处于同步状态,很耐用

MongoDB 在版本中增加了对多文档 ACID 事务的支持 并在2019年的4.2版中扩展了对分布式多文档 ACID 事务的支持。

Https://www.mongodb.com/basics/acid-transactions

DynamoDB 事务为开发人员提供了原子性、一致性、, 中的一个或多个表之间的隔离和持久性(ACID) 单个 AWS 帐户和区域。

Https://aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions/