Clustering

幫助理解 galera 一致性(基於認證的複制)

  • February 3, 2019

Galera 使用基於認證的複制來實現強一致性。

在做完一個事務後COMMIT,其他節點會驗證它,如果沒問題,它將被成功送出。

但是,如果失去了一個驗證送出但仍在獲取數據的節點,例如在寫一個 big 時會發生什麼blob

據我了解,認證過程是同步的,但數據傳輸是非同步的,這意味著客戶端/使用者可能認為他的數據在成功執行後儲存在所有節點上,COMMIT但實際上在後端發生的是數據可能仍然存在在節點之間進行同步,在網路中斷的情況下,根據交易類型,節點可能會發生衝突,對嗎?

如果是這種情況,如何將集群配置為從可能的衝突中進行自我修復,或者想知道是否有辦法實現強一致性,即使它會影響每個返回時間,COMMIT因為它應該只有在數據被成功後才能成功在所有節點上完全傳輸。

但是,如果失去了驗證送出但仍在獲取數據的節點(例如在編寫大 blob 時)會發生什麼情況?

這與失去任何其他節點沒有什麼不同。如果節點崩潰,它將在下次出現時嘗試重新加入集群。將找到一個施主節點,並且最好是 IST(增量狀態轉移)或 SST(狀態快照轉移)將把節點帶到正確的狀態。

據我了解,認證過程是同步的,但數據傳輸是非同步的,這意味著客戶端/使用者可能認為他的數據在成功執行 COMMIT 後儲存在所有節點上,但實際上發生在後端的是數據可能是仍然在節點之間同步,並且在網路中斷的情況下,根據交易類型,節點可能會發生衝突,對嗎?

您說得對,數據傳輸是非同步的,並且節點狀態不同的時間很短。這並不完全是衝突,只是其他節點落後了。他們很快就會趕上。

如果是這種情況,如何將集群配置為從可能的衝突中自我修復,或者想知道是否有辦法實現強一致性,即使它會影響每個 COMMIT 的返回時間,因為它應該只有在數據之後才能成功已在所有節點上完整傳輸。

是的,它確實通過 IST 和 SST 進行自我修復。

有兩種方法可以確保您正在讀取最新版本的數據: 如果您始終只寫入一個節點(例如,因為使用帶有讀寫分離器的數據庫代理),那麼您可以確保也從同一個節點讀取。另一個選項是設置會話變數wsrep_sync_wait =1 - 請參閱使用 Galera 實現 Read-After-Write Semantics

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