Nosql中的因果一致性是什麼
已發表: 2022-12-13近年來,隨著組織尋找傳統關係數據庫的替代方案,NoSQL 數據庫變得越來越流行。 NoSQL 數據庫的一個關鍵優勢是它們可以在數據存儲和訪問方式方面提供高度的靈活性。 然而,這種靈活性是有代價的,其中一個權衡是因果一致性通常得不到保證。 因果一致性是分佈式系統中經常使用的強一致性模型。 在一個因果一致的系統中,所有因果相關的寫入必須以相同的順序被所有客戶端看到。 這意味著如果兩個客戶端執行因果相關的寫操作,那麼所有其他客戶端必須以相同的順序看到這些寫操作。 這種靈活性的代價是在 NoSQL 數據庫中通常不能保證因果一致性。 這意味著如果兩個客戶端執行因果相關的寫操作,則無法保證所有其他客戶端將以相同的順序看到這些寫操作。 這會導致存儲在數據庫中的數據不一致。 有許多因素會導致 NoSQL 數據庫中的因果不一致。 一種是使用最終一致性,這是NoSQL數據庫中經常使用的一致性模型。 在最終一致的系統中,寫入可能不會立即對所有客戶端可見,但它們最終會傳播到所有副本。 這意味著存在一個時間窗口,在這個時間窗口中,不同的客戶端可能會看到亂序的寫入。 另一個可能導致因果不一致的因素是使用最後寫入者獲勝的衝突解決方案。 在最後寫入者獲勝的系統中,當兩個客戶端執行相互衝突的寫操作時,最後執行該操作的客戶端的寫入將優先。 如果在所有客戶端上執行寫入的順序不同,這可能會導致不一致。 最後寫入者獲勝的衝突解決方案通常用於最終一致的系統,因為它可以幫助確保最近的寫入對所有客戶端都是可見的。 但是,如果執行寫入的順序在所有客戶端上都不相同,也會導致不一致。 一般來說,NoSQL 數據庫的靈活性的權衡是它們不保證因果一致性。 這意味著存儲的數據存在不一致的風險
在本文中,我將演示如何實時破壞 MongoDB 的因果一致性保證。 大多數也用於解決這個問題,第一次嘗試是使用多數讀寫。 在此之後,我們將查看 Mongo 中的邏輯時鐘間隔和混亂會話。 在這種情況下,我將使用 Mongo C# 驅動程序進行編碼,但這完全取決於我。 大多數副本集成員已確認從多數讀取中的查詢返回的數據。 先使用多數寫入再使用多數讀取的想法似乎是解決我們的“寫你的寫”問題的一個有吸引力的解決方案。 當大多數寫入被理解時,每個輔助服務器都會保留最近多數寫入的內存快照。
因果一致性模型中的每個對像都被分配了一個多部分時間戳,這是通過使用它來實現的。 這些時間戳存儲在一個向量中,該向量包含每個副本的對象版本號。
有一個定義。 一致性通過捕獲操作之間的任何潛在因果關係,確保所有進程以相同的順序觀察交換操作。 換句話說,系統中的所有進程都對如何執行因果相關的操作有共同的理解。
以下是實現順序一致性的步驟: a) 順序寫入的順序一致; b) 順序寫入的一致順序; c) 順序寫入的一致順序。 在寫因果一致性時,有必要保持因果相關的讀取順序相同。
Nosql 中的一致性是什麼?
因此,NoSQL 數據庫需要大量的一致性才能保持高可用性。 他們沒有達到強一致性; 相反,它們會導致長期的一致性。 有時無法返回最近寫入的結果,因為保證基本功能的數據存儲可能無法這樣做。
文檔數據存儲的實現比關係模型的實現更難修改。 此外,在飛行存儲中重構數據的複雜性明顯高於 RDBMS 的簡單 ETL 轉換。 如果開發人員和架構師不知道或不理解或害怕一旦犯錯就會丟掉工作,就會錯失這個機會。 他們會將原子事務分解為邏輯部分,而不是記住複製和延遲是過程,更糟糕的是,將第三方系統拖入過程。 它最終將被外包,其他人將繼續管理該部門。
數據庫中的不一致是由多種因素引起的,包括不正確或不完整的數據、缺少約束、無效觸發器或錯誤配置的級聯。 由於所有這些問題,不正確的數據可能存儲在數據庫中。 因此,可能會對分析和決策制定的準確性和有效性產生重大影響。 完整且一致的數據庫模式是確保數據準確性和一致性的最重要步驟。 此外,定義良好的模式將確保數據正確輸入數據庫,並確保管理數據的規則得到正確解釋。 這使分析能夠通過防止不一致來準確反映數據庫中的數據。
Nosql 數據庫不太適合銀行和 ATM 交易
數據庫可靠性使用 nosql 不如使用 SQL 平滑,因為它們中的大多數使用後來的一致性模型。 因此,它們不太適合銀行和 ATM 取款等交易,因為數據有時可能並不總是一致的。
什麼是並發和因果相關的一致性?
並發和因果相關的一致性是當兩個或多個事件同時發生並且彼此相關時存在的一種一致性。 這種類型的一致性在許多領域都很重要,例如物理學和工程學,在這些領域中需要確保事件以一致的方式發生。
分佈式系統由許多共享和復制數據的計算節點組成。 一致性是一種分佈式系統屬性,可確保節點和副本同時具有相同的數據視圖。 它是一種通過使用弱形式的一致性來保持因果相關操作順序的實驗方法。 因果一致性和順序一致性之間的主要區別是因果一致性不需要總數量級。 一致性的直觀感覺意味著只有當寫入因果相關時,讀取才是新鮮的。 下面提供了一個分佈式系統的示例,它由四個進程組成:P1、P2、P3 和 P4。
它是一種屬性,可以通過採用同意執行建立因果關係任務的操作順序的進程數來計算。 任何滿足以下要求的進程都被認為是一致的:對於任意兩個進程 P 和 Q,如果 P 導致 Q 並且 Q 導致 R,則 P 在任何其他進程中導致 R。 它是對所有因果相關操作的執行順序達成一致的進程數量的度量。 如果滿足以下要求,則一個過程是一致的:P導致Q並且Q導致R,然後P導致R。一致性要求是要求之一。 當以一致的方式使用時,一致的過程更有可能產生正確的結論。 流程的一致性可以通過多種方式來衡量。 一種看待它的方法是考慮有多少進程就因果相關操作發生的順序達成一致。 結果,就有了一致性指標。 一致性指數是衡量流程維護一致性的指標。 為了保持一致,一個流程必須滿足以下要求:對於任何兩個流程,P 導致 Q,Q 導致 R,因此 P 導致 R 以及 Q 和 Q。流程的一致性指標是衡量流程穩定性的指標。 如果一個進程滿足這些要求,則稱它符合以下條件:如果 P 導致 Q,Q 導致 R,則 P 對任意兩個進程 P 和 Q 導致 R。如果一個進程不滿足一致性要求,則認為它不一致。 不一致的過程更有可能導致錯誤的結論。 一致性指數可用於評估過程的一致性。 它是一種衡量過程一致性並識別產生更準確因果結論的過程的方法。
因果一致性與最終一致性
分佈式系統中主要有兩種一致性:因果一致性和最終一致性。 因果一致性保證如果兩個事件相關,那麼它們將被所有進程以相同的順序看到。 最終一致性保證,如果有足夠的時間,所有進程將看到相同的系統最終狀態,即使它們沒有看到相同的中間狀態。
分佈式系統中的因果一致性
一致性的一致性標準可用於確定分佈式數據庫中的因果關係 [1]。 如果一個操作是因果相關的,那麼分佈式系統的每個節點都以相同的讀取和寫入順序顯示相同的數據。
其他一致性模型,例如最終的和因果的,也是眾所周知的。 在分佈式系統中,它們比在傳統數據庫中更常見。 一致模型是一種奇特的說法,表示系統及其用戶具有一致的協議。 當交互發生時,這些特性描述了系統的行為方式。 如果我們的系統聲稱是可序列化的,那麼它必須顯示為一個單一的全局位置,所有操作都以其全局順序出現在所有進程中,而不管位置如何。 允許在系統認為合適的情況下交錯操作。 儘管不能保證流程的真實順序(根據定義),但在保留操作順序時可以確保。
有些操作甚至可能看起來像幾年前發生的一樣。 操作(寫/寫)因果相關的事實意味著它們的分佈順序對於所有進程應該是統一的。 沒有順序保證,因為兩個進程向 x 寫入不同的值,如下圖所示。 當我們停止寫入新的寫入時,系統最終會收斂到一個更一致的狀態。 最終一致性保證聲明不會對系統進行任何更新(寫入),並且所有客戶端都能夠準確地看到它是如何工作的。 如果您將單調字符寫入 100 美元的帳戶,您將被收取 165 美元的費用。 當客戶端更新您的讀寫 (RYW) 中的項目時,該項目的值將在更新完成後返回。 PRAM 是一種流水線內存,它允許進程以相同的方式查看來自單個進程的所有操作。
Mongodb 最終一致性
這意味著您正在讀取的數據目前可能不一致,但最終會一致。 這是通過使用任何可以從輔助讀取的 readPreferences 獲得的。
在 MongoDB 中,主數據始終是異步複製的,而輔助數據是並發複製的。 MongoDB 默認為 w1:(成功寫入主數據庫)和 j:false 用於日誌記錄。 由於異步複製,當一個分區被分區到少數端或失去其主時,通常會丟失一致性。 在分區期間,我們可以調整 w 和 j 值以實現不同級別的延遲和全面的一致保證。 沒有分區時,寫速度下降,有寫時,寫不等待複製。 如果您使用的是 w 和 j 的組合,則從輔助節點讀取/不讀取會對一致性級別產生重大影響。 MongoDB 有四種不同級別的一致性。
最佳寫入時間是沒有分區且所有節點都處於活動狀態; MongoDB 是一致的並且具有低延遲。 當代理主已丟失且分區已被填充時,這是最常見的寫入失敗類型(錯誤為 writeTimeout)。 我們在 MongoDB 中擁有 Best Effort 可用性,因為無論我們如何劃分集群,我們總會丟失其中的一部分——至少是一個百分比。 在PACELC定理的CAP和CP/EC中,w:majority, j:true, READ from primary only可以用來將MongoDB歸類為CP。
Mongodb如何保持一致性?
多個客戶端可以同時讀寫相同的 MongoDB 數據。 MongoDB 採用鎖定和並發管理來防止其客戶端同時修改相同的數據。 當我們寫入單個文檔時,我們要么完全寫入它,要么根本不寫入,客戶端總是看到一致的結果。
Nosql 中的最終一致性是什麼?
數據建模中的最終一致性概念是為了確保對分佈在多個節點上的 NoSQL 數據庫所做的更改在所有節點中得到反映。 結果,隨著時間的推移,相同的數據庫查詢將返回相同的結果。