tns thrift 分布式元件 介紹

2021-09-23 17:53:58 字數 1615 閱讀 6826

tns(thrift name server)是我在700bike開發的乙個thrift rpc分布式元件,可以實現高可靠、負載均衡、動態水平擴充套件等.

相比haproxy、zookeeper等有什麼優勢?我們知道網路程式唯一保證可靠的方式就是心跳包,同haproxy方式有什麼區別,可以閱讀wiki why

使用方式wiki上都有,這裡簡單說說tns cluster的特性,及設計結構。

cluster結構圖

tns cluster 採用無中心化設計,也就是cluster中每個node都是均等的,在任一節點執行命令都等效,集群元件類似於redis,在節點上執行meet 即可,滿足傳遞性,例如: 1 meet 2;2 meet 3 等效於1 meet 3; 1 meet 2

每個node均有乙個id,id唯一,根據hostname+port生成,在集群中cluster按id排序,組成乙個環,如上圖綠色環,其中id較小的會負責檢查比其稍大的id的節點健康狀態,並將自己知道的cluster list及健康狀態和service list(不包含健康狀態)傳輸到對方,實現集群資訊同步,假如2節點down了,1會標記2節點狀態為down,並將自己的資訊以後同步給3,因為2一旦down掉,是不可自動恢復的,只能手動恢復(重啟2,並執行meet 重新上線).

如上,這種做法,乙個節點有且僅有乙個節點會同步資訊給它,並且它也只同步資訊給乙個節點,集群增加節點不會增加單個node的壓力。service list只會同步列表,不會同步service節點狀態,避免1節點狀態傳遞到6延遲比較高,每個tns節點自行維護service 狀態,這樣客戶端不論從那個cluster node中同步service列表均比較實時。
tns內部結構圖

如圖,在nameserver中新增三個rpc server節點,service名稱定義為drpc,每增加乙個節點時,可以指定ping的週期,nameserver會定時呼叫drpc的ping方法,ping方法返回vnodes,含義為虛擬節點,用於客戶端對請求負載均衡,另外nameserver也根據每次ping返回的vnodes值來判斷service server是否可用,若vnodes<0,nameserver會標記service node為down,nameserver只會同步up狀態的service節點列表給客戶端,增加或下線乙個節點,乙個週期後(客戶端設定週期)也會被客戶端同步到。

單個的vnodes沒什麼含義,在乙個service下有多個node時才有含義,例如上圖中drpc包含三個節點,並且每個節點vnodes分別為7、2、1,客戶端負載均衡後,其中7/10的流量會流向node1,1/10會流向node3,從而實現負載均衡,客戶端預設提供乙個隨機選擇器,大家可以按自己的意願自己實現。

線上不論是tns node還是service node均可隨時增加或減少,從而實現水平動態可擴充套件。

**jerry 於北京

2016-1-11**

分布式架構Zookeeper Dubbo介紹

隨著網際網路技術的發展,的規模在不斷地擴大,單一應用架構已經不再能滿足需求,由於架構的原因,系統中某一處如果要進行修改,整個應用就需要重新部署,代價非常大。而在分布式架構中就能很好地解決上述問題,每乙個模組就拆分為乙個單獨的服務,當模組的訪問量變大時,就可以將同乙個服務部署到不同的機器中同時執行。當...

Scrapy Redis分布式爬蟲元件

scrapy是乙個框架,他本身是不支援分布式的。如果我們想要做分布式的爬蟲,就需要借助乙個元件叫做scrapy redis,這個元件正是利用了redis可以分布式的功能,整合到scrapy框架中,使得爬蟲可以進行分布式。可以充分的利用資源 多個ip 更多頻寬 同步爬取 來提高爬蟲的爬行效率。可以充分...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...