前言
前面我们一直在做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: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,测试,源码解读等其他工作。