ClickHouse 在日志系统中的最佳实践

Weijie Zhao2024年12月10日12 min read

背景

在大规模日志处理场景中,传统的 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 是构建现代日志系统的理想选择,特别是在需要兼顾存储成本和查询性能的场景下。

Related Posts