简介
Clickhouse 数据压缩主要使用两个方案LZ4和ZSTD
LZ4解压缩速度上会更快,但压缩率较低,
ZSTD解压缩较慢。但是压缩比例较高。
clickhouse不同压缩算法测试对比,LZ4最优。
https://www.percona.com/blog/2016/04/13/evaluating-database-compression-methods-update
以下测试主要验证业内测试的结论,测试的zstd数据会多一点,测试不是十分严谨,仅供参考。
压测环境
开发(dev) 机器数量:3 cpu:40core 内存:256G disk:2.0T*10
测试数据
kafka TOPIC: cdn-log-analysis-realtime。可消费数据总量363255827。数据消费4次到ck。
Clickhouse表
cdn_log_analysis_realtime lz4压缩
cdn_log_realtime zstd压缩
压缩配置
在/etc/metrika.xml
<compression incl="clickhouse_compression"> --指定incl
<case>
<min_part_size>10000000000</min_part_size> --数据部分的最小大小
<min_part_size_ratio>0.01</min_part_size_ratio> --数据部分大小与表大小的比率
<method>zstd</method> --压缩算法,zstd和lz4
</case>
</compression>
LZ4
压缩率
执行sql :SELECT table AS 表名
, sum(rows) AS 总行数
, formatReadableSize(sum(data_uncompressed_bytes)) AS 原始大小
, formatReadableSize(sum(data_compressed_bytes)) AS 压缩大小
, round((sum(data_compressed_bytes)/sum(data_uncompressed_bytes))*100, 0) AS 压缩率
FROM system.parts WHERE (database IN ('default') AND (table = 'cdn_log_analysis_realtime') ) GROUP BY table
分别查看不同机器的压缩比例
1.png 2.png 3.png
平均4.85亿数据,原始数据105G压缩后数据27G,平均压缩率27%。
查询能力
执行sql : select toDateTime(intDiv(toUInt32(its),60)*60) as t, count() as t_c, avg(speed) as t_v, quantile(0.99)(speed) as t_99, quantile(0.90)(speed) as t_90 , quantile(0.75)(speed) as t_75 , quantile(0.50)(speed) as t_50 , quantile(0.25)(speed) as t_25 from default.cdn_log_analysis_realtime_all where day='2020-12-17' group by t order by t_v desc
冷数据(第一次查询)
查询 1.45 billion 行 共花费7.446 sec。
热数据(第二次查询)
查询 1.45 billion 行 共花费1.150 sec。
ZSTD
压缩率
执行sql :
SELECT table AS 表名
, sum(rows) AS 总行数
, formatReadableSize(sum(data_uncompressed_bytes)) AS 原始大小
, formatReadableSize(sum(data_compressed_bytes)) AS 压缩大小
, round((sum(data_compressed_bytes)/sum(data_uncompressed_bytes))*100, 0) AS 压缩率
FROM system.parts WHERE (database IN ('default') AND (table = 'cdn_log_realtime') ) GROUP BY table
分别查看不同机器的压缩比例
1.png 2.png 3.png
平均 4.85亿数据 原始数据 105G压缩后数据24G,平均压缩率22%。
查询能力
执行sql :select toDateTime(intDiv(toUInt32(its),60)*60) as t, count() as t_c, avg(speed) as t_v, quantile(0.99)(speed) as t_99, quantile(0.90)(speed) as t_90 , quantile(0.75)(speed) as t_75 , quantile(0.50)(speed) as t_50 , quantile(0.25)(speed) as t_25 from default.cdn_log_realtime where day='2020-12-25' group by t order by t_v desc
冷数据(第一次查询)
查询 1.45 billion 行 共花费7.162 sec。
热数据(第二次查询)
查询 1.45 billion 行 共花费3.884 sec。
ZSTD和LZ4压缩集群整体对比
执行sql:SELECT 'ZSTD' as 压缩方式
, table AS 表名
, sum(rows) AS 总行数
, formatReadableSize(sum(data_uncompressed_bytes)) AS 原始大小
, formatReadableSize(sum(data_compressed_bytes)) AS 压缩大小
, round((sum(data_compressed_bytes)/sum(data_uncompressed_bytes))100, 0) AS 压缩率
FROM cluster(ctyun31, system, parts) WHERE (database IN ('default') AND (table = 'cdn_log_realtime') ) GROUP BY table union all SELECT 'LZ4' as 压缩方式
, table AS 表名
, sum(rows) AS 总行数
, formatReadableSize(sum(data_uncompressed_bytes)) AS 原始大小
, formatReadableSize(sum(data_compressed_bytes)) AS 压缩大小
, round((sum(data_compressed_bytes)/sum(data_uncompressed_bytes))100, 0) AS 压缩率
FROM cluster(ctyun31, system, parts) WHERE (database IN ('default') AND (table = 'cdn_log_analysis_realtime') ) GROUP BY table
总结
测试不是十分严谨,ZSTD的ck表的数据多一点,但是不影响测试结果,仅做参考。
压缩能力上,ZSTD的压缩比例为22%,LZ4的压缩比例为27%,ZSTD的压缩性能更好。但是效果不是很明显。
查询能力上,冷数据查询,两者相差不大。热数据方面,ZSTD为3.884s,而LZ4为1.150s。ZSTD查询时间在3.37倍以上,LZ4的查询能力更强。
综上所述,建议使用LZ4。
集群数据量后期预估,按当前使用lz4压缩方案,3分片1副本,计算35.510*0.8(按磁盘最多使用80%算) 的硬盘能存储大概多少数据。
一天数据100亿
一天磁盘消耗 (10000000000/1453023308.084.98)/1024.0=0.57TB
能存储天数 35.5100.8/0.57=231.57 day。
一天数据1000亿
231.57/10=23.1day。
网友评论