写点什么

探索与发现,揭秘百度万亿时序数据存储架构

  • 2019-09-09
  • 本文字数:2231 字

    阅读完需:约 7 分钟

探索与发现,揭秘百度万亿时序数据存储架构

万亿架构设计

在百度监控系统 TSDB 的常态工作负载下,单机每秒处理 20 多万数据点,集群每秒处理数万次查询,每天有几万亿的数据点在 TSDB 中穿梭,这样强悍的性能除了得益于 HBase 本身的性能优势外,架构层面的针对性设计同样功不可没。


面对已是万亿级别却仍持续增长的数据规模,我们设计了读/写分离且无状态的“弹性”架构;为了在高负载下仍保证低延迟的写入和查询,我们将数据进行分层,分别存入 Redis、HBase 和 Hadoop;为了不间断地为业务提供可靠的服务,我们设计了具备分钟级自愈能力的异地冗余架构;为了节约存储成本,我们引入并改进了 Facebook 的时序数据压缩算法。


TSDB 的整体架构如图 1 所示。



图 1 TSDB 整体架构

可扩展

我们希望通过简单地增加节点就使系统的处理能力线性提升,如果节点之间完全对等、互不影响,那么对整个集群而言,增加节点没有额外的资源消耗,就可以使处理能力随着节点数线性增长。


根据时序数据写多读少的特点,我们将读、写操作分离,设计了无状态的查询模块 Query-engine 和写模块 Saver,使得 Query-engine 或 Saver 的每个实例完全对等,并在上游应用轮询或者一致性哈希进行负载均衡。


实例的部署是基于百度内部的容器方案 Matrix,一则可以合理地分配资源,二则由于写入和查询隔离开来、互不干扰,其各自的性能均得到充分发挥。基于 Matrix 的虚拟化方案也使 TSDB 能够在分钟级完成任意数量的实例扩容。

高性能

在上一篇文章中介绍的“水平分表”的策略(图 2)中,存在 HBase 里的数据被按时间划分到了不同的 Slice,老的 Slice 访问压力相对较小,减轻了系统处理这部分数据的负载,然而最新的一个 Slice 仍然会保持很高的热度,相对集中的负载仍然给 HBase 集群带来不小的压力。因此,我们利用内存缓存了部分热点数据(查询量相对更多的数据),以空间换取更低的查询响应时间,同时分流 HBase 的查询压力。



图 2 按时间水平分表


缓存能力由百度运维部 DBA 团队的 BDRP 平台提供。但由于数据量太大,缓存一小时的数据需要较多的内存资源,我们在性能和成本之间做了权衡,选择只将核心指标数据写入缓存。


在大批量查询历史数据的场景中,查询的频率不高,对数据时效性的要求也较低,其目标数据通常是冷数据,因此我们把这部分数据从 Saver 的流量中复制出来,定期地灌入独立的 Hadoop 集群,将此类查询压力从 HBase 分流出去。


经过 Hadoop 和 Redis 的查询分流,HBase 仍然存储全量的数据,但其只承接常规的趋势图查询请求以及从缓存穿透的请求。

低成本

为了降低数据的存储成本,我们引入了 Facebook 在论文《Gorilla: A Fast, Scalable, In-Memory Time Series Database》中介绍的一种时序数据压缩算法(见图 3),它能够达到 10 倍的压缩比,我们将其进行改造后应用到了缓存中。



图 3 Facebook Gorilla 中的压缩算法示意图


Gorilla 中的压缩算法较容易理解,其核心思想是增量压缩,不仅针对数据点取值进行压缩,且对时间戳应用了一种 Delta-of-Delta 压缩方法。经过压缩的数据点,其存储空间占用可以“bit”计,算法对于周期稳定、取值变化幅度较小的数据的压缩效果尤其好。


然而,这种增量压缩的算法中,后一个数据点的压缩结果依赖前一个数据点的压缩结果,这要求在集群中为每个时间序列维护压缩的状态,论文未对其分布式实现做详细的介绍,我们将数据压缩成 Byte 流,以 Key-Value 的方式存储在 Redis 中。此外,论文中的算法仅支持浮点型数值,而我们改造后的算法还支持整数型和统计型数值(即上文提到的 StatisticsValue,每一个具有 max、min、sum、count 四个统计值)。


数据压缩的整体方案在实际使用中为我们节省了 80% 的存储空间,额外的 CPU 消耗不超过 10%。

高可用

冗余是高可用的一大法宝,我们使用了简单有效的异地互备的方案,即冗余出一整套集群和数据来实现高可用。写入时,客户端将数据双写到两个集群,查询时通过动态路由表或百度名字服务(Baidu Naming Service, BNS)访问到其中一个集群(图 4),在此基础上我们具备故障自愈机制,可以实现分钟级的单机房故障自愈。



图 4 异地互备

总结

近年来,TSDB 在智慧城市、物联网和车联网等等领域都有着十分广泛的应用,更是成为监控场景的标配基础服务。在《百度大规模时序数据存储》系列的四篇文章中,我们为读者介绍了大规模 TSDB 从模型到功能再到架构的设计实践,但从实际的需求出发,我们认为 TSDB 的架构设计思路和功能侧重点并不局限于文中所述。


技术上,在大规模的时序数据存储系统中,我们选择了 HBase 作为底层存储,但并不代表 HBase 在任何场景下都是最合适的选择。在应用上,TSDB 也会与分布式计算、数据挖掘、异常检测甚至 AI 技术进行深度结合,将会面临更加复杂和富有挑战的场景。


我们设想将 TSDB 抽象成各种功能组件,能够根据不同场景的特点,灵活地搭配各个功能组件,以满足不同的需求。例如在数据量级较小的时候可以基于 MySQL 进行单机存储;或者作为缓存层直接基于内存存储;或者利用 Elasticsearch 的强大检索能力做多维度聚合分析等等。


目前我们已经进行了一些组件化的工作,并在这些工作的基础上实现了对 Cassandra 的支持,后续还将丰富框架和组件,引入新的功能,并逐步实现对 Elasticsearch、MySQL 等存储系统的支持。


作者介绍:


运小尧,百度高级研发工程师,负责百度运维大数据存储平台的设计和研发,致力于追求大规模存储系统的高性能和高可用。


本文转载自公众号 AIOps 智能运维(ID:AI_Ops)。


原文链接:


https://mp.weixin.qq.com/s/VM6tH06e-sA55DWQjeKEOA


2019-09-09 23:031524

评论 1 条评论

发布
用户头像
redis作为时序时间库的缓存,用的是RedisTimeSeries 吗?用于支持时间范围查找
2021-09-24 13:48
回复
没有更多了
发现更多内容

Jina 实例秀|七夕神器!比你更懂你女友的口红AI

Jina AI

七夕 神经网络架构搜索

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化

程序员欣宸

Java LeetCode 8月月更

Jina 实例秀|基于神经搜索的网络安全威胁检测(一)

Jina AI

神经网络架构搜索 Python.

华为开源:聚焦开源基础软件,共建健康繁荣生态

科技热闻

【LeetCode】分组的最大数量Java题解

Albert

LeetCode 8月月更

第1章:初识数据库与MySQL----MySQL安装

乌龟哥哥

8月月更

IDEA 自动导入的配置(Auto import)

HoneyMoose

SAP 人工智能解决方案的演进史 - 从 SAP Leonardo 到 SAP Data Intelligence

汪子熙

人工智能 机器学习 AI SAP 8月月更

架构实战营模块三作业

zhihai.tu

开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握

知识浅谈

开源 8月月更

mysql进阶(二十六)MySQL 索引类型

No Silver Bullet

MySQL MySQL索引 8月月更

《福格行为模型》:如何养成好习惯?

郭明

读书笔记

浅聊偏函数

掘金安东尼

JavaScript 函数式 8月月更

Rust 入门指南 (用 WASM 开发第一个 Web 页面)

王泰

rust Wasm WebAssenbly ​Rust

再次搞定 Ali 云函数计算 FC

小鑫同学

签约计划第三季

Java使用IReport导出复杂报表

源字节1号

微信小程序 软件开发 前端开发 后端开发

8月总结高频vue面试题

helloworld1024fd

Vue

《迁移学习导论》第2版,升级内容抢先看!

博文视点Broadview

关于技术学习的6个观点

郭明

技术人

Java 是否应该使用通配符导入( wildcard imports)

HoneyMoose

React的理念与V16的架构变化

郭明

React

MySQL之my.cnf配置文件

TimeFriends

8月月更

语音社交app源码——具备哪些开发优势?

开源直播系统源码

软件开发 语聊房 直播系统源码 语音聊天系统 语音聊天app

【黄啊码】MySQL入门—1、SQL 的执行流程

黄啊码

MySQL 8月月更

仿钉钉审批流程后端 PHP 处理(一)

CRMEB

《The Google File System》新说

Joseph295

CentOS6搭建nginx+uwsgi+flask

haiger13

签约计划第三季

C#/VB.NET:在 Word 中设置文本对齐方式

Geek_249eec

C# word VB.NET 文本对齐

开源一夏|ArkUI如何自定义弹窗(eTS)

坚果

开源 HarmonyOS OpenHarmony 8月月更

转转测试环境的标签域名实践

转转技术团队

nginx hosts

STM32+SIM800C采用MQTT协议登录OneNet上传温湿度、MQ2烟雾浓度、GPS数据

DS小龙哥

8月月更

探索与发现,揭秘百度万亿时序数据存储架构_文化 & 方法_运小尧_InfoQ精选文章