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

  • 时间:
  • 浏览:2

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

接下来的现象可是怎么才能 才能 将那此二维数组刷盘。

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

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

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

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

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

可是,大家 儿可不也能想到的二个 优化点是:在snapshot过程当中利用文件来做Series Index Section的暂存区,从而节省你這個每段内存。

没人现象来了Series Index Section的保存时须要空间的,然后是Series Index Section占用的内存过大,则之时会时会加大了进程池池OOME的风险。

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

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

如上图所示,每二个 cache实物划分成了16个partition。每二个 partition实物包中有 一个 map,所有的map其key为SeriesKey,value为entry。

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

snapshot的条件二个 :

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

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

TSM文件包括了二个 每段:Series Data Section、Series Index Section、 Footer。

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

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

以FloatValue为例,每本身类型的Value中有 了二个 int类型的时间戳和具体的值value。

2、依次刷盘

前面大家 儿已知iter中保留有那此cacheBlock,大家 儿只须要遍历迭代器就可不也能将那此数据刷盘。但还二个 现象,Series Index Section怎么才能 才能 生成?

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

虽然Offset的计与否随着迭代的过程,不断地往前走,就像在二个 Buffer中,填满了二个 Series Data Block,就会更新一次Offset。

然后有n个cache,一同做snapshot。 则耗费的内存为: n IndexSize。 

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

然后snapshot是将cache中的数据刷到磁盘,没人首先,大家 儿来看一下Cache的实物底部形态。

关键的代码如下:

1、Series Data Section生成:

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

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

而无需磁盘来做Index缓冲区的然后,则无需生成你這個文件,如下图所示。

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

1、落盘的文件格式怎么才能 才能 ?

2、snapshot刷盘的过程本身是怎么才能 才能 进行的?

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

/>

没人,这里涉及二个 现象:

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