1. 集群節點
1.2 節點啟動
2. 槽指派
3. 在集群中執行命令
4. 重新分片
5. 複製與故障轉移
6. 集群訊息
7. gossip協議
參考文獻
clusterstate結構
typedef struct clusterstate
clusternode結構struct clusternode
clusterlink結構typedef struct clusterlinkclusterlink;
每個節點的clusternode
結構都有乙個slots
和numslot
屬性(資料結構見上):
同時使用clusterstate
的slots
記錄所有槽的指派節點,和使用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萬 秒的命令,這個併發基本上能夠滿足我們所有需求了,但有時候比如做離...