背景
在大规模日志处理场景中,传统的 Elasticsearch 方案面临着存储成本高、查询性能不稳定等问题。ClickHouse 作为一个高性能的列式数据库,为日志存储提供了一个极具吸引力的替代方案。
为什么选择 ClickHouse
1. 存储效率极高
ClickHouse 的列式存储加上高效的压缩算法,可以将日志数据压缩到原始大小的 10-20%。
-- 查看表存储效率
SELECT
table,
formatReadableSize(sum(bytes_on_disk)) as disk_size,
formatReadableSize(sum(data_uncompressed_bytes)) as uncompressed_size,
round(sum(data_uncompressed_bytes) / sum(bytes_on_disk), 2) as ratio
FROM system.parts
WHERE table = 'logs'
GROUP BY table;2. 查询性能稳定
即使在海量数据下,ClickHouse 的查询性能依然稳定。
-- 统计最近1小时的日志量
SELECT
toStartOfMinute(timestamp) as minute,
count() as count
FROM logs
WHERE timestamp > now() - INTERVAL 1 HOUR
GROUP BY minute
ORDER BY minute;表结构设计
CREATE TABLE logs (
timestamp DateTime64(3),
level LowCardinality(String),
service LowCardinality(String),
message String,
trace_id String,
span_id String
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (service, timestamp)
TTL timestamp + INTERVAL 30 DAY;Note
使用 LowCardinality 类型可以显著减少低基数字段的存储空间。
总结
ClickHouse 是构建现代日志系统的理想选择,特别是在需要兼顾存储成本和查询性能的场景下。