阿里云InfluxDB®之snapshot及其内存优化

  • 时间:
  • 浏览:0

当大伙儿利用磁盘来做Index的缓冲区时,系统在snapshot的过程中,会生成有另有另一个 临时的索引文件,如下图所示。

总结以上所述,大体的过程是,encode生层Series Data Block, 在迭代过程中,生成了Series Index Section,最终,将Series Index Section Append到Series Data Block 就生成了TSM文件。

TSM文件包括了有另有另一个 每项:Series Data Section、Series Index Section、 Footer。

entry是有另有另一个 Value类型的数组,Value本身生活是有另有另一个 接口,按照值类型的不同分为:FloatValue、StringValue、BooleanValue、IntegerValue、FloatValue、StringValue。 

以FloatValue为例,每本身生活类型的Value蕴藏了有另有另一个 int类型的时间戳和具体的值value。

要我snapshot是将cache中的数据刷到磁盘,那末首先,大伙儿来看一下Cache的内内外部特性。

而不必磁盘来做Index缓冲区的要我,则不必生成你你這個 文件,如下图所示。

经过大伙儿的长时间的稳定性测试,证实,在利用磁盘来做Index的缓冲区时,能有效降低系统大压力下的OOME概率。

每隔1秒钟检查一次,是否达到snapshot的条件。

snapshot的条件有有另有另一个 :

是否达到配置的阈值。(默认情况表下是25M)

离上次snapshot的间隔是否超越:cache-snapshot-write-cold-duration的配置。(默认情况表下是10min)

那末,这里涉及有另有另一个 大大问题:

要是,大伙儿可不时要想到的有另有另一个 优化点是:在snapshot过程当中利用文件来做Series Index Section的暂存区,从而节省你你這個 每项内存。

作为阿里在APM和IOT领域的重要布局,时序数据库承载着阿里对于物理网和未来应用监控市场的未来和排头兵,作为业内排名第一的时序数据库InfluxDB,其在国内和国际都拥有了几瓶的用户,阿里适逢其时,重磅推出了阿里云 InfluxDB®。

         限于篇幅,本文仅就InfluxDB的其蕴藏另有另一个 模块:snapshot,对其机制和内存使用的优化进行分析。

关键的代码如下:

阿里云InfluxDB®现已正式商业化,欢迎访问购买页面(https://common-buy.aliyun.com/?commodityCode=hitsdb_influxdb_pre#/buy)与文档(https://help.aliyun.com/document_detail/1150093.html?spm=a2c4e.11153940.0.0.57b04a02biWzGa)。

1、Series Data Section生成:

Series Data Section有若干个Series Data Block组成。

其中对于Series Data Block,你你這個 是在内存中完成组装的,具体是有cacheKeyIterator.encode函数完成,代码如下:

1、落盘的文件格式怎样?

2、snapshot刷盘的过程本身生活是怎样进行的?

大伙儿先看落盘的文件格式:

/>

InfluxDB采用的是TSM引擎,TSM 存储引擎主要由几次每项组成: cache、wal、tsm file、compactor

TSM存储引擎,其核心思想之类于LSM Tree,它会将最近的数据缓处在磁盘中,在达到预设的阈值要我就会触发snapshot,也要是大伙儿常说的快照刷盘。

那末大大问题来了Series Index Section的保存时时要空间的,要我是Series Index Section占用的内存过大,则要我会你這個 加大了程序运行OOME的风险。

2、依次刷盘

前面大伙儿已知iter中保留有那先 cacheBlock,大伙儿只时要遍历迭代器就可不时要将那先 数据刷盘。但还有有另有另一个 大大问题,Series Index Section怎样生成?

要我Series Index Section最终由IndexEntry构成,而IndexEntry中minTime和maxTime、Size都可不时要由cacheBlock的数据得到,关键是Offset。

觉得Offset的计是否随着迭代的过程,不断地往前走,就像在有另有另一个 Buffer中,填满了有另有另一个 Series Data Block,就会更新一次Offset。

如上图所示,每有另有另一个 cache内内外部划分成了16个partition。每有另有另一个 partition内内外部包蕴藏另有另一个 map,所有的map其key为SeriesKey,value为entry。

从代码层面上来讲,从总体的概要流程如下:

下面让大伙儿来逐个分析下:

要我有n个cache,一齐做snapshot。 则耗费的内存为: n IndexSize。 

之类:5db
4 retention, IndexSize = 500m。 则节省:5 4 500 = 1G的内存使用量。

其中针对几次不同的数据类型分别通过不同Encoder来进行组装,最后是形成了有另有另一个 cacheBlock的二维数组,并保处在iter当中。

接下来的大大问题要是怎样将那先 二维数组刷盘。