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

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

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

导语

公司目前有几十万台左右服务器,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DM8共享集群DSC初始化DB实例报错
从下午3点左右一直到6点半左右,达梦厂家交流群、达梦官方在线社区平台都进行了咨询,还手动进入+DMDATA磁盘手动创建了data目录。最后求助无缘,想着扒拉下官方文档吧,逐行看一行也没敢跳过,最终发现/dmdb8/dmdbms/dsc_config/DSC0/dminit.ini 数据文件的总大小超过了磁盘最大空间,因此初始化失败。感觉达梦的报错提示有些偏离 了问题本身。
用户10843414
2023/11/17
3120
DM8共享集群DSC初始化DB实例报错
达梦数据库主备部署
在 dm.ini 同级目录下新建文件 dmmonitor_manual.ini,该文件为非确认监视器的配置文件,主要用于平常运维中监控集群状态、手动切换主从节点等
陳斯托洛夫斯記
2024/08/07
3340
达梦数据库主备部署
达梦 DM8 数据库安装详细手册(Windows+Linux+Docker)
对于常年占据国产数据库排行榜前三的 达梦 数据库,早已 “垂涎a已久” (¯﹃¯)!
Lucifer三思而后行
2021/09/10
6.4K0
达梦 DM8 数据库安装详细手册(Windows+Linux+Docker)
Oracle ASM 磁盘组基础知识整理(收藏版)
为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存储时,操作系统岗对其进行扫盘以及权限处理时忘记对 RAC2 节点的磁盘进行属主的设置。
JiekeXu之路
2019/08/28
13.1K0
Oracle ASM 磁盘组基础知识整理(收藏版)
ASM 翻译系列第十三弹:ASM 高级知识 - Forcing the issue
原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 Forcing the issue ASM中有部分的命令提供了force选项,它允许管理员不以默认的行为来做某些操作。在一些操作上使用force选项是十分安全且必要的,但一些操作上去使用就可能会致使磁盘组不可用,本文会针对具体的情况做详细说明。 Mount force 在对一个磁盘组做mount操作时,如果磁盘组的磁盘成员中有磁盘不可用时,就会需要使用到force选项。这是前面所提到“十分安全且必要”
沃趣科技
2018/03/23
8310
ASM 翻译系列第三十四弹:ASM磁盘组重要属性介绍
原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy.blogspot.sg/2014/05/disk-group-attributes.html ASM Disk Group Attributes 磁盘组的属性是ASM 11.1版本引入的,是磁盘组层面而非ASM实例层面的。磁盘组的属性有一些只能在创建磁盘组时指定,有一些只能在创建之后指定,还有一些可以在任何时候指定。 本篇内容是对本系列文章-【ASM
沃趣科技
2018/03/26
1.4K0
【赵渝强老师】达梦数据库的物理存储结构
达梦数据库由硬盘上的文件组成,而要读写数据需要通过达梦实例来完成。那么,达梦数据库是如何存储数据的呢?要搞清楚这个问题,就需要理解什么是达梦数据库的存储结构。达梦数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库,还是NoSQL数据库在存储结构上,都是通过逻辑存储结构来管理物理存储结构。
赵渝强老师
2025/03/24
1040
【赵渝强老师】达梦数据库的物理存储结构
ASM 翻译系列第三十六弹:ACFS磁盘组的重平衡操作
原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy.blogspot.sg/2014/02/acfs-disk-group-rebalance.html ACFS disk group rebalance 从Oracle 11.2版本开始,可以在ASM磁盘组之上创建通用的集群文件系统,被称为Oracle ASM Cluster File Systems或Oracle ACFS。要想创建一个ACFS文件
沃趣科技
2018/03/26
1K0
ASM 磁盘组如何重命名
前几天在 MOS 上看到一篇“如何在 11gR2 版本上重命名 ASM 磁盘组”的文章。记得很久之前有人问过是否可以重命名,当时要是看到这篇的话就可以参考一下了。不过对于这种操作来说还是很少见的,毕竟磁盘组名叫啥除了 DBA 关心外好像不关其他人什么事,而且 OCR、VOTE 盘是没法重命名的。其他磁盘组到是可以重命名,但也要注意由于 ASM 文件名(如 <OLD_DG_NAME>files / controlfiles 等)包括磁盘组名称,因此在重命名后,需要注意(更新 pfile 或重命名 <OLD_DG_NAME>files )RDBMS 实例。
JiekeXu之路
2021/07/08
1.3K0
ASM 磁盘组如何重命名
深入分析:12C ASM Normal冗余中PDB文件块号与AU关系与恢复
在 10G 和 11G 中,DBA 可以根据文件名,确定这个文件在 ASM 磁盘组上的分布,然后 dd 出来每一个 AU,最后拼凑成一个完成的数据文件。
数据和云
2018/07/27
4950
【RAC】替换OCR磁盘组的步骤(视频+文档)
http://blog.itpub.net/26736162/viewspace-2141215/
AiDBA宝典
2019/09/29
1.2K0
ASM 翻译系列第三十二弹:自制数据抽取小工具
原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 DBGeeK社区联合出品 Find block in ASM 在本系列文章【 Where is my data】中,我已经演示了如何从ASM磁盘中定位和抽取一个Oracle的block,为了让这件事做起来不那么复杂,我又写了一个perl脚本find_block.pl来简化整个操作,只需要提供数据文件的名称和需要提取的block,这个脚本就可以输出从ASM磁盘组中抽取块的命令。 find_block.pl find_block.
沃趣科技
2018/03/26
1.5K0
关机重启导致 ASM 磁盘丢失数据库无法启动
事情是这样的,各位看官且看之,中秋国庆期间测试机房由于线路变更需要断电,故需要关掉所以测试机器,等待变更完成后,测试环境的 RAC 有一个节点数据库启动不了,检查发现节点 2 的 ARCH 磁盘没有正常挂载。
JiekeXu之路
2023/10/09
4100
关机重启导致 ASM 磁盘丢失数据库无法启动
ORA-15040 ora-15017ASM磁盘无法挂载故障处理
测试环境突然一个节点的数据库无法启动,报错很清楚,找不到控制文件,而控制文件在ASM上,第一个节点正常,下面是处理流程。
PHP开发工程师
2021/05/10
1.4K0
使用RMAN迁移文件系统数据库到ASM
在实际的工作过程中,由于ASM磁盘管理的便利性,因此很多时候需要将文件系统的数据库迁移到ASM,本文演示了如何将文件系统数据库迁移到ASM实例。
Leshami
2018/08/07
8680
实战经验:如何定位控制文件热点块,即读取延迟高的块所在的ASM磁盘
墨墨导读:某客户检查表空间使用率的SQL成了TOP SQL,经判断主要为control file sequential read延迟增加导致。这里不讨论怎么降低控制文件读,重点记录一下怎么定位控制文件热点块或者说读取延迟高的块所在的ASM磁盘。
数据和云
2021/03/26
6430
实战经验:如何定位控制文件热点块,即读取延迟高的块所在的ASM磁盘
11g RAC 在线存储迁移实现 OCR 磁盘组完美替换
说明:需要将 Oracle 数据库 OCR DATA ARCH 等所有老存储磁盘替换为新存储磁盘,
JiekeXu之路
2020/09/11
2.6K0
Oracle 创建磁盘组报错ORA-15137的问题分析与解决思路
ASM扩容本来是件很简单的事,当ASM磁盘准备好之后,直接一条命令就会添加上。但是也会有异常情况,最近就碰到Oracle 19c在扩容时报错的故障,供大家参考。
数据和云
2021/10/13
9500
Oracle 创建磁盘组报错ORA-15137的问题分析与解决思路
案例:Oracle报错ASM磁盘组不存在或没有mount
环境:RHEL 6.5 + Oracle Standby RAC 11.2.0.4 我做Standby RAC实验时,在恢复控制文件时,报错无法在磁盘组创建文件,具体报错内容如下:
Alfred Zhao
2019/05/24
1.5K0
Oracle 19c standalone(单机ASM)静默安装
记录一下Oracle 19c standalone(单机ASM)静默安装的流程,方便遇到这个场景的时候可以快速部署上。以下配置经过测试环境多次试错得出,如果有相同环境,改改ip主机名磁盘组应该就能直接用。
甚至熊熊
2022/03/30
3.1K0
推荐阅读
相关推荐
DM8共享集群DSC初始化DB实例报错
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档