Redis集群模式詳解

2021-10-08 02:13:55 字數 2658 閱讀 1237

1. 集群節點

1.2 節點啟動

2. 槽指派

3. 在集群中執行命令

4. 重新分片

5. 複製與故障轉移

6. 集群訊息

7. gossip協議

參考文獻

clusterstate結構

typedef struct clusterstate
clusternode結構
struct clusternode
clusterlink結構
typedef struct clusterlinkclusterlink;
每個節點的clusternode結構都有乙個slotsnumslot屬性(資料結構見上):

同時使用clusterstateslots記錄所有槽的指派節點,和使用clusternode結構的slots記錄當前節點處理的槽資訊,使查詢槽指派資訊更高效:

在對資料庫中的16384個槽都指派了之後,集群就會進入上線狀態,這時客戶端就可以向集群中的節點傳送資料命令了;

當客戶端(集群模式啟動)向集群中某乙個節點,傳送與資料庫鍵有關的命令時,接收命令的節點會計算鍵屬於哪個槽,並檢查這個槽是否指派給了自己:

說明:

def slot_number(key):

return crc16(key) & 16383

當節點計算出鍵所屬的槽i之後,會檢查自己在clusterstate.slots陣列中的項i,判斷鍵所在的槽是否由自己負責:

redis集群的重新分片操作由redis的集群管理軟體redis-trib負責執行;

redis-trib對集群的單個槽slot進行重新分片的步驟如下:

如果重新分片涉及多個槽,那麼redis-trib將對每個給定的槽分別執行上面給出的步驟;

在進行重新分片期間,源節點向目標節點遷移乙個槽的過程中,可能會出現這樣一種情況:遷移的槽中有許多鍵值對,遷移過程中會有一部分鍵值對儲存在源節點裡,而另一部分鍵值對則儲存在目標節點裡;

和接到moved錯誤類似,集群模式的客戶端在接到ask錯誤時也不會列印錯誤,而是會自動根據錯誤提供的ip位址和埠進行轉向操作;但是,如果客戶端不是以集群模式啟動,則客戶端不清楚ask錯誤的作用,只是會把錯誤資訊列印出來;

接到ask錯誤的客戶端在向目標節點傳送請求時,會先傳送乙個asking命令,開啟該客戶端的redis_asking標識,之後再重新傳送原本想要執行的命令:

分析:注意:

ask錯誤moved錯誤都會導致客戶端轉向,它們的區別是:

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

集群訊息是用於集群節點之間相互通訊用的(不是集群節點和客戶端通訊),集群中的各個節點通過傳送和接收訊息來進行通訊。

節點傳送的訊息主要有以下五種:

節點傳送的所有訊息都由乙個訊息頭包裹,訊息頭除了包含訊息正文之外,還記錄了訊息傳送者自身的一些訊息。使用結構clustermsg表示;

typedef struct clustermsg;
gossip協議特點:

Redis集群詳解

sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當資料量過大到一台伺服器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對儲存的資料進行分片,將資料儲存到多個redis例項中。cluster模式的出現就是為了解決單機redis容量有限的問題,將redi...

Redis三種集群模式詳解

目錄 redis主從複製 redis 的複製分為兩部分操作 同步 sync 和 命令傳播 command propagate 上面介紹了redis複製的兩種操作,而redis得主從複製正式基於 同步 和 命令傳播 來實現得。下面兩張圖展示了redis複製的流程 優點 1 實現讀寫分離,提高了可用性,...

集群模式詳解

我這裡搭建演示的版本是redis 5.0.5,這個版本對於集群搭建會有很大的簡化,比如最常用的redis trib.rb指令碼功能已經整合到redis cli工具中了,具體下面會詳細介紹。併發量 通常來說,單台redis能夠執行10萬 秒的命令,這個併發基本上能夠滿足我們所有需求了,但有時候比如做離...