Prometheus實戰--Uber背書的存儲解決方案M3

前言

前面咱們一直在作prometheus的遠程存儲的工做,一直缺少一種大廠背書的解決方案。具體可能有下面的幾點:node

  • 大廠背書且開源
  • 可承接大規模海量metrics
  • 非weave cortex這種對prometheus原有方案改動特別大,便可以單獨升級prometheus。

可喜可賀,Uber開源了他們針對prometheus存儲解決方案M3,包括諸多組件。git

M3

摘要

爲了促進優步全球運營的發展,咱們須要可以在任何特定時間快速存儲和訪問咱們後端系統上的數十億個指標。做爲咱們強大且可擴展的指標基礎架構的一部分,咱們構建了M3,這是一個已在優步使用多年的指標平臺。
M3能夠在較長的保留時間內可靠地存儲大規模指標。爲了向更普遍的社區中的其餘人提供這些好處,咱們決定開放M3平臺做爲Prometheus的遠程存儲後端,Prometheus是一種流行的監控和警報解決方案。正如其文檔所述,Prometheus的可擴展性和耐用性受到單個節點的限制。 M3平臺旨在爲Prometheus指標提供安全,可擴展且可配置的多租戶的存儲。github

M3於2015年發佈,目前擁有超過66億個時間序列。 M3每秒聚合5億個指標,並在全球範圍內(使用M3DB)每秒持續存儲2000萬個度量指標,批量寫入將每一個指標持久保存到區域中的三個副本。它還容許工程師編寫度量策略,告訴M3以更短或更長的保留時間(兩天,一個月,六個月,一年,三年,五年等)以特定的粒度(一秒,十秒,一分鐘,十分鐘等)。這容許工程師和數據科學家使用與定義的存儲策略匹配的度量標籤(標籤),在精細和粗粒度範圍內智能地存儲不一樣保留的時間序列。例如,工程師能夠選擇存儲「應用程序」標記爲「mobile_api」且「端點」標記爲「註冊」的全部度量標準,這些標記在10秒粒度下爲30天,在一小時粒度下爲5年。數據庫

PS:uber的metrcis的數量能夠說是海量級別。該方案知足前言提到的幾點要求。後端

多區域查詢示意圖

圖片描述

集羣架構

圖片描述

組件介紹

M3 Coordinator

M3 Coordinator是一種服務,用於協調上游系統(如Prometheus和M3DB)之間的讀寫操做。它是用戶能夠部署以訪問M3DB的優點的橋樑,例如長期存儲和與其餘監控系統(如Prometheus)的多DC設置。api

M3DB

M3DB是一個分佈式時間序列數據庫,提供可擴展存儲和時間序列的反向索引。它通過優化,具備成本效益和可靠的實時和長期保留指標存儲和索引安全

M3 Query

M3 Query是一種服務,它包含一個分佈式查詢引擎,用於查詢實時和歷史指標,支持多種不一樣的查詢語言。它旨在支持低延遲實時查詢和可能須要更長時間執行的查詢,聚合更大的數據集,用於分析用例架構

M3 Aggregator

M3 Aggregator是一種做爲專用度量聚合器運行的服務,它基於存儲在etcd中的動態規則提供基於流的下采樣。它使用領導者選舉和聚合窗口跟蹤,利用etcd來管理此狀態,從而可靠地爲低採樣度量標準發送至少一次聚合到長期存儲。這提供了成本有效且可靠的下采樣和彙總指標。這些功能也存在於M3協調器中,但專用聚合器是分片和複製的,而M3協調器則不須要而且須要謹慎部署和以高可用性方式運行。還有一些工做要使用戶更容易訪問聚合器,而無需他們編寫本身的兼容生產者和消費者。分佈式

與 prometheus 集成

架構示例

圖片描述

M3 Coordinator 配置

要寫入遠程M3DB集羣,最簡單的配置是將m3coordinator做爲旁邊的Prometheus運行。測試

首先下載配置模板。更新新羣集的命名空間和客戶端部分以匹配羣集的配置。

您須要指定M3DB種子節點的靜態IP或主機名,以及您設置的命名空間的名稱和保留值。您能夠將命名空間存儲指標類型保留爲未聚合,由於默認狀況下須要具備一個接收全部未聚合的Prometheus指標的集羣。在未來,您可能還但願聚合和縮減採樣指標以實現更長的保留期,而且您能夠在設置這些羣集後返回並更新配置。

listenAddress: 0.0.0.0:7201

metrics:
  scope:
    prefix: "coordinator"
  prometheus:
    handlerPath: /metrics
    listenAddress: 0.0.0.0:7203 # until https://github.com/m3db/m3/issues/682 is resolved
  sanitization: prometheus
  samplingRate: 1.0
  extended: none

clusters:
   - namespaces:
# We created a namespace called "default" and had set it to retention "48h".
       - namespace: default
         retention: 48h
         storageMetricsType: unaggregated
     client:
       config:
         service:
           env: default_env
           zone: embedded
           service: m3db
           cacheDir: /var/lib/m3kv
           etcdClusters:
             - zone: embedded
               endpoints:
# We have five M3DB nodes but only three are seed nodes, they are listed here.
                 - M3DB_NODE_01_STATIC_IP_ADDRESS:2379
                 - M3DB_NODE_02_STATIC_IP_ADDRESS:2379
                 - M3DB_NODE_03_STATIC_IP_ADDRESS:2379
       writeConsistencyLevel: majority
       readConsistencyLevel: unstrict_majority
       writeTimeout: 10s
       fetchTimeout: 15s
       connectTimeout: 20s
       writeRetry:
         initialBackoff: 500ms
         backoffFactor: 3
         maxRetries: 2
         jitter: true
       fetchRetry:
         initialBackoff: 500ms
         backoffFactor: 2
         maxRetries: 3
         jitter: true
       backgroundHealthCheckFailLimit: 4
       backgroundHealthCheckFailThrottleFactor: 0.5

Prometheus 配置

remote_read:
  - url: "http://localhost:7201/api/v1/prom/remote/read"
    # To test reading even when local Prometheus has the data
    read_recent: true
remote_write:
  - url: "http://localhost:7201/api/v1/prom/remote/write"

總結

先簡單介紹一下,後續再進行demo,測試,源碼解讀等其餘工做。

相關文章
相關標籤/搜索