Nosql

NoSQL 數據庫會導致偶爾的數據失去嗎?

  • November 27, 2014

我目前正在評估用於新項目的數據庫,這將需要插入和查詢大量交易數據。我們的團隊傾向於 Cassandra,但後來我讀到這篇文章似乎建議使用不符合 ACID 的數據庫可能會導致偶爾的數據失去:

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

我在網上找不到任何關於此的更多資訊,也無法理解非 ACID 合規性如何意味著可能發生數據失去。任何人都可以解釋一下嗎?

雖然這是多年前的問題……

簡而言之,您可以將 ACID 理解為在任何預期情況下數據完整性/安全性的保證。就像在泛型程式中一樣,所有令人頭疼的問題都來自多執行緒。

NoSQL 最大的問題主要是 ACI。D(urability) 通常是一個單獨的問題。

如果您的數據庫是單執行緒的——因此只有一個使用者可以一次訪問——這本身就是符合 ACI 的。但我敢肯定,幾乎沒有伺服器可以擁有這種奢侈。

如果您的數據庫需要多執行緒 - 同時為多個使用者/客戶端提供服務 - 您必須需要符合 ACI 的事務。否則,您將獲得無聲的數據損壞,而不是簡單的數據失去。這要可怕得多。簡單地說,這與通用多執行緒程式完全相同。如果您沒有適當的機制(例如鎖定),您將獲得未定義的數據。DB 中的機制稱為完全 ACID 合規性

許多 YesSQL/NoSQL 數據庫都標榜自己符合 ACID,但實際上,真正做到的卻很少。

  • 不符合 ACID = 在多使用者(客戶端)環境下,您將始終得到未定義的結果。我什至不認為什麼樣的數據庫可以做到這一點。
  • 符合單行/鍵 ACID = 如果您一次只修改單個值,您將獲得有保證的結果。但同時多行/鍵更新的未定義結果(=靜默數據損壞)。**目前大多數流行的 NoSQL 數據庫包括 Cassandra、MongoDB、CouchDB ……**這些類型的數據庫僅對單行事務是安全的。因此,您需要保證您的數據庫邏輯不會觸及事務中的多行。
  • 多行/鍵 ACID 合規性 = 您將始終獲得任何操作的保證結果。這是作為 RDBMS 的最低要求。在 NoSQL 領域,很少有人這樣做。扳手、MarkLogic、VoltDB、FoundationDB。我什至不確定還有更多的解決方案。這類 DB 真的很新鮮,所以對它們的能力或限制幾乎一無所知。

無論如何,這是一個除了 D(urability) 之外的比較。所以不要忘記檢查耐久性屬性。很難比較耐用性,因為範圍太廣了。我不太了解這個話題……

  • 沒有持久性。您將隨時失去數據。
  • 安全地儲存在磁碟上。當你得到COMMIT OK時,數據就保證在磁碟上。如果磁碟損壞,您會失去數據。

此外,即使在符合 ACID 的數據庫上也存在差異。

  • 有時符合 ACID/您需要配置/不需要自動的東西../某些組件不符合 ACID/非常快,但您需要為此關閉某些東西…/如果您使用特定模組,則符合 ACID…=**我們預設情況下不會捆綁數據安全。這是一個附加組件、選項或單獨出售。不要忘記下載、組裝、設置和發出正確的命令。無論如何,數據安全可能會被默默地忽略。自己做。自己檢查一下。祝你好運不要犯任何錯誤。**您團隊中的每個人都必須是完美的 DBA 才能安全地使用這種 DB。mysql。
  • 始終符合 ACID = 我們不會用性能或任何東西來交換數據安全。數據安全是這個 DB 包的強制捆綁。大多數商業 RDBMS,PostgreSQL。

以上是典型的 DB 實現。但是,任何其他硬體故障都可能損壞數據庫。例如記憶體錯誤、數據通道錯誤或任何其他可能的錯誤。所以你需要額外的冗餘,真正的生產質量數據庫必須提供容錯功能。

  • 沒有冗餘。如果您的數據損壞,您將失去所有數據。
  • 備份。您進行快照複製/恢復。您在上次備份後失去數據。
  • 線上備份。您可以在數據庫執行時進行快照備份。
  • 非同步複製。每秒(或指定時間段)備份。如果機器停機,此數據庫保證只需重新啟動即可取回數據。您在最後一秒後失去數據。
  • 同步複製。每次數據更新立即備份。您始終擁有原始數據的精確副本。如果原點中斷,請使用副本。

直到現在,我看到許多數據庫實現缺少其中的許多。而且我認為如果他們缺乏適當的 ACID 和冗餘支持,使用者最終會失去數據。

是什麼意思

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

這對您意味著“每個寫入操作將只執行一次(沒有重複記錄),但在操作完成後將完全儲存在數據庫中”並且每次您閱讀時,您都會獲得想要的數據.

NoSQL 數據庫的問題在於它們通常是分佈式的(這就是人們想要的、廉價的、可平面擴展的系統),這意味著將數據複製到所有節點需要時間。有時可能會在寫入期間讀取並在新數據出現時以舊數據結束。

你為了速度犧牲了純度。

這是我答案的簡短版本,我不確定我需要進一步解釋什麼。問我問題!

引用自:https://dba.stackexchange.com/questions/6767