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