我是靠谱客的博主 重要小白菜,最近开发中收集的这篇文章主要介绍Java服务器性能监控(二) 时序数据库TSDB小结参考阅读,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 监控数据的特点
    • 监控数据的存储
    • 常见的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中的一个个叶子结点,然后在写回磁盘进行保存。

lsm论文图片

这样做有三个好处。

  • 对于机械硬盘而言,将随机IO转换成了顺序IO,减少了磁盘寻道时间,提高了效率

  • 对于固态磁盘而言,在进行更新的时候,也能够避免写放大的问题。

  • 对于历史的批量数据读取,由于是顺序存储的,读取的时候也提高了一定的效率

当然,对比B+树,也是存在一定缺点的。

  • 对于单条数据的查询,可能需要多次IO(不仅要查C0,还要查询处于硬盘中的C1)。

  • 需要为C0分配较大的内存空间,对于小规模数据应用不合适。

常见的TSDB

了解完基本的存储结构之后,我们应该能够清楚,为了满足大数据量存储,以及高效率的写操作,基本上都会采取LSM作为底层的存储数据结构,但是具体在上层做了什么优化,各个数据库就会有所差异了。

  • OpenTSDB

OpenTSDB实际上是基于Hbase的时序数据库。从它的图片可以看出来,主要做了两点优化。

  1. timeStamp 按照小时存储,每行数据有3600列。这样实际上是节省了存储metrics和tags所需要的空间

  2. 所有metrics以及所有标签信息(tags)都使用了全局编码将标签值编码成更短的bit,减少rowkey的存储数据量。

小结

虽然题目为TSDB的介绍,但实际上本文核心讲述的还是一种区别于哈希存储,B树存储的存储结构——LSM树。通过使用多层级的存储结构(首层使用内存),LSM树极大地提高了数据写入的效率,同时也为海量数据存储提供了可能。

参考阅读

  • The Log-Structured Merge-Tree (LSM-Tree)论文原文

  • 论文中文翻译(上)

  • 论文中文翻译(中)

  • 论文中文翻译(下)

  • LSM树中文阅读笔记

  • 图解LSM

  • 现代存储系统背后的算法

  • 知乎-时序数据库的选择

最后

以上就是重要小白菜为你收集整理的Java服务器性能监控(二) 时序数据库TSDB小结参考阅读的全部内容,希望文章能够帮你解决Java服务器性能监控(二) 时序数据库TSDB小结参考阅读所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部