簡體   English   中英

強一致性和復制因子

[英]Strong consistency and replication factor

我正在努力提高我在分布式數據庫方面的知識以及可以實現的各種級別的一致性。 首先,讓我定義一些我將使用的術語(如果我錯了,請告訴我):

強一致性:如博士報告。 Kleppmann 在“設計數據密集型應用程序”中,它是“線性化”的同義詞,這是一種一致性級別,它使復制的數據存儲表現得好像只有一個數據項的副本,並且對它的每個操作都是原子發生的。

復制因子:數據項的副本數。

假設我有一個由配置為強一致性模式的 3 個節點組成的集群,並且復制因子 = 3 ,並且領導者已成功地將對數據項 X 的寫入復制到它的一個追隨者,我有以下問題:

1. 當第二個follower重新上線時,寫入將被復制到第二個follower,不是嗎?

在我看來,當領導者成功地將寫入復制到至少一個追隨者時,數據庫可以向客戶端應用程序返回“成功”。 實際上,該寫入已達到多數法定人數,因此無需等待第二個跟隨者確認該操作。 但是,給定復制因子的值,當第二個追隨者在線時,寫入將以相同的順序(因此,在 X 上也是如此)應用於第二個追隨者。

2.如果客戶端應用程序試圖讀取尚未更新的follower上的X,它會獲得一個陳舊的值嗎?

由於數據庫以強一致性工作,因此應該不可能讀取過時的值。 因此,如果客戶端無法連接到領導者或更新的追隨者,它應該會收到錯誤。 這應該是 CAP 定理的結果。

拜托,誰能告訴我我是否正確,如果不是,為什么? 謝謝!

您描述系統的方式 - 擁有領導者和成功是當大多數節點接受寫入時 - 這意味着您正在使用基於共識的單領導者復制。 (請問這是否需要解釋)

在基於共識的模型中,所有節點都將以相同的順序更新,但不能保證特定節點何時更新。 但是可以保證,如果一個寫入被接受,那么大多數節點都會接受它。 共識協議本身保證所有節點最終將獲得所有寫入。

我建議閱讀一篇關於 Raft 算法的論文——它相對簡單,涵蓋了共識的所有主要方面。

上面的兩段我說過,對於給定的寫入,兩個語句是正確的:大多數節點接受寫入; 如果一些節點落后 - 他們最終會得到更新。 問題是這種可能性是否具有很強的一致性?

基於共識的系統有兩種讀模式:最終一致讀和強一致讀。 我看到許多論文稱后者為讀——線性化讀。

最終一致的讀取很簡單 - 讀取器轉到隨機節點,他們可能會或可能不會看到最新值。 這里一切都好。

線性化讀取更復雜。 為了理解這一點,我們應該在基於共識的系統中描述日志是什么。 日志是所有事件的序列——每個節點最終都會有完全相同的日志——相同的事件以相同的順序。 因此,當我們說 - 已接受寫入時 - 這意味着大多數節點將該寫入事件附加到其日志中。

這是獲得高度一致的又名可線性化讀取的算法:

  • 客戶端必須連接到領導者
  • 客戶端告訴領導者它需要強一致性讀取
  • 領導者提議一個新的讀取事件附加到日志中
  • 這個提案是共識算法中的標准操作——提案被發送到所有節點
  • 領導者等待多數人接受此讀取事件; 在您的情況下,只要一個關注者接受 - 該事件被視為已接受
  • 領導者將事件附加到日志
  • 一旦領導者看到讀取事件被附加到其日志中,領導者可能會得出結論,它看到了世界的最新可能圖片
  • 領導者現在可以讀取自己的日志以查找向客戶端詢問的數據
  • 領導者找到最新數據並返回給客戶

上述步驟可確保客戶端看到最新更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM