☰
Apache Doris 压缩算法怎么选:三步落地,存储省 40%
2026/9/25 12:19:11 网站建设 项目流程

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 一节。

上线前,先做这三件事

  1. 先做快照备份。对目标库执行BACKUP DATABASE ... TO ...,压缩算法变更一旦要回滚,走restore比重导业务数据快得多——这是你的回滚方案。
  2. 挑低峰期执行。重建分区或重写数据会同时产生额外的压缩 CPU 和 IO 写放大,高峰期做等于把导入和查询一起拖慢;凌晨窗口执行,白天再验证。
  3. 验证效果要拿数说话。对比两个指标:存储量比值(压缩前后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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询