选错压缩算法,存储成本白涨30%?Apache Doris三大压缩算法选型与配置
2026/9/11 15:21:35 网站建设 项目流程

选错压缩算法,存储成本白涨30%?Apache Doris三大压缩算法选型与配置

【免费下载链接】dorisApache Doris is a real-time analytics and hybrid search database for AI agents.项目地址: https://gitcode.com/GitHub_Trending/doris/doris

Doris 压缩算法(ZSTD、LZ4、Snappy)的选择,直接决定一套实时分析数据库的磁盘成本和查询响应速度,而很多团队至今还在用默认值。Apache Doris 的块级压缩从数据写入那一刻就开始生效,本文给选型口径、给出三层配置方法,并说明改完之后怎么验证效果。

🧭 先给结论:三句话判断选哪个

不建议一上来就啃原理,按下面三条规则先定算法:

  • 历史归档、报表类表(一次写入、多次读取):选 ZSTD,三者中压缩率最高。
  • 实时接入、高频查询的热表:选 LZ4,压缩与解压都最快,内存占用低。
  • 日志存储、临时中间结果:选 Snappy,内存占用极低,压缩率居中。
  • 拿不准时保留默认的 LZ4,后续再把冷分区逐步迁到 ZSTD。

⚙️ 块级压缩是怎么工作的:三种算法的取舍点

数据写入 Doris 表时,会按数据块(block)为单位逐个压缩后才落盘,这就是块级压缩的含义。三种算法在 be/src/util/block_compression.cpp 中共用一个编解码器接口:都实现BlockCompressionCodec,差别在compress/decompress/max_compressed_len的行为上;每个块用的哪种压缩类型,会记录在存储格式的元信息里(见 gensrc/proto/segment_v2.proto)。

三者差异本质上是“压缩率—速度—内存”三角里的取舍:

  • ZSTD 的分层压缩机制在 100MB 以上的大数据块上压缩率最高,代价是更多 CPU。
  • LZ4 是流式快速编解码器,压缩、解压速度最快且内存占用低,适合 Kafka 实时接入这类 mini-batch 写入。
  • Snappy 介于两者之间,内存占用极低,压缩率低于 ZSTD。

从数据生命周期看,算法选择其实在写入阶段就已经决定了:

写入侧常见的是 Kettle 这类工具经 Stream Load 写 Doris,下图是示例中的转换设计与执行结果——数据落盘时,用的就是写入路径上已经定好的压缩算法:

🔧 三处配置:从全局默认到单表覆盖

改一:在 be.conf 里设全局默认值,让新建表统一走 ZSTD:

# conf/be.conf: 可选值 ZSTD/LZ4/SNAPPY, 默认 LZ4 storage_compression_method = ZSTD

改二:建表时对单表覆盖,热表钉住 LZ4 并显式给出块大小:

CREATE TABLE user_behavior ( user_id BIGINT, action STRING, event_time DATETIME ) PROPERTIES ( "compression" = "LZ4", -- 表级覆盖: 热表优先速度 "block_size" = "1048576" -- 1MB 块, 提升压缩效率 );

改三:改完后用一张系统表验证效果,压缩比与压缩/解压平均耗时都在里面:

SELECT table_name, compression_ratio, avg_compress_time_ms, avg_decompress_time_ms FROM information_schema.table_metrics WHERE database_name = 'analytics_db';

📉 一次从 Snappy 迁到 ZSTD 的电商案例:账怎么算

这个案例从账单角度看最清楚。某电商平台的用户行为日志表原先用 Snappy,团队最先关心的不是 CPU,而是云盘账单:把该表迁到 ZSTD 并结合段读取侧的块索引优化后,存储占用减少 52%,夜间报表生成时间缩短 18%,一年下来存储成本省下约 120 万元。能成立的原因是这张表典型地“一次写入、多次读取”:压缩率是主要收益,多花的压缩 CPU 发生在写入低峰,等于顺手完成。

⚠️ 换算法前,把这四条检查一遍

  • 压缩算法变更只对新数据生效,存量分区需要 ALTER TABLE 重建分区;建议在业务低峰期执行,并用 backup 工具先做数据快照。
  • ZSTD 的自适应压缩级别能力依赖 1.2.0+ 版本,升级前先核对版本。
  • 块大小有讲究:文本类型列适合更大块(约 4MB),数值类型保留默认 1MB 即可。
  • 混合策略:热数据分区用 LZ4,冷数据分区用 ZSTD,配合分区管理逐步推进,不要一次全表切换。

✅ 本周可以做的动作

挑出集群里存储占用最大的三张表,逐张套用三句话规则确认应使用的算法;冷表在低峰期迁到 ZSTD,一周后通过 table_metrics 核对存储压缩比的变化。

【免费下载链接】dorisApache Doris is a real-time analytics and hybrid search database for AI agents.项目地址: https://gitcode.com/GitHub_Trending/doris/doris

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询