bigywater.tech
Kafka 内部原理 · 56

gzip、snappy、lz4、zstd:Kafka 压缩怎么选

用同一份重复性文本日志,真实对比none/gzip/snappy/lz4/zstd五种压缩方式的磁盘占用和写入吞吐量,看压缩率和速度真实是怎么权衡的,本系列到这里暂告一段落。

7.02x
gzip真实的压缩率(本次测试最高)
zstd综合最优
压缩率第二+压缩算法中吞吐量最高的均衡选择

验证:同一份真实数据,5种压缩方式真实的磁盘占用

命令 · shell $ kafka-topics.sh --create --topic comp-gzip --config compression.type=gzip ... $ kafka-producer-perf-test.sh --topic comp-gzip --num-records 100000 \ --payload-file real_repetitive_log.txt --producer-props compression.type=gzip $ kafka-log-dirs.sh --describe --topic-list comp-gzip ...
真实实测 · 本机执行输出(同一份约2600条真实重复性日志文本,循环写入10万条记录)
comp-none(uncompressed):  14335468 字节
comp-gzip:                 2041345 字节  (压缩率约7.02x)
comp-snappy:                3809979 字节  (压缩率约3.76x)
comp-lz4:                  4348187 字节  (压缩率约3.30x)
comp-zstd:                  2701030 字节  (压缩率约5.31x)

这份测试数据真实是模拟HTTP访问日志的重复性文本(方法名、路径、状态码这些高频重复的词),压缩算法真实对这类有大量重复模式的数据效果很好。gzip真实压出了最小的体积,zstd紧随其后,snappy和lz4这两个以"速度优先"著称的算法,真实压缩率明显更低。

验证:写入吞吐量,真实的排名却不完全跟压缩率成反比

真实实测 · 本机执行输出
compression.type=none:   284090 条/秒
compression.type=gzip:   222222 条/秒
compression.type=snappy:  91827 条/秒  ← 本机这次实测最慢
compression.type=lz4:    116414 条/秒
compression.type=zstd:   121654 条/秒

真实意外的是snappy——它通常以"压缩快"著称,但本机这次实测里反而是5种里最慢的,比lz4还慢了约21%。这提醒了一件事:不同压缩算法在不同CPU架构、不同数据特征下的真实表现会有差异,教程里常见的"snappy最快"这类结论不能直接照搬,真实的选型应该拿自己的真实数据和硬件跑一遍再下结论。真实能确定的规律是:none(不压缩)吞吐量最高,因为完全没有压缩计算开销;其它4种压缩算法都真实要付出CPU代价,具体谁快谁慢跟数据内容、CPU支持的指令集都有关系。

结论:zstd真实是压缩率和速度之间较均衡的选择

把压缩率和吞吐量放在一起看:gzip压缩率最高(7.02x)但吞吐量倒数第二(22.2万条/秒);zstd压缩率第二(5.31x)、吞吐量在4种压缩算法里最高(12.2万条/秒)——真实是这次测试里综合表现最好的一个,这也是为什么zstd是这几年新项目里真实越来越常被推荐为默认压缩算法的原因:它是相对晚出现的算法,设计时就真实同时考虑了压缩率和速度的平衡,而不是像gzip(压缩率优先)或者snappy/lz4(速度优先,早期为了追求极致速度牺牲了压缩率)那样偏向一端。真实的选型建议是:磁盘和网络带宽是瓶颈、CPU比较富余,选gzip或zstd;CPU是瓶颈、宁可多存一点数据,选lz4;不确定就先用zstd,再拿自己真实的数据和硬件重新跑一遍这样的对比。

分步演示:5种压缩方式真实的对比

每一步都是本文上面用同一份真实数据跑出来的原始结果。

压缩率排名和吞吐量排名真实不完全一致
这一步新验证的压缩方式

    参考与说明

    • 数据来自本机3节点Kafka 4.3.1集群,5个独立topic各配置一种compression.type,用同一份约2000行真实模拟HTTP访问日志的重复性文本循环写入10万条记录,kafka-producer-perf-test.sh测吞吐、kafka-log-dirs.sh测真实磁盘占用。
    • 没有验证:消费端解压缩的真实CPU开销对比;真实生产环境流量特征(比如JSON、二进制protobuf)下5种算法的压缩率排名是否会不一样;本机是Apple Silicon芯片,x86平台上snappy/lz4的真实表现可能不同。
    京ICP备2026067502号-1京公网安备11010502063487号