Redis集群-節(jié)點(diǎn)

節(jié)點(diǎn)

????一個(gè)集群由多個(gè)節(jié)點(diǎn)構(gòu)成,最初每個(gè)節(jié)點(diǎn)都是獨(dú)立的,每個(gè)節(jié)點(diǎn)都是一個(gè)集群。要?jiǎng)?chuàng)建一個(gè)真正可用的集群,我們需要把哥哥獨(dú)立的節(jié)點(diǎn)連接起來。
連接節(jié)點(diǎn)的命令:

CLUSTER MEET <ip> <port>

????向一個(gè)node發(fā)送這個(gè)命令的時(shí)候,可以讓node和指定ip port的節(jié)點(diǎn)握手。握手一旦成功,node節(jié)點(diǎn)就會(huì)將指定ip port的節(jié)點(diǎn)添加到節(jié)點(diǎn)當(dāng)前所在的集群中。

啟動(dòng)節(jié)點(diǎn)

????一個(gè)節(jié)點(diǎn)就是一個(gè)運(yùn)行在集群模式下的Redis服務(wù)器,Redis服務(wù)器在啟動(dòng)時(shí)會(huì)根據(jù)cluster-enabled配置選項(xiàng)是否為yes來決定是否開啟服務(wù)器的集群模式。


image.png
集群的數(shù)據(jù)結(jié)構(gòu)

每個(gè)節(jié)點(diǎn)都會(huì)使用一個(gè)clusterNode結(jié)構(gòu)來記錄自己的狀態(tài):


image.png

????link屬性是一個(gè)clusterLink結(jié)構(gòu),該結(jié)構(gòu)保存了連接節(jié)點(diǎn)所需的有關(guān)信息,比如套接字描述符,輸入緩沖區(qū)和輸出緩沖區(qū)。


image.png

????最后,每個(gè)節(jié)點(diǎn)都保存著一個(gè)clusterState結(jié)構(gòu),這個(gè)結(jié)構(gòu)記錄了當(dāng)前節(jié)點(diǎn)的視角下,集群所處的狀態(tài)。比如集群是在線還是下線等。
image.png
Cluster MEET命令的實(shí)現(xiàn)
CLUSTER MEET <ip> <port>

????假如收到命令的節(jié)點(diǎn)A和節(jié)點(diǎn)B進(jìn)行握手:
1)節(jié)點(diǎn)A會(huì)為節(jié)點(diǎn)B創(chuàng)建一個(gè)clusterNode結(jié)構(gòu),并將該結(jié)構(gòu)添加到自己的clusterState.nodes字典里面。
2)之后,節(jié)點(diǎn)A將根據(jù)CLUSTER MEET命令給定的IP地址和端口號(hào),向節(jié)點(diǎn)B發(fā)送一條 MEET消息(message)。
3)如果一切順利,節(jié)點(diǎn)B將接收到節(jié)點(diǎn)A發(fā)送的MEET消息,節(jié)點(diǎn)B會(huì)為節(jié)點(diǎn)A創(chuàng)建一個(gè)clusterNode結(jié)構(gòu),并將該結(jié)構(gòu)添加到自己的clusterState.nodes字典里面。
4)之后,節(jié)點(diǎn)B將向節(jié)點(diǎn)A返回一條 PONG 消息。
5)如果一切順利,節(jié)點(diǎn)A將接收到節(jié)點(diǎn)B返回的PONG消息,通過這條PONG消息節(jié)點(diǎn)A可以知道節(jié)點(diǎn)B已經(jīng)成功地接收到了自己發(fā)送的 MEET消息。
6)之后,節(jié)點(diǎn)A將向節(jié)點(diǎn)B返回一條PING消息。
7)如果一切順利,節(jié)點(diǎn)B將接收到節(jié)點(diǎn)A返回的PING消息,通過這條PING消息節(jié)點(diǎn)B可以知道節(jié)點(diǎn)A已經(jīng)成功地接收到了自己返回的PONG 消息,握手完成。


image.png

????之后,節(jié)點(diǎn)A會(huì)將節(jié)點(diǎn)B的信息通過Gossip協(xié)議傳播給集群中的其他節(jié)點(diǎn),讓其他節(jié)點(diǎn)也與節(jié)點(diǎn)B進(jìn)行握手,最終,經(jīng)過一段時(shí)間之后,節(jié)點(diǎn)B會(huì)被集群中的所有節(jié)點(diǎn)認(rèn)識(shí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容