指标数据在时序数据库里怎么存?delta-of-delta 和 XOR 压缩到底省了多少?不同形状的数据差别多大?Prometheus 真实的 chunk 每个样本占几个字节?这篇用自己写的 Gorilla 编码器和 Prometheus 的快照逐项量出来。
数据形状 | 解码后与原样本完全一致 | 时间戳 位/样本 | 数值 位/样本 | Gorilla 编码后字节数 | 字节/样本 | 16 字节原始数据交给 zstd -3 后的字节数 -----------------------------+-------------+----------+---------+----------------+-------+-------------------------- 恒定值 | 是 | 1.00 | 1.00 | 918 | 0.26 | 6776 计数器,每秒固定 +10,时间间隔恰好 1 s | 是 | 1.00 | 14.75 | 7102 | 1.97 | 16082 计数器,每秒随机 +0~39 | 是 | 1.00 | 14.34 | 6920 | 1.92 | 22472 整数 gauge,在 19~21 之间跳 | 是 | 1.00 | 3.01 | 1823 | 0.51 | 10528 浮点 gauge,随机游走(σ = 0.02) | 是 | 1.00 | 61.59 | 28174 | 7.83 | 37640 浮点 gauge,每次完全随机 | 是 | 1.00 | 57.99 | 26558 | 7.38 | 38195 计数器 +10,时间戳有 ±5 ms 抖动 | 是 | 8.61 | 14.75 | 10523 | 2.92 | 17108 计数器 +10,时间间隔在 0.5~1.5 s 之间随机 | 是 | 13.85 | 14.74 | 12881 | 3.58 | 17106 所有形状都无损还原:True。时间间隔恰好固定时,时间戳只要 1 位;计数器每秒固定 +10 时数值的 XOR 变化很小;随机浮点数几乎没得压缩(每个样本接近 64 位的数值部分);时间戳有抖动或间隔不规则时,delta-of-delta 不再为 0,时间戳部分增大到几位到十几位
时间间隔整齐时时间戳只要 1 位;计数器的 XOR 变化小,随机浮点数几乎压不动。
项目 | 结果 ----------------------------------------+---------------------- 块里的序列数 / chunk 数 / 样本数 | 155 / 465 / 45,880 chunks 目录的字节数 | 203,410 每个样本的 chunk 字节数(Prometheus) | 4.43 index 文件的字节数 | 16,907 每条序列的 index 字节数 | 109 我的编码器编码同一批样本(含各序列的 16 字节起始值,不含 chunk 头) | 166,224 字节,3.74 字节/样本 未压缩(每个样本 16 字节) | 734,080 字节 分序列类型的结果(我的编码器;时间戳位/样本、数值位/样本、字节/样本):const:6.51、1.00、0.99;counter:6.51、12.45、2.42;gauge:6.51、55.55、7.81;全部序列平均:时间戳 6.51 位/样本、数值 23.00 位/样本。这批样本都解码回来与原样本逐个相同(断言通过) Prometheus 里每个样本平均占 4.43 字节(chunks 目录,含 chunk 头),我的编码器是 3.74 字节;三种类型差别很大:计数器和恒定值很省,随机游走的浮点 gauge 几乎压不动,是主要的开销。恒定值序列也不是几乎免费——真实的抓取时间戳有毫秒级抖动(见上一组的“时间戳 位/样本”),时间戳部分比理想的 1 位大。我的编码器是论文版本,和 Prometheus 的 chunk 格式在时间戳位宽、chunk 头(每个 chunk 有样本数、校验和)等细节上不同,两个字节数在同一个量级,不要求相等
平均每个样本 4.43 字节;真实抓取的时间戳有毫秒级抖动,时间戳部分比理想值大。
快照里的文件 | 字节数
-----------+--------
chunks/* | 203,410
index | 16,907
meta.json | 302
tombstones | 9
按每样本 4.43 字节外推:155 条序列 × 86400 个样本 = 13,392,000 个样本,约 59.4 MB/天(算出来的);序列数多、标签多时 index 的占比会变大(上面每条序列的 index 约 109 字节,和样本数无关)
ERRORS {}index 每条序列约 109 字节,序列多时占比上升;可以按样本字节数外推存储量。