NoSQL数据库会导致偶尔的数据丢失吗?


8

我目前正在评估要用于新项目的数据库,这将需要插入和查询大量交易数据。我们的团队倾向于Cassandra,但随后我阅读了这篇文章,似乎暗示使用不符合ACID的数据库可能会导致偶尔的数据丢失:

http://www.dbms2.com/2010/09/21/acid-compatible-transaction-integrity/

我在网络上找不到任何进一步的信息,也无法理解非ACID合规性意味着数据丢失的可能性。谁能阐明一些想法?


Neo4j是一个实际上符合 ACID的NOSQL(图形)数据库。它具有完整的事务支持和持久的持久性。Neo4j还使用事务日志来保护写入操作,然后再将其应用于数据存储。免责声明:我为Neo Technology工作。
Michael Hunger

3
根据墨菲定律(和我自己的经验),任何数据库都可能丢失数据。
a_horse_with_no_name

更好的措词可能是“ NoSQL数据库比传统的RDBMS具有更大的数据丢失或损坏机会吗?” 还是有点模糊。
所有行业的乔恩

几种NoSQL产品提供单行ACIDity。很少提供多行ACID。如果用例是流单键写入,那么您可以成功。对于许多业务领域,在进行更改之前,必须使多个行同时保持一致很重要。
Michael Green

Answers:


6

  • 原子性
  • 一致性
  • 隔离
  • 耐用性

这对您的意义是“每个写操作仅执行一次(没有重复的记录),但在完成操作时将完全存储在数据库中”,并且每次读取时,您都会得到想要的数据。

NoSQL数据库的问题在于它们通常是分布式的(这正是人们想要的便宜的平面可扩展系统),这意味着将数据复制到所有节点需要花费时间。有时有可能在写入过程中进行读取,并在新数据出炉时以旧数据结束。

您为速度而牺牲纯度。

这是我的答案的简短版本,我不确定需要进一步解释什么。问我问题!


1
您所描述的听起来像即时一致性(RDBMS)与最终一致性(NoSQL)。但是,链接的文章讨论的是实际丢失数据(不仅仅是丢失数据不一致),而且我不了解ACID遵从与数据丢失有什么关系。
删除

1
耐久性极有可能。就是这种情况,这就是我要描述的内容(这使得数据似乎丢失了)。ACID的意义在于您不会丢失数据。曾经 (好吧,它可能会丢失而损坏)
jcolebrand

我看过的所有NoSQL数据库(HBase,Cassandra,Redis)都使用预写日志,这些日志可以重播,以防数据库在持久保存更改之前崩溃。这是否意味着这种批评不适用于任何这些数据库?
德尔

我会这样想。我将在明天再次讨论,但现在要上床睡觉。希望您能在此之前得到我的帮助;-)
jcolebrand

6

虽然这是一个古老的问题...

简而言之,您可以将ACID理解为在任何预期情况下数据完整性/安全性的保证。就像通用编程一样,所有麻烦都来自多线程。

NoSQL上最大的问题主要是ACI。D(耐久性)通常是一个单独的问题。

如果您的数据库是单线程的(因此只有一个用户可以一次访问),则这是本机ACI兼容的。但是我相信几乎没有服务器可以拥有这种奢侈。

如果您的数据库需要多线程-同时服务多个用户/客户端-您必须需要符合ACI的事务。否则您将获得无声的数据损坏,而不是简单的数据丢失。这要可怕得多。简而言之,这与通用多线程编程完全相同。如果没有诸如锁之类的适当机制,则将获得未定义的数据。DB中的机制称为完全ACID合规性

许多YesSQL / NoSQL数据库都向自己宣传符合ACID的数据库,但实际上很少有数据库确实这样做。

  • 不符合ACID =在多用户(客户端)环境下,您将始终得到不确定的结果。我什至不认为这是哪种数据库。

  • 单行/键ACID兼容=如果一次只修改单个值,您将获得有保证的结果。但是同时进行多行/键更新的结果不确定(=静默数据损坏)。当前大多数流行的NoSQL数据库(包括Cassandra,MongoDB,CouchDB等)……这些类型的DB仅对单行事务安全。因此,您需要确保您的数据库逻辑不会触及事务中的多行。

  • 多行/关键ACID合规性=任何操作都将始终保证结果。作为RDBMS,这是最低要求。在NoSQL领域,很少有这样做。Spanner,MarkLogic,VoltDB,FoundationDB。我什至不确定还有更多解决方案。这些类型的数据库真的很新鲜,因此对于它们的功能或局限性几乎一无所知。

无论如何,这是比较(D(耐久性))。因此,不要忘记也检查耐久性属性。比较耐用性非常困难,因为范围变得太宽。我不太了解这个话题...

  • 没有耐久性。您将随时丢失数据。

  • 安全地存储在磁盘上。当您获得时COMMIT OK,数据将保证在磁盘上。如果磁盘损坏,则会丢失数据。

而且,即使在符合ACID的DB上也存在差异。

  • 有时符合ACID的要求/您不需要配置/不需要自动的东西.. /有些组件不符合ACID的要求/非常快,但是您需要为此关闭某些功能/如果您使用特定的模块,则要符合ACID的要求... = 我们默认情况下不会捆绑数据安全性。那是附加的,选择的或分开出售的。不要忘记下载,组装,设置和发布正确的命令。无论如何,数据安全性可能会被静默忽略。自己做。自己检查一下。祝你好运,不要犯任何错误。团队中的每个人都必须是完美的DBA,才能安全地使用这种DB。MySQL的。

  • 始终符合ACID =我们不以性能或其他任何东西来交换数据安全。数据安全性与该数据库包捆绑在一起。大多数商业RDBMS,PostgreSQL。

以上是典型DB的实现。但是,任何其他硬件故障都可能损坏数据库。例如内存错误,数据通道错误或任何其他可能的错误。因此,您需要额外的冗余,并且真正具有生产质量的DB必须提供容错功能。

  • 无冗余。如果您的数据已损坏,则会丢失所有数据。

  • 备份。您进行快照复制/还原。您上次备份后丢失了数据。

  • 在线备份。您可以在数据库运行时执行快照备份。

  • 异步复制。每秒备份一次(或指定时间段)。如果计算机停机,则该数据库保证仅通过重新引导即可恢复数据。您在最后一秒之后丢失了数据。

  • 同步复制。立即备份每个数据更新。您始终具有原始数据的确切副本。如果原点损坏,请使用副本。

到目前为止,我看到许多数据库实现都缺少其中的许多。而且我认为,如果他们缺乏适当的ACID和冗余支持,用户最终将丢失数据。


5

“这取决于”就是答案-有配置选项,这里提到

小问题:数据库可能是持久性的,但不符合ACID,因为ACID是功能(ACID)的超集。我不认为任何NoSQL数据库都可以声称是完全ACID,但其中许多人可能声称可以通过单独的子要求,例如持久性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.