兩個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開發與運維》