首頁 >資料庫 >Redis >Redis Cluster到底會不會遺失資料?

Redis Cluster到底會不會遺失資料?

藏色散人
藏色散人轉載
2021-09-21 17:09:172143瀏覽

Redis Cluster 不保證強一致性,在某些特殊場景,客戶端即使收到了寫入確認,還是可能遺失資料的。

場景1:非同步複製

Redis Cluster到底會不會遺失資料?

  • client 寫入master B
  • master B 回覆OK
  • ##master B 同步至slave B1 B2 B3
B 沒有等待B1 B2 B3 的確認就回復了client,如果在slave 同步完成之前,master 宕機了,其中一個slave 會被選為master,這時之前client 寫入的資料就丟了。

wait 指令可以增強這種場景的資料安全性。

wait 會阻斷目前 client 直到先前的寫入作業被指定數量的 slave 同步成功。

wait 可以提高資料的安全性,但不保證強一致性。

因為即使使用了這種同步複製方式,也存在特殊情況:一個沒有完成同步的 slave 被選舉為了 master。

場景2:網路分區

6節點

A, B, C, A1, B1, C1,3個master,3個slave,還有一個client ,Z1

Redis Cluster到底會不會遺失資料?

發生網路分割區之後,形成了2個區,

A, C, A1, B1, C1B Z1

Redis Cluster到底會不會遺失資料?

這時Z1 還是可以寫入B 的,如果短時間內分割區就恢復了,那就沒問題,整個叢集繼續正常運作,但如果時間一長,B1 就會成為所在分區的master,Z1 寫入B 的資料就丟了。

maximum window(最大時間視窗) 可以減少資料損失,可以控制Z1 向B 寫入的總數:

過去一定時間後,分區的多數邊就會進行選舉,slave 成為master,這時分區少數邊的master 就會拒絕接收寫入請求。
這個

時間量是非常重要的,稱為節點過期時間

一個 master 在達到過期時間後,就被認為是故障的,進入 error 狀態,停止接收寫入請求,可以被 slave 取代。

小結

Redis Cluster 不保證強一致性,存在遺失資料的場景:

    異步複製
在master 寫成功,但slave 同步完成之前,master 宕機了,slave 變成master,資料遺失。

wait 指令可以給予同步複製,但也無法完全保證資料不丟,而且影響效能。

    網路分區
分區後一個 master 繼續接收寫入請求,分區恢復後這個 master 可能會變成 slave,那麼之前寫入的資料就丟了。

可以設定節點過期時間,減少 master 在分區期間接收的寫入數量,降低資料遺失的損失。

推薦學習:《redis教學

#

以上是Redis Cluster到底會不會遺失資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除