配置
配置
多数配置影响写入器如何分组和缓冲数据。读取器无需知道原来的 Page 大小目标或刷出阈值,因为最终形成的边界已经记录在文件中。时间单位、非对齐时间编码等少数信息则仍需由交换文件的应用共同约定。
下表区分了这些情况。不同语言接口中的配置名称可能不同。
| 概念配置 | 可观察的文件影响 | 配置值是否直接写入 | 读取器是否需要原始配置 |
|---|---|---|---|
| Chunk Group 大小 | 设备分组的刷出位置 | 否 | 否 |
| Page 大小目标 | Page 边界和 Statistics 粒度 | 否 | 否 |
| 每 Page 最大点数 | Page 边界 | 否 | 否 |
| 元数据索引扇出 | 索引树深度和节点宽度 | 否 | 否 |
| 布隆过滤器误判率 | 最终位数和哈希函数数 | 否;生成结果会写入 | 否 |
| 值编码 | Page 编码流 | 是,每个 Chunk 的 encoding_type | 否 |
| 压缩 | Page 磁盘负载 | 是,每个 Chunk 的 compression_type | 否 |
| 时间精度和时区 | int64 时间戳的解释 | 否 | 是,由上层协议提供 |
| 非对齐时间编码 | 每个非对齐 Page 的时间编码流 | 否 | 是 |
| 加密 | 文件加密头、Chunk 认证、Page 载荷或旧版 Footer 属性 | provider/profile 或旧版属性会写入;密钥上下文在外部 | 加密时需要 |
例如,文件不会保存“Page 大小目标”这个配置值,但会记录每个 Page 的实际长度。
Chunk Group 大小
Chunk Group 大小表示写入器在刷出当前设备的各个 Chunk 之前允许缓冲的数据量。较大的 Chunk Group 可以减少标记与元数据开销,并有利于顺序 I/O,但需要更多写入内存;较小的 Chunk Group 可以降低峰值内存,并更早地将数据写入输出。
该配置是刷出阈值,并不表示精确的磁盘占用大小。文件格式不规定默认值。分组从 0x00 Chunk Group Header 开始,到下一个分组、操作索引记录或分隔符结束;中间的 Chunk 标记表示当前分组仍在继续。
Page 大小
Data Page 大小是单个序列写入器在内存中累计数据量的目标值。较小的 Page 可以提供更细粒度的 Statistics 和数据跳过能力;较大的 Page 可以减少 Page Header 开销并可能提高压缩率,但需要更多缓冲空间,数据跳过粒度也更粗。
该阈值不等于精确的序列化 Page 大小。达到最大点数、显式刷出或需要维持对齐 Page 边界时,写入器都可以提前结束当前 Page。实际 Page 边界由 Page Header 中的长度确定。文件格式不规定默认的 Page 大小。
每个 Page 的最大点数
除 Page 大小目标外,写入器还可以限制一个 Page 中的逻辑位置数,以防大量紧凑值让单个 Page 包含过多数据点。常见取值为 10,000 点。
对于对齐序列,Time Page 及其对应的各个 Value Page 必须覆盖相同的逻辑位置范围,因此写入器会为这些对齐列使用共同的 Page 边界。
该上限不会作为独立字段写入文件。读取器使用 Page 边界;对于对齐 Value Page,还会使用 position_count。
索引扇出
索引扇出就是一个内部索引节点最多能包含多少个子节点。较大的扇出形成层数更少但节点更大的树;较小的扇出形成层数更多但节点更小的树。该值应至少为 2,常见取值为 256。
配置的上限不会写入文件。每个元数据索引节点都会保存节点类型、子节点和结束偏移,因此读取器无需知道写入配置即可遍历最终生成的树。
布隆过滤器误判率
布隆过滤器有时会把不存在的路径判为“可能存在”,导致一次额外的索引查找。降低目标误判率可以减少这种情况,代价是使用更多位和哈希函数。标准写入器将该值限制在 0.01 到 0.10 之间,默认使用 0.05。
误判率本身不会写入文件。最终生成的过滤器字节、位数和哈希函数数量保存在 TsFileMetadata 中,因此读取器不需要写入端的配置。详见 布隆过滤器。
值编码与压缩
写入器可以按物理类型选择默认值编码,并选择默认压缩方式。这些默认值属于 Schema 与写入策略,不是读写端必须共享的配置:
- Chunk Header 中的
encoding_type标识值编码;对于对齐 Time Chunk,它标识时间编码。 - Chunk Header 中的
compression_type标识该 Chunk 内所有 Page 使用的压缩方式。
因此读取器直接使用 Chunk Header,不需要知道写入器的默认值。支持的标识符及其载荷格式见 编码 和 压缩。
时间精度与时区
物理时间戳是有符号 64 位整数。TsFile v4 不在文件中保存时间单位或时区;毫秒、微秒、纳秒等时间精度以及时区语义由使用该文件的上层协议确定。
非对齐时间编码
非对齐 Chunk Header 的 encoding_type 描述值流编码,不描述同一 Page 内的时间流编码。非对齐时间流编码由读写配置共同确定,默认值为 TS_2DIFF。
对齐 Time Chunk 不受这一限制;其时间编码保存在 Time Chunk Header 的 encoding_type 中。
加密
加密方式有两处描述来源:Page AEAD 使用可选的文件加密头,旧版加密使用 Footer 属性。它们记录 Page 字节应如何解释,取得密钥仍需外部环境。AEAD 文件的旧版 Footer 属性虽然写为未加密状态,实际模式仍以文件加密头为准。布局和判断规则见加密。
与格式无关的配置
内存分配、内存检查频率、批大小、并行执行、线程数、存储后端以及关闭文件时的同步策略都不定义 TsFile 字节。它们属于具体实现与部署范围,不属于本文件格式规约。