首页 > 数据库 >时序数据库深入浅出之存储篇——本质LSMtree,同时 metric(比如温度)+tags 分片

时序数据库深入浅出之存储篇——本质LSMtree,同时 metric(比如温度)+tags 分片

时间:2023-07-04 19:31:35浏览次数:49  
标签:存储 tags metric 分片 tree 时序 LSMtree 数据 数据库

什么是时序数据库

先来介绍什么是时序数据。时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。

时序数据库就是存放时序数据的数据库,并且需要支持时序数据的快速写入、持久化、多纬度的聚合查询等基本功能。

对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了所有的历史数据。同时时序数据的查询也总是会带上时间作为过滤条件。

时序数据示例

p1- 北上广三地 2015 年气温变化图

p2- 北上广三地当前温度实时展现

下面介绍下时序数据库的一些基本概念(不同的时序数据库称呼略有不同)。

metric: 度量,相当于关系型数据库中的 table。

data point: 数据点,相当于关系型数据库中的 row。

timestamp:时间戳,代表数据点产生的时间。

field: 度量下的不同字段。比如位置这个度量具有经度和纬度两个 field。一般情况下存放的是会随着时间戳的变化而变化的数据。

tag: 标签,或者附加信息。一般存放的是并不随着时间戳变化的属性信息。timestamp 加上所有的 tags 可以认为是 table 的 primary key。

如下图,度量为 Wind,每一个数据点都具有一个 timestamp,两个 field:direction 和 speed,两个 tag:sensor、city。它的第一行和第三行,存放的都是 sensor 号码为 95D8-7913 的设备,属性城市是上海。随着时间的变化,风向和风速都发生了改变,风向从 23.4 变成 23.2;而风速从 3.4 变成了 3.3。

p3- 时序数据库基本概念图

 

时序数据库遇到的挑战

很多人可能认为在传统关系型数据库上加上时间戳一列就能作为时序数据库。数据量少的时候确实也没问题,但少量数据是展现的纬度有限,细节少,可置信低,更加不能用来做大数据分析。很明显时序数据库是为了解决海量数据场景而设计的。

可以看到时序数据库需要解决以下几个问题

  • 时序数据的写入:如何支持每秒钟上千万上亿数据点的写入。
  • 时序数据的读取:又如何支持在秒级对上亿数据的分组聚合运算。
  • 成本敏感:由海量数据存储带来的是成本问题。如何更低成本的存储这些数据,将成为时序数据库需要解决的重中之重。

这些问题不是用一篇文章就能涵盖的,同时每个问题都可以从多个角度去优化解决。在这里只从数据存储这个角度来尝试回答如何解决大数据量的写入和读取。

 

传统数据库存储采用的都是 B tree,这是由于其在查询和顺序插入时有利于减少寻道次数的组织形式。我们知道磁盘寻道时间是非常慢的,一般在 10ms 左右。磁盘的随机读写慢就慢在寻道上面。对于随机写入 B tree 会消耗大量的时间在磁盘寻道上,导致速度很慢。我们知道 SSD 具有更快的寻道时间,但并没有从根本上解决这个问题。

对于 90% 以上场景都是写入的时序数据库,B tree 很明显是不合适的。

业界主流都是采用 LSM tree 替换 B tree,比如 Hbase, Cassandra 等 nosql 中。

 

分片设计

分片设计简单来说就是以什么做分片,这是非常有技巧的,会直接影响写入读取的性能。

结合时序数据库的特点,根据 metric+tags 分片是比较好的一种方式,因为往往会按照一个时间范围查询,这样相同 metric 和 tags 的数据会分配到一台机器上连续存放,顺序的磁盘读取是很快的。再结合上面讲到的单机存储内容,可以做到快速查询。

进一步我们考虑时序数据时间范围很长的情况,需要根据时间范围再将分成几段,分别存储到不同的机器上,这样对于大范围时序数据就可以支持并发查询,优化查询速度。

如下图,第一行和第三行都是同样的 tag(sensor=95D8-7913;city= 上海),所以分配到同样的分片,而第五行虽然也是同样的 tag,但是根据时间范围再分段,被分到了不同的分片。第二、四、六行属于同样的 tag(sensor=F3CC-20F3;city= 北京)也是一样的道理。

p5- 时序数据分片说明

真实案例

下面我以一批开源时序数据库作为说明。

InfluxDB:

非常优秀的时序数据库,但只有单机版是免费开源的,集群版本是要收费的。从单机版本中可以一窥其存储方案:在单机上 InfluxDB 采取类似于 LSM tree 的存储结构 TSM;而分片的方案 InfluxDB 先通过+(事实上还要加上 retentionPolicy)确定 ShardGroup,再通过+的 hash code 确定到具体的 Shard。

Kairosdb:

底层使用 Cassandra 作为分布式存储引擎,如上文提到单机上采用的是 LSM tree。

OpenTsdb:

底层使用 Hbase 作为其分布式存储引擎,采用的也是 LSM tree。

Hbase 采用范围划分的分片方式。使用 row key 做分片,保证其全局有序。每个 row key 下可以有多个 column family。每个 column family 下可以有多个 column。

结束语

可以看到各分布式时序数据库虽然存储方案都略有不同,但本质上是一致的,由于时序数据写多读少的场景,在单机上采用更加适合大吞吐量写入的单机存储结构,而在分布式方案上根据时序数据的特点来精心设计,目标就是设计的分片方案能方便时序数据的写入和读取,同时使数据分布更加均匀,尽量避免热点的产生。

标签:存储,tags,metric,分片,tree,时序,LSMtree,数据,数据库
From: https://blog.51cto.com/u_11908275/6624581

相关文章

  • Symmetric Tree
    Giventherootofabinarytree,checkwhetheritisamirrorofitself(i.e.,symmetricarounditscenter).classSolution(object):defisSymmetric(self,root):ifnotroot: returnTruedefdfs(left,right): #递归的终止条件是两个节......
  • pgmetrics 介绍
    pgmetrics介绍pgmetrics是一个开源的、零依赖的、单二进制的工具,它可以轻松收集和报告PostgreSQL指标,用于脚本编写、自动化和故障排除。pgmetrics从正在运行的PostgreSQL服务器收集350多个指标,并以易于阅读的文本格式显示,或者将其导出为JSON和CSV用于脚本编写。pgmetrics是用......
  • Probabilistic and Geometric Depth: Detecting Objects in Perspective(1)
    作者认为单目3D目标检测可以简化为深度估计问题,深度估计不准确限制了检测的性能.已有的算法直接使用孤立实例或者像素估计深度,没有考虑目标之间的集合关系,因此提出了构建预测的目标之间的几何关系图,来促进深度预测.将深度值划分成若干个区间,然后通过分布的期望来计算深度值......
  • es ctags for code on win
    setup#dep:tar,7z,pwsh,java$theGrokRoot="D:/sevtest/opengrok"$theTomcatRoot="D:/sevtest/tomcat"$theGrokFile="./opengrok-1.12.11.tar.gz"$theTomcatFile="./apache-tomcat-10.1.8.tar.gz"#===================......
  • 对称点模式(symmetric dot pattern, SDP)-matlab版
    近年来,一种直观的信号表示方法--对称点模式(symmetricdotpattern,SDP)被用于信号分析和模式识别。与一些常规方法不同,SDP是一种基于极坐标系的图像表示方法,可以直接将原始信号转换为镜像对称雪花图像,实现简单,计算量小,且对噪声鲁棒。模式之间的识别和区分与信号之间的幅度和频率......
  • Elasticsearch专题精讲—— Aggregations —— Metrics aggregations(度量聚合)
    Aggregations——Metricsaggregations(度量聚合)https://www.elastic.co/guide/en/elasticsearch/reference/8.8/search-aggregations-metrics.html#search-aggregations-metricsTheaggregationsinthisfamilycomputemetricsbasedonvaluesextractedinone......
  • AsymmetricLoss
    (59条消息)交叉熵损失函数(CrossEntropyLoss)_crossentropyloss_SongGu1996的博客-CSDN博客(59条消息)多标签分类之非对称损失-AsymmetricLoss_watersink的博客-CSDN博客......
  • 安装metrics
     components.yaml如下,改了image和认证,直接复制之后执行kubectl create-f  components.yamlapiVersion:v1kind:ServiceAccountmetadata:labels:k8s-app:metrics-servername:metrics-servernamespace:kube-system---apiVersion:rbac.authorizati......
  • k8s Metrics Server 0.6.x
    资源监控指标Kubernetes系统上的关键指标大体可以分为两个主要组成部分:集群系统本身的指标和容器应用相关的指标。对于集群系统本身相关的监控层面而言,监控整个Kubernetes集群的健康状况是最核心的需求,包括所有工作节点是否运行正常、系统资源容量大小、每个工作节点上运行的容......
  • 矩阵 metrics
    1351. CountNegativeNumbersinaSortedMatrixEasy338393AddtoListShareGivena mxn matrix grid whichissortedinnon-increasingorderbothrow-wiseandcolumn-wise,return thenumberof negative numbersin grid. Example1:Input:grid=......