數(shù)據(jù)可視化(七)Graphite 體系結(jié)構(gòu)詳解

Graphite 是處理可視化和指標(biāo)數(shù)據(jù)的優(yōu)秀開(kāi)源工具。它有強(qiáng)大的查詢 API 和相當(dāng)豐富的插件功能設(shè)置。事實(shí)上,Graphite 指標(biāo)協(xié)議(metrics protocol)是許多指標(biāo)收集工具的事實(shí)標(biāo)準(zhǔn)格式。然而,Graphite 并不總是一個(gè)可以簡(jiǎn)單部署和使用的工具。由于設(shè)計(jì)方面的原因,加上它使用過(guò)程中涉及大量的小 I/O 操作,在規(guī)模化應(yīng)用中會(huì)遇到一些問(wèn)題,而且部署起來(lái)可能有點(diǎn)麻煩。

Graphite 部署痛苦的部分原因是,它是由三個(gè)不同的元素組成(當(dāng)然,如果包括指標(biāo)采集就是四個(gè)),這些取決于你的環(huán)境,只有其中一個(gè)或多個(gè)默認(rèn)元素可能不能滿足你的需要。


Graphite Architecture Diagram

雖然 Graphite 包含三個(gè)組件可能會(huì)導(dǎo)致一些實(shí)施的問(wèn)題,但也有積極的成果。每一個(gè)模塊塊都是一個(gè)獨(dú)立的單元,這樣你就可以按照實(shí)際的需要混合和匹配使用三個(gè)組件中的哪一個(gè)。同時(shí)意味著您可以為自己構(gòu)建一個(gè)完全定制化的 Graphite 部署方案。

讓我們逐一來(lái)看看你需要做些什么,對(duì)于 Graphite 的每一個(gè)組成部分來(lái)說(shuō),都可以是一個(gè) Graphite 的方案或者是非 Graphite 的替代品。

1. 指標(biāo)采集器 - Dropwizard Metrics, StatsD

Graphite 部署方案中的的第一個(gè)步驟根本不是 Graphite 的組成部分。這是因?yàn)?Graphite 自身并不支持采集任何指標(biāo);Graphite 需要有人將指標(biāo)數(shù)據(jù)發(fā)送給它。這通常不是一個(gè)特別大的限制,因?yàn)榇蠖鄶?shù)指標(biāo)采集器都支持以 Graphite 格式提供指標(biāo)數(shù)據(jù),但仍然有一些東西需要注意。我們可選的不同指標(biāo)采集器可以列一個(gè)龐大的列表,但是沒(méi)有一個(gè)工具是包含在基礎(chǔ) Graphite 中的。

選擇你的指標(biāo)采集器 – Graphite 文檔中提供了一個(gè)工具列表,包括流行的選擇像 CollectD 和 Diamond ,但它很少更新,所以你還可以考慮以下兩個(gè)方案:

Dropwizard Metrics – [Metrics](Metrics is a Java library which gives you unparalleled insight into what your code does in production.) 是一個(gè) Java 庫(kù),通過(guò)一系列指標(biāo)為你提供生產(chǎn)環(huán)境的可視化。它有一個(gè) Graphite Reporter,可以將所有的指標(biāo)數(shù)據(jù)發(fā)送到 Graphite 實(shí)例。對(duì)于需要在 Java 生態(tài)中使用 Graphite 的場(chǎng)景來(lái)說(shuō),它是一個(gè)不錯(cuò)的選擇。

StatsD – StatsD 是一個(gè)基于 Node.js 運(yùn)行的網(wǎng)絡(luò)守護(hù)進(jìn)程,來(lái)自 Etsy (網(wǎng)絡(luò)電商平臺(tái))。它可以監(jiān)聽(tīng)一系列統(tǒng)計(jì)、指標(biāo)數(shù)據(jù),并將它們聚集到像 Graphite 這樣的工具中。StatsD 也可以和很多其他的可視化、指標(biāo)采集工具一起工作。

小結(jié): Graphite 不和特定的指標(biāo)采集器捆綁。然而, Graphite 指標(biāo)協(xié)議是非常常見(jiàn)的,因此不難找到一個(gè)或多個(gè)與您的應(yīng)用程序一起工作的協(xié)議。既然有這么多的指標(biāo)采集器和 Graphite 配合良好,你不需要只選擇一個(gè),你可以選擇從多個(gè)數(shù)據(jù)源發(fā)送指標(biāo)。

2. 監(jiān)聽(tīng)器 - Carbon, graphite-ng, and Riemann

Graphite 的另一部分是用于監(jiān)聽(tīng)發(fā)送的指標(biāo)數(shù)據(jù)并將其寫入磁盤的組件 —— Carbon (原意:碳)。Carbon 是由守護(hù)進(jìn)程組成的,在工作方式方面有一些內(nèi)置的靈活性。

在基本的小規(guī)模部署中, Carbon 守護(hù)程序會(huì)監(jiān)聽(tīng)指標(biāo)數(shù)據(jù)并將它們報(bào)告給 Whisper 存儲(chǔ)數(shù)據(jù)庫(kù)。然而,隨著規(guī)模的增長(zhǎng)可以添加一個(gè)聚合元素(A ggregation),它在一段時(shí)間內(nèi)緩沖指標(biāo)數(shù)據(jù),然后將它們發(fā)送給一個(gè)大塊中的 Whisper 。你也可以使用 Carbon 傳遞指標(biāo)副本到多個(gè) Carbon 后臺(tái)。當(dāng)你達(dá)到更高的規(guī)模、需要多個(gè) Carbon 后臺(tái)程序來(lái)處理傳入的指標(biāo)數(shù)據(jù)時(shí),這一點(diǎn)特別有用。

缺點(diǎn)和潛在的問(wèn)題 —— 人們通常遇到的問(wèn)題通常跟規(guī)模相關(guān)。就規(guī)模應(yīng)用而言,Carbon 有以下幾個(gè)缺點(diǎn) :

  • 一個(gè)單獨(dú)的 Carbon 守護(hù)程序處理能力有限,因?yàn)樗怯?Python 語(yǔ)言設(shè)計(jì)的。本機(jī)代碼不支持一次多個(gè)線程同時(shí)運(yùn)行( Multiple threads),所以可能出現(xiàn) Carbon 守護(hù)程序剛剛啟動(dòng)時(shí)丟棄指標(biāo)數(shù)據(jù)的情況。
  • Carbon 有一個(gè)它一次能處理負(fù)載數(shù)量的閾值,但這個(gè)閾值并沒(méi)有傳達(dá)給你。
  • Carbon 并沒(méi)有持續(xù)打開(kāi) Whisper 的文件句柄,所以存儲(chǔ)每個(gè)指標(biāo)都需要多步的完整讀/寫序列。

基于標(biāo)準(zhǔn)的 Graphite 部署實(shí)例中,這些情況的解決方法是將工作劃分為中繼器( Carbon relays) 和 緩存(Carbon caches )。盡管如此,您仍然需要注意負(fù)載,因?yàn)槌^(guò)了 Carbon 的負(fù)荷會(huì)導(dǎo)致數(shù)據(jù)丟失。如果這個(gè)后果對(duì)你來(lái)說(shuō)無(wú)法接受,可以看看 Carbon 的替代解決方案。

Carbon 替代方案
Carbon 的另一種替代方法是 graphite-ng,本質(zhì)上是基于 Go 語(yǔ)言重寫了一遍 Carbon ,以解決上面提到的幾個(gè)問(wèn)題。迄今為止,該項(xiàng)目的重點(diǎn)是改進(jìn) Carbon 的中繼和聚合功能。如果你喜歡 Carbon 的功能,但是又想要繞過(guò)一些性能方面的限制,這是一個(gè)不錯(cuò)的選擇。

另一個(gè)替代方案是 Reimann?;?Clojure 語(yǔ)言實(shí)現(xiàn)(屬于 LISP 編程語(yǔ)言家族),Reimann 是用來(lái)聚集和處理“事件流(event streams)”。事件和流都是相當(dāng)簡(jiǎn)單的概念,Riemann 能代替 Carbon 把它們發(fā)送到 Graphite 實(shí)例。它在這個(gè)過(guò)程增加了一些提供了額外的好處,例如告警功能。如果你想設(shè)計(jì)一個(gè)遠(yuǎn)離 Carbon 的架構(gòu),這是一個(gè)很好的選擇,還能加入一些涉及告警方面的能力。

爭(zhēng)議觀點(diǎn)

Cyanite does not only "work with carbon". Just like influxdb, it implements the graphite line receiver protocol and thus replaces carbon-cache.

Riemann can't send data to your graphite deployment "in place of carbon". It can act as a much more powerful carbon-aggregator, but it doesn't replace carbon-cache.

小結(jié): Carbon 負(fù)責(zé)監(jiān)聽(tīng)指標(biāo)數(shù)據(jù)并將它們寫入到您的存儲(chǔ)數(shù)據(jù)庫(kù),但經(jīng)常在規(guī)?;瘧?yīng)用上遇到性能問(wèn)題。有一些現(xiàn)成的替代方案可以解決這個(gè)問(wèn)題。

3. 存儲(chǔ)數(shù)據(jù)庫(kù) – Whisper, InfluxDB, Cyanite

您需要選擇的下一個(gè)組件是存儲(chǔ)數(shù)據(jù)庫(kù)。在 Graphite 體系結(jié)構(gòu)中稱之為 Whisper。Whisper 是一種固定大小的數(shù)據(jù)庫(kù),用于存儲(chǔ)時(shí)間序列數(shù)據(jù),在保存和取樣方面提供了相當(dāng)?shù)木_度。在標(biāo)準(zhǔn)的 Graphite 部署中,Carbon 將指標(biāo)值寫入 Whisper 存儲(chǔ),用于在 Graphite-web 組件中實(shí)現(xiàn)可視化。

缺點(diǎn)和潛在問(wèn)題:Whisper 基于 RRD(Round- Robin Database),但寫入操作的時(shí)候有一些關(guān)鍵性的差異,例如回填項(xiàng)目歷史數(shù)據(jù)和處理不規(guī)則數(shù)據(jù)的能力。這里有一些指標(biāo)和可視化工具的有用特性,但它們的實(shí)現(xiàn)都是基于某種折衷。

  • 因?yàn)?Whisper 是用Python編寫的,所以相對(duì)來(lái)說(shuō)性能較慢;
  • 按照 Whisper 的設(shè)計(jì),它會(huì)遇到一些存儲(chǔ)空間的問(wèn)題,因?yàn)槊總€(gè)指標(biāo)都需要一個(gè)文件,并且都是單個(gè)實(shí)例。這是一種有意的權(quán)衡,以實(shí)現(xiàn)前面提到的一些好處,但不可否認(rèn),Whisper 對(duì)磁盤空間的利用效率較低。
  • 由于 Carbon 和 Whisper 在設(shè)計(jì)方面的原因,它們最終都涉及到大量的 IO 請(qǐng)求。當(dāng)你超越小型部署時(shí),磁盤 IO 的伸縮能力會(huì)成為擺在面前的一個(gè)問(wèn)題。

Whisper 替代方案
你可以通過(guò)部署固態(tài)硬盤(SSD)或者其它一些設(shè)計(jì)解決 Whisper 的性能問(wèn)題,但也只是點(diǎn)到為止。如果數(shù)據(jù)庫(kù)部分正是你所需要的,那么有幾個(gè)選擇可以考慮。

目前主要的一個(gè)選擇是 influxdata(InfluxDB)。influxdata 是一個(gè)基于 LevelDB、用 Go 語(yǔ)言編寫的時(shí)間序列數(shù)據(jù)庫(kù)。influxdata 能夠解決一些磁盤 IO 寫優(yōu)化問(wèn)題,同時(shí)不要求 one metric = one file 。

influxdata 支持 Carbon 使用的協(xié)議,使它能夠悄悄置換 Whisper,實(shí)現(xiàn)類似 SQL的查詢語(yǔ)言。甚至已經(jīng)有一些項(xiàng)目設(shè)計(jì)用來(lái)使 influxdata 的置換更簡(jiǎn)便易行,例如 graphite-influxdb 項(xiàng)目 ,使得可以和 Graphite 的 API 無(wú)縫銜接。influxdata 屬于非常有前途的新興項(xiàng)目,可以在廣泛的范圍內(nèi)與其他工具一起工作。

另一個(gè)選擇是使用基于 Cassandra 的存儲(chǔ)數(shù)據(jù)庫(kù)。得益于 graphite-cyanite 項(xiàng)目的工作,基于 Cyanite 數(shù)據(jù)庫(kù)可以很容易實(shí)現(xiàn)這一目的。 Cyanite 的開(kāi)發(fā)規(guī)劃目標(biāo)就是在 Graphite 體系結(jié)構(gòu)中替換 Whisper ,這意味著它可以和 Carbon 、 Graphite-web 一起工作(需要少量的一些依賴)。使用 Cyanite 有助于解決 Whisper 在大規(guī)模部署場(chǎng)景中存在的性能和高可用問(wèn)題。

小結(jié) : Graphite 體系結(jié)構(gòu)中,數(shù)據(jù)存儲(chǔ)組件是 Whisper 。在大規(guī)模應(yīng)用中,除非你在硬件方面大量投入、把它分解成復(fù)雜的手動(dòng)集群模式,否則將悄悄地會(huì)遇到一些性能和可用性問(wèn)題。如果你需要關(guān)注這些問(wèn)題,可以使用數(shù)據(jù)庫(kù)的替代選項(xiàng)來(lái)提高性能和可用性。

4. 可視化組件 – Graphite-Web 和 Grafana

一旦你收集并存儲(chǔ)了指標(biāo)數(shù)據(jù),就下來(lái)的步驟就是可視化它們。Graphite-web 的角色就是提供可視化。 Graphite-web 是一種基于 Django 的 Web 應(yīng)用程序,提供指標(biāo)數(shù)據(jù)可視化和交互能力。它在數(shù)據(jù)的處理方面提供了相當(dāng)多的能力,但可視化組件并不十分美觀(也就是說(shuō) “土”、“丑”)。Graphite-web 作為前端組件,我們將著重討論用戶體驗(yàn)的相關(guān)內(nèi)容。


A standard Graphite Dashboard

Graphite-web 替代方案
歸功于卓越的 Graphite API ,目前有一系列第三方儀表盤工具可以支持 Graphite 。因?yàn)橛腥绱吮姸嗟目梢暬x項(xiàng),它們的優(yōu)劣其實(shí)主要取決于個(gè)人品味,再次不作過(guò)多擴(kuò)展,但我確實(shí)想特別指出其中的一個(gè)。也許最具潛力的 Graphite 可視化替代方案, 或至少是人們談?wù)撟疃嗟氖?Grafana 。

Dashboards in Grafana

Grafana 是一個(gè)開(kāi)源的儀表盤工具,可以兼容 Graphite 和 InfluxDB 。Grafana 曾經(jīng)只是一個(gè)基于 Elasticsearch 存儲(chǔ)的前端儀表盤工具,從 V2.0 版本開(kāi)始,它擁有了一個(gè)支持用戶自定義的后端存儲(chǔ)組件。Grafana 在設(shè)計(jì)之初即考慮到支持 Graphite 創(chuàng)建更加優(yōu)美的可視化組件,因此它非常適合替換默認(rèn)的 Graphite-web 。Grafana 功能相當(dāng)豐富,性能穩(wěn)定。Grafana 擁有一個(gè)后端組件,如果你也可以找到純粹的前端工具,Graphite 文檔中提供了工具列表。

小結(jié): 如果你覺(jué)得 Graphite 提供的默認(rèn)可視化效果過(guò)于基礎(chǔ)和乏味,有大量的可視化替代方案可以選擇。其中一些是純粹客戶端,有的包含一個(gè)存儲(chǔ)你建立的儀表盤后端組件。不管你要什么,你都能在這里找到東西。

5. 代碼級(jí)指標(biāo) – Trends

OverOps 發(fā)布了一個(gè)新的功能,可以讓你把代碼級(jí)指標(biāo)從 JVM 應(yīng)用程序中的錯(cuò)誤、與變量狀態(tài)在一起發(fā)送到 Graphite 。詳細(xì):https://www.overops.com

{
 backends: [ "./backends/graphite" ]   // identify this backend as Graphite
 graphitePort: 2003,                   // port of Graphite server 
 graphiteHost: "graphite.example.com", // hostname or IP of Graphite server
 deleteCounters: true,
 graphite: {  // Graphite tweaks for Takipi
   prefixCounter: "",
   prefixGauge: "",
   globalPrefix: "",
   legacyNamespace: false
 }
}

總結(jié)

所有針對(duì) Graphite 的投訴都集中于(它的工作性能不夠穩(wěn)定,儀表盤丑陋!規(guī)?;渴鹗怯矀。?,但不妨礙它成為一個(gè)很流行的工具。如果你想要一個(gè)開(kāi)源的指標(biāo)和可視化工具,為許多企業(yè)級(jí)工具提供支持,那么 Graphite 值得一試。其中最重要的一點(diǎn)是,你可以自定義數(shù)據(jù)內(nèi)容。Graphite 并不是由完全特定的組件一起工作,其中的樂(lè)趣何在 ?經(jīng)過(guò)一些嘗試和錯(cuò)誤,您可以在您自己的環(huán)境中構(gòu)建一個(gè)完全定制化的、非常有用 Graphite (或類似 Graphite 的)部署方案。

Graphite

擴(kuò)展閱讀:數(shù)據(jù)可視化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380