【Redis】集羣通信、複製和故障轉移

Redis集羣是Redis提供的分佈式數據庫方案,集羣通過分片來進行數據共享,並提供複製和故障轉移功能。

節點握手

一個redis集羣通常是由多個節點組成,剛開始的時候,每隔節點都是相互獨立的,它們都處於一個只包含自己的集羣當中,要組建一個真正可工作的集羣,我們必須將多個獨立的節點連接起來,構成一個保護多個節點的集羣。連接各個節點的工作由CLUSTER MEET命令完成。
在這裏插入圖片描述
節點握手過程:
1、節點A會爲節點B創建一個clusterNode結構,並將該結構添加到自己的clusterState.nodes字典裏面。
2、節點A根據CLUSTER MEET命令給定的ip和端口向節點B發送MEET消息。
3、如果順利,及誒單B將接收到節點A發送的MEET消息,節點B會爲節點A創建一個clusterNode結構,並將結構添加到自己的clusterState.nodes字典裏面。
4、之後,節點B將向節點A返回一條PONG消息。
5、如果順利,節點A將接收到節點B返回的PONG消息,通過這條PONG消息節點A可以知道B已經成功接收到自己的MEET消息。
6、之後節點A向節點B返回一條PING消息。
7、如果一切順利,節點B將接收到節點A返回的PING消息,通過這條PING消息節點B可以知道節點A已經成功接收到了自己返回的PONG消息,握手完成。

之後,節點A會將節點B的信息頭弄個Gossip協議傳播給集羣中的其他節點,讓其他節點也與節點B進行握手,最終,經過一段時間之後,節點B會被集羣中所有節點認識。

槽指派

redis集羣通過分片的方式來保存數據庫中的鍵值對:集羣中的整個數據庫被分爲16384個槽slot.
通過向節點發送CLUSTER ADDSLOTS命令,可以將一個或多個槽指派給節點負責。
在集羣模式下,可以通過 CLUSTER KEYSLOT 命令可以查看一個給定的鍵屬於哪個槽。

節點複製

redis集羣中的節點分爲主節點master和從節點slave,其中主節點主要用於處理槽,而從節點則用於複製某個主節點,並在被複制的主節點下線時,代替下線主節點繼續處理命令請求。

通過向一個節點發送 CLUSTER REPLICATE <node_id> 可以讓接收命令的節點稱爲node_id所指定節點的從節點,並開始對主節點進行復制。

一個節點成爲從節點,並開始複製某個主節點,這一信息會通過消息發送給集羣中的其他節點,最終集羣中的所有節點都會知道某個從節點正在複製某個主節點。

在這裏插入圖片描述

故障檢測

1、集羣中的每個節點都會定期的向集羣中的其他節點發送PING消息,以此來檢測對方是否在線。

2、如果接收方沒有在規定的時間內向發送PING消息的節點返回PONG消息,那麼發送PING消息的節點就會將接收PING消息的節點標記爲疑似下線

3、集羣中的各個節點會通過相互發送消息的方式來交換集羣中各個節點的狀態信息,例如:某個節點是處於在線狀態、疑似下線PFAIL,還是已下線狀態FAIL。

當一個節點A通過消息得知主節點B認爲主節點B認爲主節點C進入了疑似下線狀態時,主節點A會在自己的
clusterState.nodes字典中找到主節點C所對應的clusterNode結構,並將主節點B的下線報告添加到
clusterNode結構的fail_reports鏈表裏面,這個鏈表記錄了所有其他節點對該節點的下線報告。

4、如果在一個集羣裏面,半數以上負責處理槽的主節點都將某個主節點x報告爲疑似下線,那麼這個主節點x將被標記爲已下線FAIL,將主節點x標記爲已下線的節點會向集羣廣播一條關於主節點x的FAIL消息,所有收到這條FAIL消息的節點都會立即將主節點x標記爲已下線。

故障轉移

當一個從節點發現自己正在複製的主節點進入了已下線狀態時,從節點將開始對下線節點進行故障轉移。

1、選舉新的主節點
複製下線主節點的所有從節點裏面,會有一個從節點被選中作爲新的主節點

2、被選中的從節點會執行SLAVEOF no one命令,稱爲新的主節點。

3、新的主節點會撤銷所有對已下線主節點的槽指派,並將這些槽指派給自己。

4、新的主節點向集羣廣播一條PONG消息,這條PONG消息可以讓集羣中的其他節點立即致電這個節點已經由從節點變成了主節點,並且這個主節點已經接管了原本已下線節點負責處理的槽。

5、新的主節點開始接收和自己負責處理的槽有關的命令請求,故障轉移完成。

集羣中的消息

  • MEET 消息:通過CLUSTER MEET命令,請求接收者加入到發送者當前所處的集羣裏面。
  • PING消息:檢測集羣節點是否在線
  • PONG消息:對發送MEET或者PING消息的發送者返回PONG消息以確認消息收到。另外一個節點也可以向集羣廣播自己的PONG消息來讓集羣中的其他節點立即刷新關於這個節點的認識。
  • FAIL消息:當一個主節點A判斷另一個主節點B進入FAIL狀態時,節點A會向集羣廣播一條關於節點B的FAIL消息,所有接收到這條消息的節點會立即將節點B標記爲已下線。
  • PUBLISH消息:當節點接收到一個PUBLISH命令時,節點會執行這個命令並向集羣廣播一條PUBLISH消息,所有接收到這條PUBLISH消息的節點都會執行相同的PUBLISH命令。

以上是今天總結的關於redis集羣中槽指派,集羣通信,主從複製,故障轉移的相關知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章