Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >千亿级服务器监控数据存储实践

千亿级服务器监控数据存储实践

原创
作者头像
jackiefang
修改于 2017-07-03 07:22:35
修改于 2017-07-03 07:22:35
7.6K1
举报
文章被收录于专栏:方盼的专栏方盼的专栏

导语

公司目前有几十万台左右服务器,TMP(腾讯监控平台)平均每天采集1200亿+监控数据,本文将从当前存储架构存在的问题出发,介绍使用大数据平台组件Hbase存储TMP监控数据的实践历程。

背景

近几年开源的大数据处理系统已经逐步发展到一个比较成熟的阶段了,各类大数据处理的场景都有了相应的解决方案,如同 mysql 在当今互联网公司中的关系数据存储广泛应用地位一样。

公司目前有几十万台量级的服务器,TMP 系统按 1 分钟粒度采集监控数据,平均每天采集 1200 多亿的数据点。本文将从当前存储架构存在的问题出发,介绍从尝试使用Opentsdb到自行设计Hbase存储方案来存储 TMP 服务器海量监控数据的实践历程。

TMP 当前存储架构分析

我们首先看下当前的 TMP 的 1 分钟粒度数据存储架构。Agent 上报的数据,通过 collector 从 mysql 数据表中查询索引和路由规则 a,分发到不同的数据存储结点上。数据节点 Datacache 收到数据后先缓冲到内存中,内存的数据定期 DUMP 到文件系统中。

这套架构优点很明显,设计简洁、有最新数据缓存、数据分布式存储、可横向扩展,同时完全自研,各自实现细节可控。但同样存在一些问题:

a.数据节点 Cache 程序异常,会导致内存缓存数据丢失,进而丢失监控数据,需要从 agent 端或者对等集群恢复;

b.数据节点磁盘故障或机器故障,持久化的 FILE 也会丢失,数据同样需要从对等集群中恢复,数据访问入口需要人工介入切换集群;

c.数据格式和占用空间固定,不具备监控粒度扩展性,空的数据点也要占据存储空间,数据不支持压缩;

d.索引和路由规则这类依赖外部 DB 系统,这些 metadata 的可用性影响整个系统。

Hbase 存储引擎优势

Hbase 是 Hadoop 生态栈中的分布式列存储数据库,基于 Bigtable 模型和 LSM-Tree 存储引擎,用于海量数据的随机读写,在业界的大规模监控系统的时序数据存储中已有成熟应用案例,如某度和某宝 。

图 1. Hbase 的存储原理

我们看下使用 Hbase 存储有何优势:

a.数据高可靠,高可用。数据在写内存的同时,会写一份 HLog 到 HDFS 中,如果某台 RegionServer 异常,内存中的数据会从 Hlog 中自动恢复。持久化数据保存在 HDFS 中,默认持有 3 个副本,无单点丢失数据风险。

b.高性能。LSM-Tree 存储引擎保证了 Hbase 超高的写性能,实际上前面介绍的 TMP 自研存储系统也是一种简化版的 LSM-Tree 存储引擎,因而同样有如此高的性能。

c.天然的水平伸缩,高可扩展性。存储层 DataNode,数据服务层 RegionServer 均支持自由伸缩扩容。

d.数据表支持压缩,空列不占存储空间。

Opentsdb 尝试及瓶颈分析

在准备使用 Hbase 存储 TMP 监控数据之初,我们曾尝试使用基于 Hbase 的开源时序数据库 Opentsdb 来直接存储服务器监控数据。但 Opentsdb 到 70w/s 的时候整个 Hbase 集群就已超负荷运转、响应缓慢了,完全无法满足如此大规模的存储需求。

我们仔细分析了 Opentsdb 在超大规模时序数据存储上存在的主要瓶颈:

a.所有 metric 跟 tag 都要经过 tsdb-uid 表的转换,此设计本意是为了压缩 rowkey 大小,但引入较大的计算资源开销;

b.数据写入的 Append 机制及原始 compaction 设计存在较大的性能问题,这在后面部分会详细分析;

c.所有的数据都放在同一张表里,不利于基于时间对数据进行维护操作,比如对一个月前非热点数据进行抽样存储,且无法控制 Region 数,也就无法控制 split,对性能影响较大;

基于这些原因,我们最终决定直接使用 Hbase 进行 TMP 服务器监控数据存储。

TMP 监控存储设计实践

Hbase 的使用在整个 hadoop 生态栈中属于较为复杂的一个类别。TMP 监控存储设计结合了业界使用 Hbase 的一些成熟的实践经验,同时参考和改进了 OpenTSDB 在使用 HBase 时的比较好的设计思想,以支撑 TMP 监控数据的大规模读写。

2.1  Region 预切分

Hbase 中的数据会按 rowkey 所处范围分布在各个 Region 中,新建表的时候只有一个 Region,并随着 Region 变大开始分裂。这在过程中会消耗大量在网络、磁盘 IO 等资源,对集群会有较大性能影响。同时由于开始期间只有少量 Region,数据的读写很容易全落在单台 RegionServer 上,造成 HotSpot 现象,严重影响读写性能。因此对存储表进行 Region 预切分处理是 Hbase 使用中十分重要的一步。

这里我们将每天的数据表预切分为 100 个 Region, 以{0x01, 0x01 … 0x63},即二进制的 1~99 为 splitKeys,第一个 Region Rowkey 范围为 0x00…~0x01,第二个 Region Rowkey 范围为 0x01…~0x02,以此内推。结合接下来这节中的 Rowkey salt 设计就可以均匀地将数据分散在各 Region 中。

2.2  Rowkey 和列设计

Rowkey 设计由 salt(1 byte) 服务器 ID(4 byte) timestamp(4 byte) 监控特性 ID(4 byte) 的方式组成。

a.Salt 是使用服务器 id 进行 hash 后对单表初始 Region 数进行求余所得的一位字节,用来将不同服务器的监控数据均匀分布在表的各个 Region 中

b.Rowkey 第二部分为服务器 ID,服务器监控数据查询通常是查询指定服务器的某些特征,因而将服务器 ID 放在第二部分可以大幅提高查询效率;

c.timestamp 实际上是一个 time-base,用于将一段时间内的数据存放在同一行;

d.attr_id 为特性 id,区分具体监控指标。

这里使用一个字节 t 作为列族,列族名称本身并没什么含义,主要强调只使用一个列族存储数据,尽量小的名称作为名字。使用多列族每个 Region 会对应有多个 Memstore,会加重内存消耗,在此场景下不适用。

列名(在 Hbase 中称 Qualifier)为时间偏移,与 Rowkey 中的 time-base 一起组成 timestamp 标识数据点的精确时间。

2.3  基于列的 Compaction

在介绍列 Compaction 之前,我们先看下 Hbase 数据的具体存储结构:

表结构与存储结构

如图所示为表结构以及对应的存储结构示例,在 Hbase 或表格存储这类底层采用 LSM-tree 的数据库中,表数据会按列存储。每行中的每一列在存储文件中都会以 Key-value 的形式存在于文件中。其中 Key 的结构为:行主键 列族 列名,Value 为列的值。该种存储结构的特点是:

a、每行主键会重复存储,取决于列的个数;

b、列名会重复存储,每一列的存储都会携带列名;

c、存储数据按 row-key排序,相邻的 row-key会存储在相邻的块中。

可以注意到,在 Hbase 的物理存储中,每一列都会存储该列的 rowkey 和列族信息,在列很多的情况下这些重复的信息将占用大量的存储空间。因此这里参考 Opentsdb 的做法,将同一 time-base 内的所有列合并压缩为一列(注意这里说的列 Compaction 与 HBase 本身的 Compation 是完全不同的,Hbase 的 Compation 是指将多个小的 HFile 合并为一个大的 HFile)。

Opentsdb 的列 Compaction 由数据量大小和时间间隔共同触发,在并发写操作巨大的时候会对 Hbase 产生很大的读写压力,并且会阻塞写操作,性能表现较差。2.2 版本加入的 append 机制更是每一次写操作产生一次读操作,对 Hbase 利用很不经济,写入量大时会对整个集群的读压力造成巨大影响。

基于这些原因,TMP 监控数据在每天凌晨对前一天的数据表进行全表扫描,并对每行数据的列名(Qualifier)和 Value 进行合并,压缩为一列。在现网实际环境中可以看到,列压缩后的数据表比压缩前占用存储空间减少接近90%,如下图

2.4  Hbase 性能调优

Hbase 性能调优是个比较复杂的事情,网上可以看到很多专门讲 Hbase 调优的文章。这里仅挑出几个比较立竿见影的点来分享。

a.Heap 和 Memstore 大小。尽量调大 RegionServer 的 heap 大小,如写入量远大于查询量,可以增大 Memstore 与 BlockCache 的比例,如 0.5 : 0.3 。原因是 HBase 基于 LSM Tree 的存储引擎,数据会先缓存至 Memstore 再刷入磁盘

b.Snappy 压缩。对数据表启用 Snappy 压缩,可以减少磁盘 IO,增大写入性能

c.Hbase 自身的 Compation 线程数。Hbase 在 flush 和 compaction 的时候会对 rowkey 进行排序操作,适当增大 compaction 线程,可更加充分利用 CPU,增加性能。具体可将 hbase.regionserver.thread.compaction.small/large 调节为 5。

d.GC 调优。GC 参数设置不当会触发 Stop the world 这类严重影响性能的问题,具体可参考这篇文章《HBase最佳实践-CMS GC调优》

 总结

基于上述设计和优化后, TMP 监控数据存储方案比直接使用 Opentsdb 存储性能提高了 3~5 倍,8 台 RegionServer 峰值写入速率可达 400w/s ,Opentsdb 则到 70w/s 的时候整个 Hbase 集群就已经无法正常工作了。

目前此套基于 Hbase 的监控数据存储系统已经上线提供服务,后续计划在入库 Hbase 之前加入缓冲层进行列的预 Compaction,可进一步成倍提升整体性能。HBase 发展至今已是个比较成熟的开源分布式数据库,其高性能,高可用性及高可扩展的特性,可为海量数据的存取提供强大动力。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
非常棒,受益很大
非常棒,受益很大
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【Flink】第二十一篇:HBase 写热点问题实战
HBase的设计思想主要是LSM。参见【Flink】第十四篇:LSM-Tree一般性总结。而LSM存储引擎的主要设计思想就是不断的将内存的有序存储结构flush到磁盘,这时候会在磁盘形成一个个的小的文件,如果每次都去做新文件和旧文件的合并,这显然是没必要,并且低效的。
章鱼carl
2022/03/31
9430
【Flink】第二十一篇:HBase 写热点问题实战
20张图带你到HBase的世界遨游【转】
HBase 是一款面向列存储,用于存储处理海量数据的 NoSQL 数据库。它的理论原型是 Google 的 BigTable 论文。你可以认为 HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。
sunsky
2021/01/27
7240
20张图带你到HBase的世界遨游【转】
内含面试|一文搞懂HBase的基本原理
温馨提示:本文内容较长,如果觉得有用,建议收藏。另外记得分享、点赞、在看,素质三连哦!
数据社
2020/09/08
9800
内含面试|一文搞懂HBase的基本原理
大数据入门:Hbase存储原理解析
在大数据储存任务当中,针对于具备“5V”特征的大规模数据集,数据存储从传统的关系型数据库开始转向非关系型数据库(NOSQL),而NOSQL数据库当中,Hbase无疑是非常经典的一个作品。今天的大数据入门分享,我们就来讲讲Hbase存储原理。
成都加米谷大数据
2020/12/03
1.2K0
大数据入门:Hbase存储原理解析
【万字长文】Hbase最全知识点整理(建议收藏)
Zookeeper: Master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等
857技术社区
2022/05/17
8.4K0
【万字长文】Hbase最全知识点整理(建议收藏)
Hbase理论要点
Hbase理论知识点概要 问题01:Hbase的功能与应用场景? 功能:Hbase是一个分布式的、基于分布式内存和HDFS的按列存储的、NoSQL数据库 应用:Hbase适合于需要实时的对大量数据进行快速、随机读写访问的场景 问题02:Hbase有什么特点? 分布式的,可以实现高并发的数据读写 上层构建分布式内存,可以实现高性能、随机、实时的读写 底层基于HDFS,可以实现大数据 按列存储,基于列实现数据存储,灵活性更高 问题03:Hbase设计思想是什么? 设计思想
Maynor
2021/04/08
9820
面试头条:HBASE 存储设计
5、Hbase的表在物理存储上,是按照列族来分割的,不同列族的数据一定存储在不同的文件中
木野归郎
2020/06/12
1.1K0
HBase常见面试题[通俗易懂]
读: 找到要读数据的region所在的RegionServer,然后按照以下顺序进行读取:先去BlockCache读取,若 BlockCache没有,则到Memstore读取,若Memstore中没有,则到HFile中去读。 写: 找到要写数据的region所在的RegionServer,然后先将数据写到WAL(Write-Ahead Logging,预写日志系统)中,然后再将数据写到Memstore等待刷新,回复客户端写入完成。
全栈程序员站长
2022/09/03
9980
Hbase性能优化百科全书
本文集合了小编在日常学习和生产实践中遇到的使用Hbase中的各种问题和优化方法,分别从表设计、rowkey设计、内存、读写、配置等各个领域对Hbase常用的调优方式进行了总结,希望能对读者有帮助。本文参考结合自己实际优化经验,参考了大量官网和各个前辈的经验,调优后生产环境中的Hbase集群支撑了约50万/s的读和25万/s的写流量洪峰。感谢各位的经验和付出。
大数据真好玩
2021/01/27
1.3K0
Hbase性能优化百科全书
Hbase面试题总结(大数据面试)
hbase是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
全栈程序员站长
2022/08/23
5410
Hbase面试题总结(大数据面试)
你想要的 HBase 原理都在这了
在前面的文章里,介绍过 HBase 的入门操作知识,但对于正考虑将 HBase 用于生产系统的项目来说还是远远不够。
美码师
2019/12/30
1K0
你想要的 HBase 原理都在这了
Hbase面试题(面经)整理
Hbase 中的每张表都通过行键 (rowkey) 按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion 由 Hmaster 分配。 HRegion 存取一个子表时,会创建一个 HRegion 对象,然后对表的每个列族 (Column Family) 创建一个 store 实例, 每个 store 都会有 0个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFile , HFile 就是实际的存储文件,因此,一个 HRegion 还拥有一个 MemStore 实例。
全栈程序员站长
2022/09/04
1.8K0
Hbase面试题(面经)整理
Hbase 基础面试题
(1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
Tim在路上
2020/08/05
1.2K0
HBase
  2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
挽风
2023/10/17
6310
HBase
大数据面试题——HBase面试题总结
2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
全栈程序员站长
2022/09/04
7780
大数据面试题——HBase面试题总结
实战大数据,HBase 性能调优指南
在 HBase 中,row key 可以是任意字符串,最大长度 64KB,实际应用中一般为 10~100bytes,存为 byte[]字节数组,一般设计成定长的。
程序狗
2021/12/29
9330
【图文详解】HBase 数据模型及其架构原理
HBase, Hadoop Database,是一个高可靠性、高性能、面向列存储、可伸缩、 实时读写的分布式开源 NoSQL 数据库。主要用来存储非结构化和半结构化的松散数据。
一个会写诗的程序员
2021/12/16
1.9K0
【图文详解】HBase 数据模型及其架构原理
EMR(弹性MapReduce)入门之HBase集群的使用(十)
Hbase单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性
小司机带你入门EMR
2020/02/12
1.6K0
EMR(弹性MapReduce)入门之HBase集群的使用(十)
大数据知识总结(八):HBase分布式数据库入门到精通
HBase是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式 NOSQL 数据库。
Lansonli
2025/05/24
1120
大数据知识总结(八):HBase分布式数据库入门到精通
一文掌握HBase核心知识以及面试问题
HBase是一个高可靠、高性能、面向列的,主要用于海量结构化和半结构化数据存储的分布式key-value存储系统。
大数据学习与分享
2021/09/02
9980
相关推荐
【Flink】第二十一篇:HBase 写热点问题实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档