gnatsd集群原理分析

2021-08-19 17:56:09 字數 1623 閱讀 3740

看了一天gnatsd集群相關的原始碼差點沒把我給繞暈,總算是搞個大體明白了,最近功力暴漲,哈哈哈。

集群中的每個伺服器之間都是互相通過route連線。

server1啟動乙個route進行tcp監聽等待遠端route連線。

收到server2的route client連線以後,server1呼叫sendinfo傳送本伺服器的一堆資訊。

server2也開啟route server監聽等待別的route連線,當server2 route client收到server1的info後**給其他連線上來的route,其他route根據info也去連線server1。

這樣形成所有集群裡的server全都互相連線在一起。

當乙個server1收到user1 sub 時會先本地訂閱,然後把sub訊息廣播給所有其他route。

廣播時重新定義了sid也就是subid。sid的值為:

(q)rsid::

當sub是queue型別的主題時字首是:qrsid,如果是普通sub則是rsid。

cid是當前user client的id,sid是user1sid。

當遠端route收到此訂閱訊息時以route身份訂閱此訊息並且記錄新的sid。此時route跟其他user client一樣都在伺服器的訂閱者列表中。

也就是說乙個user在某個server上訂閱了訊息以後,集群中的所有伺服器收到廣播都會以route身份也訂閱此訊息。

所以所有server都有完整的訂閱列表,只不過訂閱者一部分是正常本地登入的user client,另一部分是route。

傳送普通資訊比較簡單。

user1.pub msg1 給server1時,server1把msg1**給所有訂閱者,其中有可能有route的訂閱者。

當route收到pub訊息時,route把訊息發給遠端route。

遠端route收到訊息後,遍歷傳送給其本地的user client訂閱者。

這樣一條pub普通資訊就發給了集群裡的所有訂閱者。

當pub一條訊息給訂閱主題而這訂閱主題屬於queue時,只隨機選擇此queue中的乙個訂閱者傳送訊息,也就是乙個queue訊息最多只有乙個消費者,而且是隨機分配的。

user1.pub msg1 給server1時,如果此subject1是個qsub,server1在本地qsubs中隨機選擇乙個sub傳送訊息,選擇的sub有可能是本地user client,此時傳送訊息完成就沒事了。如果選擇的sub剛好是個route的話,此時把訊息發給遠端route,而sid是此遠端route訂閱時指定的sid:(q)rsid:cid:sid

當遠端route收到本地route**的pub queue訊息以後,先解析出cid和sid,檢查cid對應的user client是否還存在,如果存在根據sid找到訂閱者sub,然後給sub發訊息,這樣訊息就遞交到了最終的user client中。

gnatsd集群其中一台server掛掉之後,只影響連線在此server上的使用者,其他集群可以正常工作。

集群開啟後,隨時可以開啟乙個新的server加入集群中的某一台server,新的server會自動連線到集群中所有其他server。

說實話gnatsd集群這塊**寫的真的挺難看的,全混在一起,看的人眼花繚亂暈頭轉向。

Redis集群原理分析

redis集群的原理主要是圍繞著 槽 的概念展開的,先來理解集群中 槽 的概念。reids集群是通過將所有的key進行分割槽來實現的,redis集群最多有16384個分割槽 也可以稱作 槽 英文 slot 然後在集群節點中指定分割槽範圍來實現。例如 集群中的節點a負責0 10000,節點b負責 10...

集群內原理

3 集群可擴充套件性 4 分布式文件儲存 5 分析器 6 對映 7 執行分布式檢索 8 深分頁 9 索引管理 10 分片內部原理 預設情況下,每個節點都有成為主機點的資格,也會儲存資料,也會處理客戶端請求.在乙個集群中,我們一般對節點職責進行劃分.節點型別 配置職責 master節點 node.ma...

Redis Cluster集群原理

一 redis cluster 官方推薦的 redis 集群解決方案,優點在於去中心化,去中介軟體,也就是說,集群中的每個節點都是平等的關係,都是對等的,每個節點都儲存各自的資料和整個集群的狀態。每個節點都和其他所有節點連線,而且這些連線保持活躍,這樣就保證了我們只需要連線集群中的任意乙個節點,就可...