redis 集群讲解
群集節(jié)點屬性
每個節(jié)點在集群中都有唯一的名稱。節(jié)點名稱是一個160位隨機數(shù)的十六進制表示,是第一次啟動節(jié)點(通常使用/ dev / urandom)時獲得的。節(jié)點將其ID保存在節(jié)點配置文件中,并永久使用相同的ID,或者至少只要節(jié)點配置文件不被系統(tǒng)管理員刪除,或者通過CLUSTER RESET命令請求硬復(fù)位。
節(jié)點ID用于標識整個集群中的每個節(jié)點。給定節(jié)點有可能改變其IP地址,而不需要改變節(jié)點ID。集群還能夠檢測到IP /端口的變化,并使用群集總線上運行的八卦協(xié)議進行重新配置。
節(jié)點ID不是與每個節(jié)點相關(guān)的唯一信息,而是唯一始終全局一致的信息。每個節(jié)點也有以下一組相關(guān)的信息。一些信息是關(guān)于此特定節(jié)點的群集配置詳細信息,并最終在整個群集中保持一致。其他一些信息,比如最后一個節(jié)點被ping的時候,對每個節(jié)點都是本地的。
每個節(jié)點都維護有關(guān)在集群中知曉的其他節(jié)點的以下信息:節(jié)點ID,節(jié)點的IP和端口,一組標志,如果標記為節(jié)點的主節(jié)點slave,則上次是節(jié)點被ping通并且最后一次接收到pong時,節(jié)點的當前?配置歷元(在本說明書中稍后解釋),鏈路狀態(tài)以及最后的散列槽的集合被服務(wù)。
有關(guān)所有節(jié)點字段的詳細說明,請參閱CLUSTER NODES文檔。
的群集節(jié)點命令可在簇中被發(fā)送到任何節(jié)點,并提供該集群的狀態(tài),并根據(jù)本地視圖所查詢的節(jié)點具有群集的每個節(jié)點的信息。
以下是在三個節(jié)點的小群集中發(fā)送到主節(jié)點的CLUSTER NODES命令的輸出示例。
$ redis-cli cluster nodes d1861060fe6a534d42d8a19aeb36600e18785e04 127.0.0.1:6379 myself - 0 1318428930 1 connected 0-1364 3886e65cc906bfd9b1f7e7bde468726a052d1dae 127.0.0.1:6380 master - 1318428930 1318428931 2 connected 1365-2729 d289c575dcbc4bdd2931585fd4339089e461a27d 127.0.0.1:6381 master - 1318428931 1318428931 3 connected 2730-4095在上面的列表中,不同的字段是按順序排列的:節(jié)點ID,地址:端口,標志,最后ping發(fā)送,最后一個pong接收,配置歷元,鏈路狀態(tài),插槽。關(guān)于上述領(lǐng)域的細節(jié)將在我們討論Redis集群的特定部分時盡快討論。
群集總線
每個Redis群集節(jié)點都有一個額外的TCP端口,用于接收來自其他Redis群集節(jié)點的傳入連接。該端口與用于接收來自客戶端的傳入連接的常規(guī)TCP端口有固定的偏移量。要獲得Redis集群端口,應(yīng)該將10000添加到正常的命令端口。例如,如果一個Redis節(jié)點正在偵聽端口6379上的客戶端連接,則集群總線端口16379也將被打開。
節(jié)點到節(jié)點之間的通信僅使用群集總線和群集總線協(xié)議:由不同類型和大小的幀組成的二進制協(xié)議。集群總線二進制協(xié)議沒有公開記錄,因為它不是為外部軟件設(shè)備與使用此協(xié)議的Redis集群節(jié)點進行通信。然而,你可以通過閱讀獲取有關(guān)群集的總線協(xié)議的詳細信息?cluster.h和cluster.c文件在Redis的集群源代碼。
集群拓撲
Redis集群是一個完整的網(wǎng)格,其中每個節(jié)點都使用TCP連接與每個其他節(jié)點連接。
在N個節(jié)點的集群中,每個節(jié)點都有N-1個傳出TCP連接,以及N-1個傳入連接。
這些TCP連接始終保持活動狀態(tài),并不是按需創(chuàng)建的。當一個節(jié)點期望響應(yīng)群集總線中的ping響應(yīng)時,在等待足夠長的時間以將節(jié)點標記為不可達時,它將嘗試通過從頭重新連接來刷新與節(jié)點的連接。
當Redis Cluster節(jié)點形成一個完整的網(wǎng)格時,節(jié)點使用八卦協(xié)議和配置更新機制,以避免在正常情況下節(jié)點之間交換太多的消息,所以交換的消息數(shù)量不是指數(shù)級的。
節(jié)點握手
節(jié)點總是接受集群總線端口上的連接,甚至在收到ping時回復(fù)ping,即使ping不可信節(jié)點也是如此。但是,如果發(fā)送節(jié)點不被視為群集的一部分,所有其他數(shù)據(jù)包將被接收節(jié)點丟棄。
一個節(jié)點只能以兩種方式接受另一個節(jié)點作為集群的一部分:
-
如果一個節(jié)點出現(xiàn)一個MEET消息。遇見消息與PING消息完全相同,但強制接收者接受作為群集一部分的節(jié)點。只有當系統(tǒng)管理員通過以下命令請求時,節(jié)點才會將MEET消息發(fā)送到其他節(jié)點:
集群符合IP端口
-
如果已經(jīng)被信任的節(jié)點將閑談這個其他節(jié)點,節(jié)點也將注冊另一個節(jié)點作為集群的一部分。所以,如果A知道B,B知道C,那么B最終會發(fā)送八卦消息給A,C發(fā)生這種情況時,A將C注冊為網(wǎng)絡(luò)的一部分,并嘗試與C連接。
這意味著只要我們加入任何連接圖中的節(jié)點,它們最終將自動形成完全連通的圖形。這意味著群集能夠自動發(fā)現(xiàn)其他節(jié)點,但前提是系統(tǒng)管理員強制建立信任關(guān)系。
這種機制使群集更健壯,但防止不同的Redis群集在更改IP地址或其他網(wǎng)絡(luò)相關(guān)事件后意外混合。
官方地址:https://redis.io/topics/cluster-spec
總結(jié)
以上是生活随笔為你收集整理的redis 集群讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 3D光源-Direction
- 下一篇: raft算法与paxos算法相比有什么优