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,测试,源码解读等其余工做。

相关文章
相关标签/搜索