资讯动态

成本直降70%!Doris 数据压缩机制全解析与配置实战

发布时间:2026/9/7 8:17:42 来源:尧图企业网站定制
成本直降70%Doris 数据压缩机制全解析与配置实战前言你的存储账单还好吗一、压缩全景图Doris 是如何压缩数据的1.1 为什么列式存储更适合压缩1.2 两层压缩编码 压缩二、压缩算法详解选对算法是关键2.1 算法对比一览2.2 如何选择算法三、编码优化让压缩算法发挥最大威力3.1 字符串编码优化3.2 如何定位编码问题四、配置实战一步步调优压缩参数4.1 基础配置在建表时指定压缩算法4.2 高级配置调整数据页大小4.3 分桶数对压缩的影响4.4 列级别压缩进阶五、实战案例压缩率从 1.33x 到 2.6x5.1 初始状态5.2 逐步优化六、Compaction压缩背后的清道夫6.1 Compaction 是什么6.2 Compaction 类型6.3 关键配置参数七、监控与诊断如何判断压缩是否生效7.1 查看表压缩情况7.2 查看列级别压缩详情7.3 监控 Compaction 状态八、优化 Checklist总结The Begin点点关注收藏不迷路从 LZ4 到 ZSTD从 64KB 到 1MB手把手教你玩转 Doris 压缩前言你的存储账单还好吗随着数据量的爆炸式增长存储成本已经成为很多企业不可忽视的开支。一个 10TB 的数据集如果压缩率能从 50% 提升到 70%就意味着节省了 2TB 的存储空间——这在云上可能是每月数千元的费用。Doris 作为一款高性能的 OLAP 数据库其列式存储架构天然适合压缩。但很多人只是用着默认的 LZ4 压缩从未深入探究过压缩机制也不知道如何通过调整参数让压缩效果翻倍。今天我将从原理到配置再到实战优化完整拆解 Doris 的数据压缩机制帮你把存储成本降到最低。一、压缩全景图Doris 是如何压缩数据的Doris 的压缩机制采用分层架构在数据写入过程中构建起两道防线。流程图Doris 数据写入与压缩流程原始数据列式存储按列独立存储编码 Encoding字典编码Dictionary Encoding游程编码RLEBitshufflePlain 编码分页 Page默认 64KB/页压缩 CompressionLZ4 - 速度优先ZSTD - 压缩率优先Snappy - 平衡型Zlib - 归档场景写入磁盘 Tablet1.1 为什么列式存储更适合压缩Doris 采用列式存储同一列的数据类型一致且分布相似这为压缩提供了天然优势数据局部性好同一列的值往往具有相似的模式和范围重复值集中低基数列会有大量重复值便于字典编码连续数值规律时间戳、ID 等列往往有规律可循1.2 两层压缩编码 压缩Doris 的压缩分为两个阶段阶段作用典型技术编码 Encoding将数据转换为更适合压缩的形式字典编码、Bitshuffle、RLE压缩 Compression对编码后的数据进行通用压缩LZ4、ZSTD、Snappy、Zlib这种编码压缩的双层设计是 Doris 高压缩比的核心秘密。二、压缩算法详解选对算法是关键Doris 支持多种压缩算法每种算法在压缩率和速度之间有不同的权衡。2.1 算法对比一览算法压缩速度解压速度压缩率适用场景LZ4⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐实时查询、高并发负载LZ4F⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐需要细粒度配置的场景LZ4HC⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐追求压缩比但仍关注速度ZSTD⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐存储效率优先、冷数据Snappy⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐低 CPU 消耗场景Zlib⭐⭐⭐⭐⭐⭐⭐⭐⭐归档、冷数据存储无压缩⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐数据已压缩或存储不是问题2.2 如何选择算法是是否否是热数据冷数据/归档否选择压缩算法查询性能要求高?需要极致解压速度?LZ4实时查询首选ZSTD平衡性能与压缩率存储成本敏感?数据访问频率?ZSTD仍保持较快解压Zlib 或 LZ4HC极致压缩率LZ4默认稳妥选择实战建议默认场景LZ4 是最稳妥的选择速度快、CPU 友好存储成本敏感ZSTD 可以比 LZ4 多压缩约 20% 的空间归档数据Zlib 提供最高的压缩率但写入和查询都会慢一些三、编码优化让压缩算法发挥最大威力在压缩之前Doris 会对数据进行编码。优化编码方式能显著提升最终压缩效果。3.1 字符串编码优化Doris 对字符串列默认使用字典编码 Plain Binary 混合策略。但当短字符串量很大时offset 数组会浪费大量空间。优化方案Doris 新版本将字符串布局改为长度 内容顺序写入省去了独立的 offset 数组。3.2 如何定位编码问题Doris 提供了information_schema.column_data_sizes系统表可以精确查看每列的压缩情况SELECTCOLUMN_NAME,COLUMN_TYPE,sum(COMPRESSED_DATA_BYTES)AScompressed_bytes,sum(UNCOMPRESSED_DATA_BYTES)ASuncompressed_bytes,round(sum(COMPRESSED_DATA_BYTES)*100.0/sum(UNCOMPRESSED_DATA_BYTES),2)asratioFROMinformation_schema.column_data_sizesWHEREtable_id(SELECTTABLE_IDFROMinformation_schema.tablesWHERETABLE_NAMEyour_table)GROUPBYCOLUMN_NAME,COLUMN_TYPEORDERBYcompressed_bytesDESC;解读结果ratio接近 100%该列压缩效果差需要优化编码ratio较低如 20% 以下压缩效果好四、配置实战一步步调优压缩参数4.1 基础配置在建表时指定压缩算法CREATETABLEsales_data(sale_idBIGINT,sale_dateDATE,product_nameVARCHAR(200),categoryVARCHAR(50),amountDECIMAL(20,2),descriptionTEXT)DUPLICATEKEY(sale_id,sale_date)DISTRIBUTEDBYHASH(sale_id)BUCKETS32PROPERTIES(compressionzstd-- 指定压缩算法);4.2 高级配置调整数据页大小数据页Page是压缩的基本单位。页大小影响压缩效率和查询性能的平衡页大小压缩效果查询性能适用场景64KB默认中等优秀通用场景256KB较好良好中等数据量1MB最好可接受批量分析、离线报表CREATETABLElarge_analysis_table(...)PROPERTIES(compressionzstd,storage_page_size1048576-- 1MB单位字节);4.3 分桶数对压缩的影响分桶数也会影响压缩效果。分桶越多每个桶的数据越少页内数据相似性降低压缩率就会下降。优化策略在保证并行度的前提下适当减少分桶数让数据集中到更少的桶中提高页内数据相似性-- 之前48 个桶-- 之后4 个桶适合离线分析场景DISTRIBUTEDBYHASH(user_id)BUCKETS44.4 列级别压缩进阶Doris 支持对不同类型的列设置不同的压缩策略列类型推荐算法原因数值列INT/BIGINTZSTD压缩率高解压快字符串列VARCHARLZ4平衡压缩与查询大文本列TEXTZlib极致压缩访问频率低五、实战案例压缩率从 1.33x 到 2.6x基于 ClickBench 数据集的优化案例5.1 初始状态原始数据21.37 GBDoris 默认配置LZ4 64KB页 48桶16.08 GB压缩率1.33x5.2 逐步优化优化步骤配置变更存储大小压缩率步骤1LZ4 → ZSTD12.9 GB1.66x步骤2页大小 64KB → 1MB11.5 GB1.86x步骤3分桶数 48 → 410.71 GB2.00x步骤4字符串编码优化8.2 GB2.60x最终效果压缩率提升48.6%存储空间从 16.08 GB 降至 8.2 GB。六、Compaction压缩背后的清道夫6.1 Compaction 是什么Doris 基于 LSM-Tree 存储引擎数据写入时顺序追加到新文件中。随着时间推移会产生大量小文件导致查询时需要合并多个文件性能下降。Compaction 的作用后台合并小文件减少查询时的归并路数清理标记删除的数据释放空间对相同 Key 的数据进行聚合或去重6.2 Compaction 类型类型作用触发条件Cumulative Compaction合并小的增量 rowsetScore 5Base Compaction合并大版本数据Score 5 且 Base rowset 占比 0.3Full Compaction合并所有 rowset手动触发或特定条件6.3 关键配置参数参数默认值说明max_cumu_compaction_threads-1每盘一线程Cumulative Compaction 线程数max_base_compaction_threads4Base Compaction 线程数cumulative_compaction_min_deltas5触发 Compaction 的最小 Scorecumulative_compaction_max_deltas1000单次 Compaction 最大 Score优化建议在高写入场景下适当增加 Compaction 线程数可以避免小文件堆积。七、监控与诊断如何判断压缩是否生效7.1 查看表压缩情况-- 查看指定表的存储统计SHOWDATAFROMyour_table;-- 输出示例--------------------------------------------------|TableName|Size|ReplicaCount|CompressedSize|--------------------------------------------------|your_table|10.23GB|3|3.41GB|--------------------------------------------------7.2 查看列级别压缩详情-- 使用前文提到的 column_data_sizes 表SELECT*FROMinformation_schema.column_data_sizesWHEREtable_idyour_table_idLIMIT10;7.3 监控 Compaction 状态-- 查看 Compaction 状态SHOWPROC/compactions;-- 查看 Tablet 的 Compaction ScoreSHOWTABLETFROMyour_table;八、优化 Checklist按照以下清单逐一检查和优化选择了合适的压缩算法实时场景用 LZ4存储敏感用 ZSTD调整了数据页大小批量分析场景可尝试 1MB评估了分桶数避免分桶过多导致压缩率下降检查了编码效率用 column_data_sizes 定位压缩差的列配置了 Compaction 线程高写入场景适当增加线程数监控了压缩效果定期查看 SHOW DATA 和监控指标总结Doris 的数据压缩机制是一个编码 压缩的双层体系通过合理配置可以实现70% 以上的存储节省。核心优化路径选对算法ZSTD 比 LZ4 多压缩 20%但 CPU 开销略高调大页大小从 64KB 到 1MB压缩率可提升 15-20%控制分桶数减少分桶让数据更集中压缩更高效优化编码字符串编码优化是压缩提升的关键口诀实时查询用 LZ4存储省钱上 ZSTD页大小别太小1MB 对大查询友好分桶数要控制数据集中压缩好定期看监控及时调整别偷懒按照这套方法论你的 Doris 存储成本可以轻松降低 50% 以上。快去检查一下你的表配置吧The End点点关注收藏不迷路

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价