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

del*_*del 9 nosql

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

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

我在网上找不到任何关于此的更多信息,也无法理解非 ACID 合规性如何意味着可能会发生数据丢失。任何人都可以透露一些信息吗?

Eon*_*nil 7

虽然这是多年的问题......

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

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

如果您的数据库是单线程的——所以一次只有一个用户可以访问——这本身就是 ACI 兼容的。但我确信几乎没有服务器可以拥有这种奢侈。

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

许多 YesSQL/NoSQL 数据库标榜自己符合 ACID,但实际上,真正做到的却很少。

  • 不符合 ACID = 在多用户(客户端)环境下,您将始终获得未定义的结果。我什至不认为什么样的数据库会这样做。

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

  • 多行/键 ACID 合规性 = 您将始终获得任何操作的保证结果。这是作为 RDBMS 的最低要求。在 NoSQL 领域,很少有人这样做。扳手、MarkLogic、VoltDB、FoundationDB。我什至不确定还有更多解决方案。这些类型的 DB 非常新鲜,因此大多数情况下对它们的能力或局限性一无所知。

反正这是一个比较,除了D(urability)。所以不要忘记检查耐久性属性。很难比较耐用性,因为范围变得太宽了。我不太了解这个话题……

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

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

此外,即使在符合 ACID 的数据库上也存在差异。

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

  • 始终符合 ACID = 我们不会用性能或任何东西来交换数据安全。数据安全是这个数据库包的强制捆绑。大多数商业 RDBMS,PostgreSQL。

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

  • 没有冗余。如果您的数据损坏,您将丢失所有数据。

  • 备份。您进行快照复制/恢复。您在上次备份后丢失数据。

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

  • 异步复制。每秒(或指定时间段)备份。如果机器停机,该数据库保证只需重新启动即可取回数据。您在最后一秒后丢失数据。

  • 同步复制。每次数据更新时立即备份。您始终拥有原始数据的精确副本。如果原点中断,请使用副本。

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


jco*_*and 6

是指

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

这对您来说意味着“每个写入操作只会执行一次(没有重复的记录),但在操作完成后将完全存储在数据库中”,并且每次读取时,您都会获得想要的数据.

NoSQL 数据库的问题在于它们通常是分布式的(这是人们想要的,廉价的可扩展的系统),这意味着将数据复制到所有节点需要时间。有时可能会在写入期间读取并在新数据出来时以旧数据结束。

你正在为速度牺牲纯度。

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


Mor*_*ker 5

“这取决于”是答案 - 这里提到了配置选项。

小吹毛求疵:数据库可以持久但不符合 ACID,因为 ACID 是特性的超集 (ACID)。我不认为任何 NoSQL 数据库都可以声称完全是 ACID,但其中许多可能声称通过了个别子要求,例如持久性。