写点什么

Uber 开源其大规模指标平台 M3

  • 2018-08-25
  • 本文字数:1515 字

    阅读完需:约 5 分钟

Uber 的工程团队发布了其开源指标平台 M3,该平台已经在 Uber 内部使用多年。构建这个平台是为了取代基于 Graphite 的系统,M3 提供了集群管理、聚合、收集、存储管理、分布式时序数据库(TSDB)以及带有其查询语言 M3QL 的查询引擎。

Uber 之前的指标和监控系统是基于 Graphite 的,由一个共享的 Carbon 集群作为支撑,Nagios 负责告警,Grafana 负责提供仪表盘功能。这种方式的问题在于弹性和集群能力比较差、扩展 Carbon 集群的运维成本比较高以及缺少副本的功能,使得每个节点都面临单点故障的风险。新的 M3 指标系统就是为了应对这些问题而产生的。除了扩展性、全局性、跨数据中心的响应式查询之外,新系统的目标还包括标记指标、维持以 StatsD 和 Graphite 格式发送指标的服务的兼容性。 Rob Skillington 是 Uber 的软件工程师,在最近的文章中描述了M3 的架构。M3 目前存储了66 亿条时序数据,每秒收集5 亿个指标并且每秒存储2000 万个指标。

初始版本的M3 包含了一些开源的组件,包括用于聚合的 statsite 、用于存储的 Cassandra 以及用于索引的 Elasticsearch 。但是这些组件逐渐被内部实现替代了,这主要是因为不断增加的运维成本以及对新特性的需求。在 Uber,因为很多团队在广泛使用 Prometheus,M3 在构建的时候,集成 Prometheus 作为远程的存储后端。

Prometheus 的集成是通过一个 sidecar 组件实现的,该组件会向本地区域(regional)的 M3DB 实例写入数据,并将查询扩展至“区域间协调器(inter-regional coordinator),它会从本地区域的 M3DB (存储引擎)实例协调读取”。这种模型的运行方式类似于 Thanos ,Thanos 是 Prometheus 的一个扩展,提供了跨集群联合、无限制存储以及跨集群全局查询的功能。但是,Uber 团队基于各种原因并没有选择Thanos ,主要原因在于非本地存储的指标所带来的高延迟。Thanos 从AWS S3 中拉取并缓存指标数据,因此会带来相关的延迟和用于缓存的额外空间使用,鉴于Uber 在延迟方面的需求以及庞大的数据量,这种方式是不可行的。

M3 的查询引擎提供了所有指标数据的全局视图,无需跨区域的副本。指标写入到本地区域的 M3DB 实例中,副本对区域来讲是本地化的。查询既可以访问本地区域实例,也可以访问存储指标的远程区域中的协调器。结果是在本地聚合的,未来的工作计划是所有的查询都会在远程协调器中进行。

M3 允许用户指定每个指标存储的保存期限和粒度,就像 Carbon 一样。M3 的存储引擎会将每个指标在区域内生成三个副本。为了减少磁盘的使用,会采用自定义的压缩算法对数据进行压缩。大多数的时序数据库都具有压缩整理(compaction)的特性,较小的数据块会重写到较大的数据块中,并重新组织结构以便于提升查询性能。M3DB 尽可能地避免这种压缩整理,从而最大限度地利用主机资源进行更多的并发写入操作并实现稳定的写入和读取延迟。

Skillington 在文章中说到,“M3DB 只有在绝对必要的时候,才会将基于时间的数据压缩整理到一起,比如回填(backfilling)数据,或者将时间窗口索引文件联合在一起具有一定意义的时候”。指标使用一个流模型进行缩小采样(downsample),当指标进入的时候,缩小采样的流程就会执行。

因为PromQL 缺少了一些特性,所以 Uber 内部使用了M3 自己的查询语言 M3QL。在能够处理的指标基数方面会有一些限制,这主要指的是查询而并非存储。M3 通过采用 Bloom 过滤器内存映射文件的索引,优化了对时间数据的访问。Bloom 过滤器用来确定集合中是否存在某些内容,在M3 中,它用来确定要查询的序列是否需要从硬盘中检索。团队目前正在致力于添加在 Kubernetes 上运行 M3 的功能

M3 是使用 Go 语言编写的,可以通过 Github 获取。

查看英文原文: Uber Open Sources Its Large Scale Metrics Platform M3

2018-08-25 16:554228

评论

发布
暂无评论
发现更多内容

JVM源码分析之synchronized实现

猿灯塔

Android | Tangram动态页面之路(五)Tangram原理

哈利迪

android

职场“潜”规则

L3C老司机

个人成长 职场 新人 人才培养 能力模型

Elastic Stack 系列专辑

Yezhiwei

elasticsearch Logstash Kibana ELK Elastic Stack

kotlin 200行代码开发一个简化版Guice

陈吉米

Java kotlin guice ioc mynlp

2020年全球经济萎缩,火花国际PLUS逆袭而来闪耀数字经济

极客编

企业数字化转型:用 SpreadJS 打造互通互链的电力系统物联网

葡萄城技术团队

数字化转型 SpreadJS 电力

为提升网点业务员效率,我们做的事情。

黄大路

商业

万字长文带你看懂Mybatis缓存机制

程序员小岑

Java 源码 技术 mybatis

Enhanced Github:一个 GitHub 专用的好插件

非著名程序员

GitHub 程序员 效率工具

如何做好 To B 的 SAAS 服务

路边水果摊

SASS 企业 服务

敏捷为什么会失败之「PA-SA-WAKA-DA」理论

易成研发中心

Scrum 敏捷开发 Agile

nginx 概念及上手

HelloZyjS

SpringBoot瘦身

JFound

Spring Boot sprnig

Redis 命令执行过程(下)

程序员历小冰

redis 源码分析

识别代码中的坏味道(四)

Page

敏捷开发 面向对象 重构 CleanCode 代码坏味道

JavaScript 基础拾遗(一)

hq

Java 学习 文章收集

关于架构的几件小事:System context

北风

系统架构 系统性思考 架构师 系统上下文 极客大学架构师训练营

SQLite是什么

山楂大卷

sqlite 数据库 RDBMS 存储

程序员需要了解的硬核知识大全

苹果看辽宁体育

Java c 计算机基础

Redis6.0 多线程源码分析

代码诗人

redis 源码 技术 线程模型

我的编程之路-4(进阶)

顿晓

进阶 看书 编程之路

天天都是520

Neco.W

爱情 表白日

当我们持续感觉很糟糕要怎么办

董一凡

写作 生活质量 情感

ARTS_20200520

凌轩

Java ARTS 打卡计划

深入剖析ThreadLocal原理

JFound

Java

竟然有人想看我的「日记」,满足一下大家

非著名程序员

学习 程序人生 提升认知

推动敏捷,就是推动软件业变革

盛安德软件

敏捷 推动软件业变革

回“疫”录(22):我以为结束了,其实才开始

小天同学

疫情 回忆录 现实纪录 纪实

JVM源码分析之Java对象头实现

猿灯塔

Django的ListView超详细用法(含分页paginate功能)

BigYoung

Python django ListView 分页

Uber开源其大规模指标平台M3_DevOps & 平台工程_Hrishikesh Barua_InfoQ精选文章