让我们将Influxdb视为TSDB的一个例子。在概述中,Influxdb将数据存储在按时间附加的文件中。但它也声称可以插入带有随机时间戳的数据,而不仅仅是追加。而对于物联网世界来说,偶尔会发现过去的某些数据(例如某些设备已经离线一段时间然后再次上线)并将这些数据放入时间序列db以绘制一些图表,这是一种非常常见的情况。 Influxdb如何处理这种情况?它会完全重写仅附加文件吗?
答案 0 :(得分:1)
这就是我理解的方式。 InfluxDB为每个具有数据的时间块创建一个逻辑数据库( shard )。默认情况下,分片组持续时间为1周。因此,如果您插入带有时间戳的测量值,例如: 4周前,它们不会影响随后几周的碎片。
在每个分片中,传入的写入首先附加到WAL(write ahead log)并缓存在内存中。当WAL和缓存足够满时,它们被快照到磁盘,将它们转换为0级TSM(时间结构合并树)文件。这些文件是只读的,测量首先按系列排序,然后按时间排序。
随着TSM文件的增长,它们被压缩在一起,提高了它们的水平。压缩多个0级快照以生成1级文件。通常,压缩多个1级文件以生成2级文件,依此类推至最高级别4.压缩可确保TSM文件优化(理想情况下)包含最小系列集,并与其他TSM最小重叠文件。这意味着需要搜索更少的TSM文件以进行任何特定的系列/时间查找。
所以知道这一点,在随机时间戳的写入工作量下,InfluxDB会如何受到影响?如果时间戳稀疏分布且我们的分片组持续时间很短,即大多数写入命中不同的分片,那么我们将得到许多分片。这意味着许多几乎空的数据文件效率低下(这个问题在他们的FAQ中得到解决)。另一方面,如果随机时间戳集中在一个或两个分片中,则它们的较低级别TSM文件可能在时间上显着重叠,这意味着即使对于窄时间范围内的查询,也需要搜索它们。这将影响这些类型查询的读取性能。
可在以下资源中找到更多信息: