Graphite 集群架構

【遷移】Graphite 集群架構

參考這篇文章以及其中提到的幾個鏈接:bitprophet.org/blog/201,實現一個可擴展的監測基礎設施也不是個容易事情。

一些說明:

  • 基本是這個鏈接提到的架構:answers.launchpad.net/g,上面 bitprophet.org 提到的架構感覺複雜了點(bitprophet 用了兩層 consistent hash,並且每個 graphite-web app 只與本機上的 carbon-cache 通信,而不是與所有 carbon-cache 通信),本文提到的架構只用了一層 consistent hash,graphite-web app 會與所有 carbon-cache 通信,好處是理解起來簡單,配置也簡單(每個實例基本都是等價的),壞處是:
    • 增加 carbon-cache 實例時,所有地方的 consistent hash 分布都會受干擾。當增加第二層 hash ring 上的節點時,bitprophet 方案干擾面較小,但實際中這種情況很少出現,因為性能測試就可以在一開始決定單機上部署多少個 carbon-cache 實例,所以在 bitprophet 架構里加 carbon-cache 一般會在第一層 hash ring 上,干擾就一樣大了。
    • graphite-web app 與 carbon-cache 的 TCP 鏈接更多(應該問題不大)
  • 單機上部署 carbon-relay : carbon-aggregator : carbon-cache : graphite-web = 1 : M : N : 1,relay 因為有兩層,可以單機上部署兩個,系統瓶頸在 carbon-aggregator 和 carbon-cache 的 CPU 運算,以及 carbon-cache 的磁碟 I/O,graphite-web 應該沒必要在單機上部署多個,如果有多台機器的話已經有多個 graphite-web 實例做負載均衡了。

  • carbon-relay 在用 rule 轉發時,如果 relay-rules.conf 裡頭的配置支持 consistent hash 方式轉發出去,則可以省略掉第二層 carbon-relay (Graphite 作者兩年前說要支持這個特性,至今貌似還沒加上去)。
  • carbon-0.9.12 里的 bin/carbon-client.py 可以從標準輸入讀入 metrics,所以可以把 carbon-client 部署到 application 所在機器上,啟動兩個 carbon-client 一個 relay 到 carbon-aggregator, 一個 relay 到第二層 carbon-relay,這樣第一層 carbon-relay 可以省略掉,但這個思路並不推薦,因為會把 monitoring infrastructure layout 暴露給 application 一側,維護麻煩。

  • 如果 aggregation 的需求可以全部用 StatsD 做,則 carbon-aggregator 可以省略掉。
  • graphite-web 互相調用這個設計有點奇怪,graphite-web 充當了 frontend 和 web service 雙重角色。
  • carbon-cache 可以從支持 AMQP 協議的 message queue 比如 ActiveMQ 獲取 metrics,這個架構里沒有使用,ActiveMQ 的負載均衡、性能、bug本身就是個頭疼事,包裝個 ActiveMQ 也隱藏了 carbon 簡單的網路協議,感覺加重 application 一側的負擔,甚為可惜。
  • 凡是標記 any 的地方以及 graphite-web 可以用 HAProxy 做 round robin 式的負載均衡。

douban.com 用了 Graphite,不知道他們怎麼配置的,也許單機 Graphite 足夠用,不用想這麼複雜。。。。

另外,Graphite 的 clustering 支持是後加的,graphite-web 提供了 web service 暴露本地的 whisper 文件,基本就是自行實現了 NFS,搞的挺複雜,又不能保證 whisper 存儲的可靠性(節點失敗 whisper 文件不會自動被多複製幾份),graphite-web 之間廣播式的查詢很浪費,如果把 whisper 文件放 NFS 甚至 MooseFS 上,看起來會讓 clustering 支持簡單很多。opentsdb 一開始就考慮了集群,設計的很簡單,但是伊的 UI 弱爆了。


推薦閱讀:

TAG:軟體架構 | Linux |