我目前正在评估要用于新项目的数据库,这将需要插入和查询大量交易数据。我们的团队倾向于Cassandra,但随后我阅读了这篇文章,似乎暗示使用不符合ACID的数据库可能会导致偶尔的数据丢失:
http://www.dbms2.com/2010/09/21/acid-compatible-transaction-integrity/
我在网络上找不到任何进一步的信息,也无法理解非ACID合规性意味着数据丢失的可能性。谁能阐明一些想法?
我目前正在评估要用于新项目的数据库,这将需要插入和查询大量交易数据。我们的团队倾向于Cassandra,但随后我阅读了这篇文章,似乎暗示使用不符合ACID的数据库可能会导致偶尔的数据丢失:
http://www.dbms2.com/2010/09/21/acid-compatible-transaction-integrity/
我在网络上找不到任何进一步的信息,也无法理解非ACID合规性意味着数据丢失的可能性。谁能阐明一些想法?
Answers:
酸指
这对您的意义是“每个写操作仅执行一次(没有重复的记录),但在完成操作时将完全存储在数据库中”,并且每次读取时,您都会得到想要的数据。
NoSQL数据库的问题在于它们通常是分布式的(这正是人们想要的便宜的平面可扩展系统),这意味着将数据复制到所有节点需要花费时间。有时有可能在写入过程中进行读取,并在新数据出炉时以旧数据结束。
您为速度而牺牲纯度。
这是我的答案的简短版本,我不确定需要进一步解释什么。问我问题!
虽然这是一个古老的问题...
简而言之,您可以将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和冗余支持,用户最终将丢失数据。