前言
前面我們一直在做prometheus的遠程儲存的工作,一直缺乏一種大廠背書的解決方案。具體可能有下面的幾點:
- 大廠背書且開源
- 可承接大規模海量metrics
- 非weave cortex這種對prometheus原有方案改動特別大,即可以單獨升級prometheus。
可喜可賀,Uber開源了他們針對prometheus儲存解決方案M3,包括諸多組件。
M3
摘要
為了促進優步全球運營的發展,我們需要能夠在任何特定時間快速儲存和訪問我們後端系統上的數十億個指標。作為我們強大且可擴充的指標基礎架構的一部分,我們構建了M3,這是一個已在優步使用多年的指標平台。
M3可以在較長的保留時間內可靠地儲存大規模指標。為了向更廣泛的社區中的其他人提供這些好處,我們決定開放M3平台作為Prometheus的遠程儲存後端,Prometheus是一種流行的監控和警報解決方案。正如其文檔所述,Prometheus的可擴充性和耐用性受到單個節點的限制。 M3平台旨在為Prometheus指標提供安全,可擴充且可配置的多租戶的儲存。
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設定。
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:7201metrics: 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: noneclusters: - 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: trueremote_write: - url: "http://localhost:7201/api/v1/prom/remote/write"
總結
先簡單介紹一下,後續再進行demo,測試,源碼解讀等其他工作。