写点什么

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:554284

评论

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

VoneBaaS平台让区块链服务触手可得

旺链科技

区块链 产业区块链 VoneBaaS 企业号九月金秋榜

从0到1项目搭建-框架搭建(附源码)

微枫Micromaple

架构 springboot Druid Mybatis-Plus 9月月更

开发者有话说|从心出发

胖虎不秃头

个人成长

一张图读懂「融云一站式全生态出海解决方案」

融云 RongCloud

白皮书 社交网络

微信小程序开发|宿主环境详解

陈橘又青

9月月更

技术分享| 快对讲融合视频监控功能设计

anyRTC开发者

监控 音视频 调度 快对讲 GB28181

前端面试5家公司,被经常问到的vue面试题

bb_xiaxia1998

Vue 前端

上海UI设计培训哪家好

小谷哥

UI设计培训需要学习哪些技术?

小谷哥

我的C/C++技术成长之路

Fire_Shield

程序人生 C/C++ 9月月更

总结了一些vue相关的题目,话说今年前端面试难度好大

bb_xiaxia1998

Vue 前端

Kyligence 入选 Gartner 指标中台创新洞察报告

Kyligence

指标管理 指标中台 数据分析管理

Docker 的快速入门

Docker 9月月更

对于epoll实现原理的理解

C++后台开发

后台开发 linux开发 epoll select C++开发

面试突击85:为什么事务@Transactional会失效?

Java快了!

从 OLAP 到指标中台 SaaS,关键指标赋能业务管理

Kyligence

OLAP Kyligence 数据管理 指标中台

EMQX Kubernetes Operator:快速体验EMQX 5.0云原生特性

EMQ映云科技

云原生 物联网 IoT emqx 9月月更

在西安参加Java培训学费多少钱?

小谷哥

web前端培训班哪家比较好

小谷哥

物联网平台简介——产品功能类

阿里云AIoT

大数据 安全 物联网平台 物联网 IoT

leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(中等)

okokabcd

LeetCode 算法与数据结构

物联网平台功能介绍——产品功能类

阿里云AIoT

大数据 物联网平台 物联网 IoT 设备管理

直播预告 | 乘云而上,企业海量数据如何「丝滑」地迁移上云?

京东科技开发者

云服务 数据迁移 资讯 京东云 企业云

Wiki在企业内部的应用和管理,如何构建有效的Wiki系统?

Baklib

【IT运维】如何有效保障服务器账号密码安全?

行云管家

运维 IT运维 行云管家 账号安全

经典再升级 | 尚硅谷电商数仓5.0视频教程发布

小谷哥

MobTech 短信验证 Flutter插件

MobTech袤博科技

flutter ios android

【等保小知识】等级保护单项测评包括哪些项目?

行云管家

等保 等级保护 等级测评

多标签用户画像分析跑得快的关键在哪里?

跳楼梯企鹅

kubectl 插件推荐: kubectl-watch

云原生技术社区

k8s 插件 kubectl kubectl插件 kubectl-watch

IM跨平台技术学习(二):Electron初体验(快速开始、跨进程通信、打包、踩坑等)

JackJiang

即时通讯IM

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