Apache Doris 压缩算法怎么选:三步落地,存储省 40%
【免费下载链接】dorisApache Doris is a real-time analytics and hybrid search database for AI agents.项目地址: https://gitcode.com/GitHub_Trending/doris/doris
季度复盘,存储账单涨了 30%,BE 节点容量告警又响了。翻遍集群配置才发现,所有表还在裸跑默认压缩。好消息是:Apache Doris 压缩算法选型其实只要改一个 FE 参数 + 建表时加一行 PROPERTIES,热表切 LZ4、归档表切 ZSTD,存储普遍能再省 20%~40%。
三种算法,一句话记住它们的"脾气"
先别背参数,记三个形象:
ZSTD 像压缩饼干——同样的空间装下最多的货,代价是制作(压缩)时多花点力气。技术事实:它是三者中压缩率最高的算法,解压速度与压缩等级解耦,等级调高只多花写入 CPU,不影响查询侧。
LZ4 像快递闪送——东西原样快进快出,几乎不占你精力。技术事实:LZ4 压缩解压都是 O(n) 线性速度,写放链路里 CPU 开销最低,代价是压缩率平平。
Snappy 像临时便签——随手一贴,撕下来也不费劲。技术事实:面向小块内存数据设计,单块 256KB 一次压完,不追求压缩率,追求的是零负担。
| 算法 | 压缩率 | 压缩/解压速度 | 内存占用 | 典型场景 |
|---|---|---|---|---|
| ZSTD | 最高 | 压缩中等,解压快 | 中 | 冷数据归档、历史分区 |
| LZ4 | 中等 | 极快 | 低 | 实时写入、高频查询热表 |
| Snappy | 较低 | 快 | 极低 | 临时表、中间结果 |
源码细节:Doris 支持的压缩类型枚举定义在 gensrc/thrift/AgentService.thrift 的 TCompressionType 中:SNAPPY、LZ4、LZ4F、LZ4HC、ZLIB、ZSTD,建表时写哪个名字,底层就路由到对应编解码器。
写路径细节:LZ4HC 的等级由 BE 参数
LZ4_HC_compression_level(默认 9)控制,Snappy/LZ4 按 256KB 的块粒度压缩,定义见 be/src/common/config.cpp。
按你的场景选,别按参数选
如果你是实时接入的热表——Kafka 流式导入、写入后马上被查询——选 LZ4。它压缩解压都快,写放大和查询延迟都低;压缩率稍差的那点空间,用 SSD 补,比用 CPU 补划算。
如果你是历史归档的冷表——月分区、季报表,写完基本只读——选 ZSTD。这类数据查询频次低,压缩多花的 CPU 摊到查询里几乎无感,而压缩率能比 LZ4 再压出一截,账单立省。
如果你是临时表和中间结果——跑批产出、跑完即删——选 Snappy 甚至 NO_COMPRESSION。数据生命周期以小时计,省下的那点空间还没进账单就没了,别让压缩白白吃掉 CPU。
拿不准?用自己的一真实表跑一把仓库自带的 benchmark,别拍脑袋:
# 编译 be/benchmark 后,对真实数据页做编解码基准 ./doris_benchmark --benchmark_filter=PlainPage/Compress五分钟改完配置
第一步:改全局默认。压缩默认值是 FE 侧配置,改这一行、重启 FE,之后新建的表就全部走 ZSTD:
# conf/fe.conf default_compression_type = ZSTD第二步:表级覆盖。热表单独指定 LZ4,建表时加一个 PROPERTIES 即可,粒度到表,不跟全局抢:
CREATE TABLE user_behavior ( user_id BIGINT, action STRING, event_time DATETIME ) PROPERTIES ("compression" = "LZ4");第三步:验证效果。查 information_schema 里每列的压缩前后字节数,压缩比一目了然:
SELECT table_name, column_name, compressed_data_bytes, uncompressed_data_bytes, uncompressed_data_bytes / compressed_data_bytes AS ratio FROM information_schema.COLUMNS_DATA_SIZES WHERE database_name = 'analytics_db' ORDER BY ratio;字段说明:
compressed_data_bytes是落盘字节数,uncompressed_data_bytes是解压后字节数,两者比值即实际压缩比——拿这个数和选算法前的预估对比,验证 ZSTD/LZ4 是否真省了空间。
一个容易踩的坑:改压缩参数只对之后新写入的数据生效,存量 segment 保持原样(segment 是自描述的)。要让老数据也换算法,得走表重建或分区重写,别指望改个配置就回缩。更多参数说明可查 Apache Doris 官方文档 的 Configuration 一节。
上线前,先做这三件事
- 先做快照备份。对目标库执行
BACKUP DATABASE ... TO ...,压缩算法变更一旦要回滚,走restore比重导业务数据快得多——这是你的回滚方案。 - 挑低峰期执行。重建分区或重写数据会同时产生额外的压缩 CPU 和 IO 写放大,高峰期做等于把导入和查询一起拖慢;凌晨窗口执行,白天再验证。
- 验证效果要拿数说话。对比两个指标:存储量比值(压缩前后
data size之比,ZSTD 通常落在 0.6~0.8)和查询 P99 延迟变化——压缩率没提多少但 P99 涨了,说明算法选重了,回退即可。✅
【免费下载链接】dorisApache Doris is a real-time analytics and hybrid search database for AI agents.项目地址: https://gitcode.com/GitHub_Trending/doris/doris
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考