概述
文章目录
- 监控数据的特点
- 监控数据的存储
- 常见的TSDB
- 小结
- 参考阅读
看完了Java服务器监控中的基本变量 Metrics之后,不难想到的问题就是,我们应该如何存储这些监控数据。这就是本篇文章主要讲述的内容。
这篇文章主要分为三个部分,第一部分主要描述监控数据的特点,第二部分主要讨论不同db的存储方式,第三部分则会简单地对tsdb进行介绍。
监控数据的特点
首先我们需要了解的是,监控数据必须包含的属性。一个标准的监控数据,一定会包含以下属性
-
指标名称 不同指标之间需要进行相互区分
-
时间 监控数据就是指在特定时间下特定指标的值,有了时间,我们才能知道服务器在某个特定时间点的特定状态
-
标签 监控数据一般还会带有标签,如产生这个监控数据的服务器ip,所属的机房,以及其它我们用于标识或排查问题所需要的属性
综上,我们可以得出一个简单的json模型用于表示监控数据
{
"metricsName" : "test",
"timestamp" : 1539688435,
"tags" : [{
"ip" : "127.0.0.1",
"dc" : "local"
}]
}
了解完基本的数据结构之后,接下来的问题就是,数据量会有多大?
按照每10秒钟采集一次数据计算,一个小时会产生360条数据,一天会产生360*24=8640
条数据。如果是最简单的服务监控(只记录响应时间和访问次数,产生两个指标),那么一个api一天就能够生成8640*2=19280
条数据。照此推算,如果要做完整的服务器监控(包含内存使用率,磁盘使用率等系统性能指标以及自定义应用指标),每天产生的数据量应该在50W的级别。
那么我们需要了解的,就是这些数据的使用特性,使用特性也有以下几个特点
-
时间戳是顺序增长的
-
写入量可能很大,但是读取操作较为低频,且写入的数据几乎不更新
-
读取操作一般是根据时间进行范围读取,再进行聚合操作
-
常常只需要使用近7天/15天/30天的数据,数据具有明显的冷热区分
对数据的特点有所了解之后,我们就可以探讨其存储方式了。
监控数据的存储
在讲监控数据的存储之前,首先应该对目前三种基本的存储引擎有所了解,然后我们才能知道如何因地制宜地对监控数据进行存储。
-
哈希存储引擎 是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,也不支持范围读取,主要用于key-value存储系统
-
B树存储引擎 支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针)、范围读取,主要用于关系数据库(Mysql等)。
-
LSM树(Log-Structured Merge Tree)。LSM树通过批量存储技术规避了B树存储存在的磁盘随机写入问题,但又由于这个设计,相对应的也会减慢其读取的效率。(关系型数据库和非关系型数据库都在采用,关系型数据库有OceanBase,非关系型数据库有RocksDB)
目前主流的时序数据库都是基于LSM树的。下面我们具体讲一下LSM树。
LSM树与B+树不同,B+树是一种具体的数据结构,而LSM树更多的像是一种算法策略。这个算法策略将数据分成两部分进行保存,一部分保存在内存中C0,另一部分是保存在磁盘上的C1。C0和C1都是某种可以进行范围索引的数据结构(一般在C0使用AVL树/跳跃表,在C1中使用B+树)。
在写入数据的时候,首先向C0(内存空间)进行写入,当C0的存储空间超过了阈值之后,就将C0与磁盘中的C1按照顺序进行归并排序,并且合并成C1中的一个个叶子结点,然后在写回磁盘进行保存。
这样做有三个好处。
-
对于机械硬盘而言,将随机IO转换成了顺序IO,减少了磁盘寻道时间,提高了效率
-
对于固态磁盘而言,在进行更新的时候,也能够避免写放大的问题。
-
对于历史的批量数据读取,由于是顺序存储的,读取的时候也提高了一定的效率
当然,对比B+树,也是存在一定缺点的。
-
对于单条数据的查询,可能需要多次IO(不仅要查C0,还要查询处于硬盘中的C1)。
-
需要为C0分配较大的内存空间,对于小规模数据应用不合适。
常见的TSDB
了解完基本的存储结构之后,我们应该能够清楚,为了满足大数据量存储,以及高效率的写操作,基本上都会采取LSM作为底层的存储数据结构,但是具体在上层做了什么优化,各个数据库就会有所差异了。
- OpenTSDB
OpenTSDB实际上是基于Hbase的时序数据库。从它的图片可以看出来,主要做了两点优化。
-
timeStamp 按照小时存储,每行数据有3600列。这样实际上是节省了存储metrics和tags所需要的空间
-
所有metrics以及所有标签信息(tags)都使用了全局编码将标签值编码成更短的bit,减少rowkey的存储数据量。
小结
虽然题目为TSDB的介绍,但实际上本文核心讲述的还是一种区别于哈希存储,B树存储的存储结构——LSM树。通过使用多层级的存储结构(首层使用内存),LSM树极大地提高了数据写入的效率,同时也为海量数据存储提供了可能。
参考阅读
-
The Log-Structured Merge-Tree (LSM-Tree)论文原文
-
论文中文翻译(上)
-
论文中文翻译(中)
-
论文中文翻译(下)
-
LSM树中文阅读笔记
-
图解LSM
-
现代存储系统背后的算法
-
知乎-时序数据库的选择
最后
以上就是重要小白菜为你收集整理的Java服务器性能监控(二) 时序数据库TSDB小结参考阅读的全部内容,希望文章能够帮你解决Java服务器性能监控(二) 时序数据库TSDB小结参考阅读所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复