閱讀218 返回首頁    go 阿裏雲 go 技術社區[雲棲]


tns(thrift 分布式組件)介紹

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

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

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

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內部結構圖
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均可隨時增加或減少,從而實現水平動態可擴展。

詳細使用幫助文檔,朋友們可以參考thriftnameserver 的WIKI。


tns交流群

jerry 於北京
2016-1-11

最後更新:2017-04-11 16:00:48

  上一篇:go tns的兩種模式及灰度發布與冷啟動
  下一篇:go CAP in tns