有没有符合ACID标准的NoSQL数据存储?
有没有符合ACID标准的NoSQL数据存储?
我将这个post作为纯粹支持对话的答案, Tim Mahy , Nawroth和CraigTP提出了可行的数据库。 由于使用了Erlang , CouchDB将会是我的首选,但是还有其他的。
我想说, ACID并不矛盾或否定NoSQL的概念……虽然似乎有鸽子expression观点的趋势,但我认为这些概念是不同的。
NoSQL基本上是关于简单的键值(例如Redis)或文档样式模式(在“文档”模型中收集键值对,例如MongoDB),作为经典RDBMS中显式模式的直接替代。 它允许开发人员不对称地处理事物 ,而传统的引擎在数据模型中实现了刚性相同 。 这是如此有趣的原因是因为它提供了一种处理变化的不同方式 ,对于更大的数据集,它提供了处理数量和性能的有趣机会。
ACID提供了有关如何将更改应用于数据库的原则。 在一个非常简单的方式,它陈述(我自己的版本):
- (A)当你做一些改变一个数据库的时候,这个改变应该总体上起作用或者失败
- (三)数据库应该保持一致(这是一个相当广泛的话题)
- (I)如果其他事情正在同时进行,他们不应该能够看到中间更新的事情
- (D)如果系统爆炸(硬件或软件)数据库需要能够自我备份; 如果它表示完成了更新,则需要确定
当谈到传播和限制的想法时,谈话会变得更加激动人心。 一些RDBMS引擎提供了执行可能具有传播元素(la 级联 )的约束(例如外键)的能力。 简单地说,一个“事物”可能与数据库中的另一个“事物”有关系,如果你改变了一个属性,它可能会要求另一个“事物”被更改(更新,删除,…许多选项)。 NoSQL数据库目前主要集中于高数据量和高stream量,似乎正在解决在任意时间范围内(从消费者angular度)发生的分布式更新的想法。 这基本上是一种通过事务pipe理的复制的特殊forms – 所以我会说,如果传统的分布式数据库可以支持ACID,那么NoSQL数据库也是如此。
一些资源可供进一步阅读:
- 维基百科关于ACID的文章
- 维基百科关于传播限制
- 维基百科(是的,我喜欢这个网站,好吗?)关于数据库规范化
- 关于CouchDB的Apache文档,很好地概述了它如何应用ACID
- 维基百科关于群集计算
- Wikipedia(再次…)关于数据库事务
更新(2012年7月27日): 链接到维基百科文章已更新,以反映当前回复此帖的文章版本。 请注意, 目前维基百科的文章已被广泛修改!
那么,根据维基百科关于NoSQL的旧版本:
NoSQL是一个推动松散定义的非关系型数据存储类的运动,它破坏了关系数据库和ACID保证的悠久历史。
并且:
这个名字试图描述越来越多的非关系型分布式数据存储的出现,这些数据存储通常不会提供ACID保证。
和
NoSQL系统通常提供弱一致性保证,例如最终一致性和仅限于单个数据项的事务,尽pipe可以通过添加辅助中间件层来实施完全的ACID保证。
所以,简而言之,我认为“NoSQL”数据存储的一个主要优点是它明显缺乏 ACID属性。 此外,恕我直言,越多的人试图实施和强制ACID属性,越远离你所得到的“NoSQL”数据存储的“精神”,越接近你得到的“真正的” RDBMS (当然,相对来说)。
但是,所有这些都说“NoSQL”是一个非常模糊的术语,可以单独解释,并且很大程度上取决于你有多less纯粹主义观点。 例如,大多数现代RDBMS系统实际上并没有遵循Edgar F. Codd的关系模型的 所有 规则 !
采取务实的态度,看起来Apache的CouchDB最接近于兼容ACID兼容性,同时保留了松散耦合的非关系型“NoSQL”思路。
在这个问题中,有人必须提到OrientDB :OrientDB是一个支持完全ACID事务的less数几个NoSQL数据库之一。 ACID不仅仅是RDBMS,因为它不是关系代数的一部分。 所以有可能有一个支持ACID的NoSQL数据库。
这个function是我在MongoDB中最缺的一个
请确保您阅读关于NoSQL数据库的Martin Fowler介绍 。 和相应的video。
首先,我们可以区分两种NoSQL数据库:
- 面向聚合的数据库;
- 面向graphics的数据库(例如Neo4J)。
通过devise,大多数面向graphics的数据库都是ACID !
那么,其他types呢?
在面向聚合的数据库中,我们可以把三个子types:
- 基于文档的NoSQL数据库(例如MongoDB,CouchDB);
- Key / Value NoSQL数据库(例如Redis);
- 列家族NoSQL数据库(例如Hibase,Cassandra)。
我们在这里称之为Aggregate的是埃里克·埃文斯(Eric Evans)在其领域驱动devise ( Domain-Driven Design)中将其定义为一个给定有界上下文中的实体和价值对象的自足。
因此,聚合是我们作为一个单元进行交互的一组数据。 聚集形成ACID操作与数据库的边界。 (马丁福勒)
因此, 在总体层面上,我们可以说大多数NoSQL数据库都可以像ACID RDBMS一样安全 ,并且具有适当的设置。 从源头上来说,如果你调整你的服务器以达到最佳速度,你可能会遇到一些非ACID。 但复制将有所帮助。
我的主要观点是,您必须像现在一样使用NoSQL数据库,而不是(作为廉价)RDBMS的替代品。 我看到太多项目滥用文件之间的关系。 这不能是ACID。 如果您停留在文档级别,即在总体边界,则不需要任何交易。 而且你的数据和ACID数据库一样安全,即使它不是真正的ACID,因为你不需要这些事务! 如果您需要事务并立即更新几个“文档”,那么您现在不再是NoSQL世界 – 所以请使用RDBMS引擎!
ACID和NoSQL是完全正交的。 一个并不意味着另一个。
我的桌子上有一个笔记本,我用它来logging我还需要做的事情。 这个笔记本是NoSQL数据库。 我使用带有“页面caching”的线性search来查询它,所以我并不总是必须search每一页。 这也符合ACID标准,因为我确保我一次只写一个东西,从来没有读过它。
NoSQL只是意味着它不是SQL。 许多人都感到困惑,认为这意味着高度可扩展的“狂野西部”超快速存储。 它不。 这并不意味着键值存储或最终的一致性。 所有这一切意味着“不是SQL”,在这个星球上有很多数据库,其中大部分都不是SQL (需要引用) 。
你可以在其他答案中find很多例子,所以我不需要在这里列出它们,但是对于各种操作,有非SQL数据库兼容ACID,有些只有ACID用于单个对象写入,而有些则保证更多。 每个数据库是不同的。
“NoSQL”不是一个明确的术语。 这是一个非常模糊的概念。 因此,甚至不可能说什么是什么,什么不是“NoSQL”产品。 几乎所有标签上都贴有标签的产品都不是关键价值商店。
是的,MarkLogic Server是一个与ACID事务协同工作的NoSQL解决scheme(我喜欢称之为文档数据库)
NoSQL的祖父:ZODB是符合ACID标准的。 http://www.zodb.org/
但是,它只是Python。
如果你正在寻找一个兼容ACID的键/值存储,那就是Berkeley DB 。 在graphics数据库中 ,至lessNeo4j和HyperGraphDB提供了ACID事务(HyperGraphDB实际上使用Berkeley DB来进行低级存储)。
看看CAP定理
编辑:RavenDB似乎是符合ACID
要添加到替代列表中,另一个完全兼容ACID的NoSQL数据库是GT.M。
Hyperdex Warp http://hyperdex.org/warp/ Warp(ACID特性)是专有的,但是Hyperdex是免费的。
db4o的
与roll-your-own持久性或序列化不同,db4o是ACID事务安全的,并允许在运行时查询,复制和模式更改
NewSQL
这个概念维基百科的贡献者定义为:
一类现代关系数据库pipe理系统,它们试图为在线事务处理(OLTP)读写工作负载提供与NoSQL系统相同的可扩展性能,同时仍保持传统数据库系统的ACID保证。
[1][2][3]
参考
[1]
南希·林奇(Nancy Lynch)和塞思·吉尔伯特(Seth Gilbert), “布鲁尔的猜想和一致的,可用的,分区宽容的networking服务的可行性” ,ACM SIGACT新闻,第33卷第2期(2002) 51-59。
[2]
“Brewer的CAP定理” ,julianbrowne.com,Retrieved 02-Mar-2010
[3]
“布鲁斯CAP分布式系统定理” ,royans.net
Tarantool是一个完全的ACID NoSQL数据库。 您可以发出CRUD操作或存储过程,所有内容都将严格按照ACID属性运行。 你也可以在这里阅读: http : //stable.tarantool.org/doc/mpage/data-and-persistence.html
等一下就结束了
符合ACID标准的NoSQL数据库已经出来———–看看citrusleaf
BergDB是一个轻量级的开源NoSQL数据库,从一开始就运行ACID事务。 实际上,BergDB比大多数SQL数据库要“更”ACID,因为改变数据库状态的唯一方法是运行具有最高隔离级别的SQL事务(SQL术语:“serializable”)。 不会有任何问题与脏读,不可重复的读取,或幻像读取。
在我看来,数据库仍然是高性能的; 但不要相信我,我创build了这个软件。 试试吧,而不是。
VoltDB是声明ACID合规性的进入者,虽然它仍然使用SQL,但其可扩展性目标是相同的
虽然它只是一个embedded式引擎而不是服务器,但是leveldb具有WriteBatch并且可以打开同步写入来提供ACID行为。
节点levelUP是事务性的,并build立在leveldb上https://github.com/rvagg/node-levelup#batch
MarkLogic也是ACID complient。 我认为现在是最大的球员之一。
不仅NoSQL不是通过devise符合ACID标准的。 NoSQL运动包含BASE(基本可用,软状态,最终一致性),声称与ACID相反。 NoSQL数据库通常被称为最终组成的数据库。 要理解你应该深入到CAP定理(又称布鲁尔定理)
访问http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
许多现代的NoSQL解决scheme不支持ACID事务(primefaces隔离的多键更新),但是其中大多数支持允许您在应用程序级别上实现事务的基元。
如果一个数据存储支持每个关键字线性化和比较和设置(文档级别的primefaces性),那么它足以实现客户端事务,更多的有以下几种select可供select:
-
如果你需要Serializable隔离级别,那么你可以按照谷歌用于Percolator系统或Cockroach Lab的CockroachDB相同的algorithm。 我已经博客了,并创build了一个一步一步的可视化 ,我希望这将有助于你了解algorithm背后的主要思想。
-
如果你期望很高的争用,但你有读取提交的隔离级别,那么请看看Peter Bailis的RAMP交易 。
-
第三种方法是使用补偿交易也被称为传奇模式。 它在80年代后期在萨格斯论文中被描述,但随着分布式系统的增加而变得更加实际。 请参阅应用佐贺模式谈话的灵感。
适用于客户端事务的数据存储列表包括具有轻量级事务的Cassandra,具有一致桶的Riak,RethinkDB,ZooKeeper,Etdc,HBase,DynamoDB,MongoDB等。