前面咱們一直在作prometheus的遠程存儲的工做,一直缺少一種大廠背書的解決方案。具體可能有下面的幾點:node
可喜可賀,Uber開源了他們針對prometheus存儲解決方案M3,包括諸多組件。git
爲了促進優步全球運營的發展,咱們須要可以在任何特定時間快速存儲和訪問咱們後端系統上的數十億個指標。做爲咱們強大且可擴展的指標基礎架構的一部分,咱們構建了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是一種服務,用於協調上游系統(如Prometheus和M3DB)之間的讀寫操做。它是用戶能夠部署以訪問M3DB的優點的橋樑,例如長期存儲和與其餘監控系統(如Prometheus)的多DC設置。api
M3DB是一個分佈式時間序列數據庫,提供可擴展存儲和時間序列的反向索引。它通過優化,具備成本效益和可靠的實時和長期保留指標存儲和索引安全
M3 Query是一種服務,它包含一個分佈式查詢引擎,用於查詢實時和歷史指標,支持多種不一樣的查詢語言。它旨在支持低延遲實時查詢和可能須要更長時間執行的查詢,聚合更大的數據集,用於分析用例架構
M3 Aggregator是一種做爲專用度量聚合器運行的服務,它基於存儲在etcd中的動態規則提供基於流的下采樣。它使用領導者選舉和聚合窗口跟蹤,利用etcd來管理此狀態,從而可靠地爲低採樣度量標準發送至少一次聚合到長期存儲。這提供了成本有效且可靠的下采樣和彙總指標。這些功能也存在於M3協調器中,但專用聚合器是分片和複製的,而M3協調器則不須要而且須要謹慎部署和以高可用性方式運行。還有一些工做要使用戶更容易訪問聚合器,而無需他們編寫本身的兼容生產者和消費者。分佈式
要寫入遠程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
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,測試,源碼解讀等其餘工做。