数据持久化与索引
与所有类似 LSMT 的存储引擎一样,MemTables 中的数据被持久化到耐久性存储,例如本地磁盘文件系统或对象存储服务。GreptimeDB 采 用 Apache Parquet 作为其持久文件格式。
SST 文件格式
Parquet 是一种提供快速数据查询的开源列式存储格式,已经被许多项目采用,例如 Delta Lake。
Parquet 具有层次结构,类似于“行组-列-数据页”。Parquet 文件中的数据被水平分区为行组(row group),在其中相同列的所有值一起存储以形成数据页(data pages)。数据页是最小的存储单元。这种结构极大地提高了性能。
首先,数据按列聚集,这使得文件扫描更加高效,特别是当查询只涉及少数列时,这在分析系统中非常常见。
其次,相同列的数据往往是同质的(比如具备近似的值),这有助于在采用字典和 Run-Length Encoding(RLE)等技术进行压缩。
数据持久化
GreptimeDB 提供了 storage.flush.global_write_buffer_size
的配置项来设置全局的 Memtable 大小阈值。当数据库所有 MemTable 中的数据量之和达到阈值时将自动触发持久化操作,将 MemTable 的数据 flush 到 SST 文件中。
SST 文件中的索引数据
Apache Parquet 文件格式在列块和数据页的头部提供了内置的统计信息,用于剪枝和跳过。
例如,在上述 Parquet 文件中,如果你想要过滤 name
等于 Emily
的行,你可以轻松跳过行组 0,因为 name
字段的最大值是 Charlie
。这些统计信息减少了 IO 操作。
索引文件
对于每个 SST 文件,GreptimeDB 不但维护 SST 文件内部索引,还会单独生成一个文件用于存储针对该 SST 文件的索引结构。
索引文件采用 Puffin 格式,这种格式具有较大的灵活性,能够存储更多的元数据,并支持更多的索引结构。
目前,倒排索引是 GreptimeDB 第一个支持的单独索引结构,以 Blob 的形式存储在索引文件中。