Redis底層原理 (持久化以及集羣)集羣工作原理(六)

兩個redis節點之間進行通信的時候,需要在客戶端執行下面一個命令

127.0.0.1:7000>cluster meet 127.0.0.1:7001

如下圖所示


意思很簡單,讓7000節點和7001節點知道彼此存在!
在握手成功後,兩個節點之間會定期發送ping/pong消息,交換數據信息,如下圖所示。

 

在這裏,我們需要關注三個重點。

  • (1)交換什麼數據信息

  • (2)數據信息究竟多大

  • (3)定期的頻率什麼樣

到底在交換什麼數據信息?
交換的數據信息,由消息體和消息頭組成。
消息體無外乎是一些節點標識啊,IP啊,端口號啊,發送時間啊。這與本文關係不是太大,我不細說。

我們來看消息頭,結構如下


注意看紅框的內容,type表示消息類型。
另外,消息頭裏面有個myslots的char數組,長度爲16383/8,這其實是一個bitmap,每一個位代表一個槽,如果該位爲1,表示這個槽是屬於這個節點的。

到底數據信息究竟多大?
在消息頭中,最佔空間的是myslots[CLUSTER_SLOTS/8]。這塊的大小是:
16384÷8÷1024=2kb
那在消息體中,會攜帶一定數量的其他節點信息用於交換。
那這個其他節點的信息,到底是幾個節點的信息呢?
約爲集羣總節點數量的1/10,至少攜帶3個節點的信息。
這裏的重點是:節點數量越多,消息體內容越大。

消息體大小是10個節點的狀態信息約1kb。

那定期的頻率是什麼樣的?
redis集羣內節點,每秒都在發ping消息。規律如下

  • (1)每秒會隨機選取5個節點,找出最久沒有通信的節點發送ping消息

  • (2)每100毫秒(1秒10次)都會掃描本地節點列表,如果發現節點最近一次接受pong消息的時間大於cluster-node-timeout/2 則立刻發送ping消息

因此,每秒單節點發出ping消息數量爲
1+10*num(node.pong_received>cluster_node_timeout/2)

那大致帶寬損耗如下所示,圖片來自《Redis開發與運維》

 

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