首頁  >  文章  >  資料庫  >  redis集群原理的範例分析

redis集群原理的範例分析

WBOY
WBOY轉載
2023-05-27 14:55:06940瀏覽

redis集群的原理

如果說依靠哨兵可以實現redis的高可用,如果還想在支援高並發同時容納海量的數據,那就需要redis集群。 redis叢集是redis提供的分散式資料儲存方案,叢集透過資料分片sharding來進行資料的共享,同時提供複製和故障轉移的功能。

節點

一個redis叢集由多個節點node組成,而多個node之間透過cluster meet指令來進行連接,節點的握手過程:

  1. 節點A收到客戶端的cluster meet指令

  2. A根據收到的IP位址和連接埠號,向B發送一則meet訊息

  3. 節點B收到meet訊息回傳pong

  4. A知道B收到了meet訊息,回傳一則ping訊息,握手成功

  5. 最後,節點A將會透過gossip協定把節點B的資訊傳播給叢集中的其他節點,其他節點也會和B進行握手

槽slot

redis透過叢集分片的形式來保存數據,整個叢集資料庫被分成16384個slot,叢集中的每個節點可以處理0-16384個slot,當資料庫16384個slot都有節點在處理時,叢集處於上線狀態,反之只要有一個slot沒有處理都會處理下線狀態。透過cluster addslots指令可以將slot指派給對應節點處理。

slot是一個位數組,數組的長度是16384/8=2048,而數組的每一位用1表示被節點處理,0表示不處理,如圖所示的話表示A節點處理0 -7的slot。

當客戶端向節點發送指令,如果剛好找到slot屬於目前節點,那麼節點就執行指令,反之,則會傳回一個MOVED指令到客戶端指引客戶端轉向正確的節點。 (MOVED過程是自動的)

如果增加或移出節點,對於slot的重新分配也是非常方便的,redis提供了工具幫助實現slot的遷移,整個過程是完全在線的,不需要停止服務。

故障轉移

如果節點A向節點B發送ping訊息,節點B沒有在規定的時間內回應pong,那麼節點A會標記節點B為pfail疑似下線狀態,同時把B的狀態透過訊息的形式傳送給其他節點,如果超過半數以上的節點都標記B為pfail狀態,B就會被標記為fail下線狀態,此時將會發生故障轉移,優先從複製資料較多的從節點選擇一個成為主節點,並且接管下線節點的slot,整個過程和哨兵非常類似,都是基於Raft協議做選舉。

以上是redis集群原理的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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