我们存储体系的宏观机关是什么?简而言之,是当我们在数据文件夹里运行 tree 呼吁时表现的统统。看看它能给我们带来奈何一副惊喜的画面。
$ tree ./data ./data +-- b-000001 | +-- chunks | | +-- 000001 | | +-- 000002 | | +-- 000003 | +-- index | +-- meta.json +-- b-000004 | +-- chunks | | +-- 000001 | +-- index | +-- meta.json +-- b-000005 | +-- chunks | | +-- 000001 | +-- index | +-- meta.json +-- b-000006 +-- meta.json +-- wal +-- 000001 +-- 000002 +-- 000003
在最顶层,我们有一系列以 b- 为前缀编号的块。每个块中显然生涯了索引文件和含有更多编号文件的 chunk 文件夹。chunks 目次只包括差异序列数据点的原始块。与 V2 存储系同一样,这使得通过时代窗口读取序列数据很是高效而且应承我们行使沟通的有用压缩算法。这一点被证实施之有用,我们也规划相沿。显然,这里并不存在含有单个序列的文件,而是一堆生涯着很多序列的数据块。
index 文件的存在应该不敷为奇。让我们假设它拥有黑邪术,可以让我们找到标签、也许的值、整个时刻序列和存放数据点的数据块。
但为什么这里有好几个文件夹都是索引和块文件的机关?而且为什么存在最后一个包括 wal 文件夹?领略这两个疑问便能办理九成的题目。
很多小型数据库
我们支解横轴,即将时刻域支解为不重叠的块。每一块饰演着完全独立的数据库,它包括该时刻窗口全部的时刻序列数据。因此,它拥有本身的索引和一系列块文件。
t0 t1 t2 t3 now +-----------+ +-----------+ +-----------+ +-----------+ | | | | | | | | +------------+ | | | | | | | mutable | <--- write ---- ┤ Prometheus | | | | | | | | | +------------+ +-----------+ +-----------+ +-----------+ +-----------+ ^ +--------------+-------+------+--------------+ | | query | | merge -------------------------------------------------+
每一块的数据都是不行变的。虽然,当我们收罗新数据时,我们必需能向最近的块中添加新的序列和样本。对付该数据块,全部新的数据都将写入内存中的数据库中,它与我们的耐久化的数据块一样提供了查找属性。内存中的数据布局可以高效地更新。为了防备数据丢失,全部传入的数据同样被写入姑且的预写日记中,这就是 wal 文件夹中的一些列文件,我们可以在从头启动时通过它们从头添补内存数据库。
全部这些文件都带有序列化名目,有我们所祈望的全部对象:很多符号、偏移量、变体和 CRC32 校验和。纸上得来终觉浅,绝知此事要躬行。
这种机关应承我们扩展查询范畴到全部相干的块上。每个块上的部门功效最终归并成完备的功效。
这种横向支解增进了一些很棒的成果:
- 当查询一个时刻范畴,我们可以简朴地忽略全部范畴之外的数据块。通过镌汰必要搜查的数据集,它可以起源办理序列分流的题目。
- 当完成一个块,我们可以通过次序的写入大文件从内存数据库中生涯数据。这样可以停止任何的写入放大,而且 SSD 与 HDD 均合用。
- 我们连续了 V2 存储体系的一个好的特征,最近行使而被多次查询的数据块,老是保存在内存中。
- 很好,我们也不再受限于 1KiB 的数据块尺寸,以使数据在磁盘上更好地对齐。我们可以挑选对单个数据点和压缩名目最公道的尺寸。
- 删除旧数据变得极为简朴快捷。我们仅仅只需删除一个文件夹。记着,在旧的存储体系中我们不得不花数个小时说明并重写数亿个文件。
每个块还包括了 meta.json 文件。它简朴地生涯了关于块的存储状态和包括的数据,以便轻松相识存储状态及其包括的数据。
mmap (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|