Prometheus實戰--儲存篇

來源:互聯網
上載者:User

前言

Prometheus之於kubernetes(監控領域),如kubernetes之於容器編排。
隨著heapster不再開發和維護以及influxdb 叢集方案不再開源,heapster+influxdb的監控方案,只適合一些規模比較小的k8s叢集。而prometheus整個社區非常活躍,除了官方社區提供了一系列高品質的exporter,例如node_exporter等。Telegraf(集中採集metrics) + prometheus的方案,也是一種減少部署和管理各種exporter工作量的很好的方案。
今天主要講講我司在使用prometheus過程中,儲存方面的一些實戰經驗。

Prometheus 儲存瓶頸

通過prometheus的架構圖可以看出,prometheus提供了本機存放區,即tsdb時序資料庫。本機存放區的優勢就是營運簡單,缺點就是無法海量的metrics持久化和資料存在丟失的風險,我們在實際使用過程中,出現過幾次wal檔案損壞,無法再寫入的問題。
當然prometheus2.0以後壓縮資料能力得到了很大的提升。為瞭解決單節點儲存的限制,prometheus沒有自己實現叢集儲存,而是提供了遠程讀寫的介面,讓使用者自己選擇合適的時序資料庫來實現prometheus的擴充性。

prometheus通過下面兩種方式來實現與其他的遠端儲存系統對接

  • Prometheus 按照標準的格式將metrics寫到遠端儲存
  • prometheus 按照標準格式從遠端的url來讀取metrics

metrics的持久化的意義和價值

其實監控不僅僅是體現在可以即時掌握系統運行情況,及時警示這些。而且監控所採集的資料,在以下幾個方面是有價值的

  • 資源的審計和計費。這個需要儲存一年甚至多年的資料的。
  • 故障責任的追查
  • 後續的分析和挖掘,甚至是利用AI,可以實現警示規則的設定的智能化,故障的根因分析以及預測某個應用的qps的趨勢,提前HPA等,當然這是現在流行的AIOPS範疇了。

Prometheus 資料持久化方案

方案選型

社區中支援prometheus遠程讀寫的方案

  • AppOptics: write
  • Chronix: write
  • Cortex: read and write
  • CrateDB: read and write
  • Elasticsearch: write
  • Gnocchi: write
  • Graphite: write
  • InfluxDB: read and write
  • OpenTSDB: write
  • PostgreSQL/TimescaleDB: read and write
  • SignalFx: write
  • clickhouse: read and write

選型方案需要具備以下幾點

  • 滿足資料的安全性,需要支援容錯,備份
  • 寫入效能要好,支援分區
  • 技術方案不複雜
  • 用於後期分析的時候,查詢文法友好
  • grafana讀取支援,優先考慮
  • 需要同時支援讀寫

基於以上的幾點,clickhouse滿足我們使用情境。
Clickhouse是一個高效能的列式資料庫,因為側重於分析,所以支援豐富的分析函數。

下面是Clickhouse官方推薦的幾種使用情境:

  • Web and App analytics
  • Advertising networks and RTB
  • Telecommunications
  • E-commerce and finance
  • Information security
  • Monitoring and telemetry
  • Time series
  • Business intelligence
  • Online games
  • Internet of Things

ck適合用於儲存Time series
此外社區已經有graphouse項目,把ck作為Graphite的儲存。

效能測試

寫入測試

本地mac,docker 啟動單台ck,承接了3個叢集的metrics,均值達到12910條/s。寫入毫無壓力。其實在網盟等公司,實際使用時,達到30萬/s。

查詢測試

fbe6a4edc3eb :) select count(*) from metrics.samples;SELECT count(*)FROM metrics.samples┌──count()─┐│ 22687301 │└──────────┘1 rows in set. Elapsed: 0.014 sec. Processed 22.69 million rows, 45.37 MB (1.65 billion rows/s., 3.30 GB/s.)

其中最有可能耗時的查詢:
1)查詢彙總sum

fbe6a4edc3eb :) select sum(val) from metrics.samples where arrayExists(x -> 1 == match(x, 'cid=9'),tags) = 1 and name = 'machine_cpu_cores' and ts > '2017-07-11 08:00:00'SELECT sum(val)FROM metrics.samplesWHERE (arrayExists(x -> (1 = match(x, 'cid=9')), tags) = 1) AND (name = 'machine_cpu_cores') AND (ts > '2017-07-11 08:00:00')┌─sum(val)─┐│     6324 │└──────────┘1 rows in set. Elapsed: 0.022 sec. Processed 57.34 thousand rows, 34.02 MB (2.66 million rows/s., 1.58 GB/s.)

2)group by 查詢

fbe6a4edc3eb :) select sum(val), time  from metrics.samples where arrayExists(x -> 1 == match(x, 'cid=9'),tags) = 1 and name = 'machine_cpu_cores' and ts > '2017-07-11 08:00:00' group by toDate(ts) as time;SELECT    sum(val),    timeFROM metrics.samplesWHERE (arrayExists(x -> (1 = match(x, 'cid=9')), tags) = 1) AND (name = 'machine_cpu_cores') AND (ts > '2017-07-11 08:00:00')GROUP BY toDate(ts) AS time┌─sum(val)─┬───────time─┐│     6460 │ 2018-07-11 ││      136 │ 2018-07-12 │└──────────┴────────────┘2 rows in set. Elapsed: 0.023 sec. Processed 64.11 thousand rows, 36.21 MB (2.73 million rows/s., 1.54 GB/s.)

3) Regex

fbe6a4edc3eb :) select sum(val) from metrics.samples where name = 'container_memory_rss' and arrayExists(x -> 1 == match(x, '^pod_name=ofo-eva-hub'),tags) = 1 ;SELECT sum(val)FROM metrics.samplesWHERE (name = 'container_memory_rss') AND (arrayExists(x -> (1 = match(x, '^pod_name=ofo-eva-hub')), tags) = 1)┌─────sum(val)─┐│ 870016516096 │└──────────────┘1 rows in set. Elapsed: 0.142 sec. Processed 442.37 thousand rows, 311.52 MB (3.11 million rows/s., 2.19 GB/s.)

總結:
利用好所建索引,即使在大資料量下,查詢效能非常好。

方案設計

關於此架構,有以下幾點:

  • 每個k8s叢集部署一個Prometheus-clickhouse-adapter 。關於Prometheus-clickhouse-adapter該組件,下面我們會詳細解讀。
  • clickhouse 叢集部署,需要zk叢集做一致性表資料複製。

而clickhouse 的叢集如下:

  • ReplicatedGraphiteMergeTree + Distributed。ReplicatedGraphiteMergeTree裡,共用同一個ZK路徑的表,會相互,注意是,相互同步資料
  • 每個IDC有3個分區,各自佔1/3資料
  • 每個節點,依賴ZK,各自有2個副本

這塊詳細步驟和思路,請參考ClickHouse叢集搭建從0到1。感謝新浪的鵬哥指點。只不過我們實際情境是時序資料,所以將ReplicatedMergeTree表引擎改為ReplicatedGraphiteMergeTree,讓資料具備graphite_rollup的功能。

Prometheus-Clickhuse-Adapter組件

Prometheus-Clickhuse-Adapter(Prom2click) 是一個將clickhouse作為prometheus 資料遠程儲存的適配器。
prometheus-clickhuse-adapter,該項目缺乏日誌,對於一個實際生產的項目,是不夠的,此外一些資料庫連接細節實現的也不夠完善,已經在實際使用過程中將改進部分作為pr提交。

在實際使用過程中,要注意並發寫入資料的數量,及時調整啟動參數ch.batch 的大小,實際就是批量寫入ck的數量,目前我們設定的是65536。因為ck的Merge引擎有一個300的限制,超過會報錯

Too many parts (300). Merges are processing significantly slower than inserts

300是指 processing,不是指一次批量插入的條數。

總結

這篇文章主要講了我司Prometheus在儲存方面的探索和實戰的一點經驗。後續會講Prometheus查詢和採集分離的高可用架構方案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.