从零写一个时间序列数据库
对付旋转式磁盘,它的磁头始终得在物理上向差异的扇区上移动,这是一个不敷为奇的究竟。而固然我们都知道 SSD 具有快速随机写入的特点,但究竟上它不能修改单个字节,只能写入一页或更多页的 4KiB 数据量。这就意味着写入 16 字节的样内情当于写入满满一个 4Kib 的页。这一举动就是所谓的写入放大,这种特征会消费你的 SSD。因此它不只影响速率,并且还绝不浮夸地在几天或几个周内粉碎掉你的硬件。 关于此题目更深条理的资料,“Coding for SSDs”系列博客是极好的资源。让我们想想首要的用处:次序写入和批量写入别离对付旋转式磁盘和 SSD 来说都是抱负的写入模式。大道至简。 查询模式比起写入模式明明更差异。我们可以查询单一序列的一个数据点,也可以对 10000 个序列查询一个数据点,还可以查询一个序列几个周的数据点,乃至是 10000 个序列几个周的数据点。因此在我们的二维平面上,查询范畴不是完全程度或垂直的,而是二者形成矩形似的组合。 记录法则可以减轻已知查询的题目,但对付点对点查询来说并不是一个通用的办理要领。 我们知道我们想要批量地写入,但我们获得的仅仅是一系列垂直数据点的荟萃。当查询一段时刻窗口内的数据点时,我们不只很难弄清晰在哪才气找到这些单独的点,并且不得不从磁盘上大量随机的处所读取。大概一条查询语句会稀有百万的样本,纵然在最快的 SSD 上也会很慢。读入也会从磁盘上获取更多的数据而不只仅是 16 字节的样本。SSD 会加载一整页,HDD 至少会读取整个扇区。岂论哪一种,我们都在挥霍名贵的读取吞吐量。 因此在抱负环境下,统一序列的样本将按次序存储,这样我们就能通过尽也许少的读取来扫描它们。最重要的是,我们仅必要知道序列的起始位置就能会见全部的数据点。 显然,将网络到的数据写入磁盘的抱负模式与可以或许明显进步查询服从的机关之间存在着明明的抵触。这是我们 TSDB 必要办理的一个根基题目。 当前的办理要领是时辰看一下当前 Prometheus 是怎样存储数据来办理这一题目的,让我们称它为“V2”。 我们建设一个时刻序列的文件,它包括全部样本并按次序存储。由于每几秒附加一个样本数据到全部文件中很是昂贵,我们在内存中打包 1Kib 样本序列的数据块,一旦打包完成绩附加这些数据块到单独的文件中。这一要领办理了大部门题目。写入今朝是批量的,样本也是按次序存储的。基于给定的统一序列的样内情对之前的数据仅产生很是小的改变这一特征,它还支持很是高效的压缩名目。Facebook 在他们 Gorilla TSDB 上的论文中描写了一个相似的基于数据块的要领,而且引入了一种压缩名目,它可以或许镌汰 16 字节的样本到均匀 1.37 字节。V2 存储行使了包括 Gorilla 变体等在内的各类压缩名目。
尽量基于块存储的要领很是棒,但为每个序列生涯一个独立的文件会给 V2 存储带来贫困,由于:
我们可以或许从现有的计划中学到的要害部门是数据块的观念,我们虽然但愿保存这个观念。最新的数据块会保持在内存中一样平常也是好的主意。事实,最新的数据会大量的查询到。 一个时刻序列对应一个文件,这个观念是我们想要替代掉的。 序列分流(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |