1、整体架构设计
ClickHouse 采用MPP(大规模并行处理)架构,支持分布式计算和存储,其核心设计目标是高性能列式分析。
(1)、存储层
列式存储:
数据按列存储(而非传统行式存储),每个列独立存储为文件,仅读取必要列,减少 I/O。
优势:- 列式压缩率高(如数值列使用 Delta 编码,字符串使用 LZ4 或字典编码)。
- 数据局部性好,适合向量化计算。
数据分块(Blocks):
数据被划分为 固定大小的块(默认 如8192行),每个块独立压缩存储,支持快速读取和并行处理。MergeTree 家族引擎:
核心存储引擎,基于 LSM-Tree 概念,数据按 ORDER BY 排序,通过后台合并(Merge)优化查询。
常见引擎:- MergeTree:基础引擎,无复制。
- ReplicatedMergeTree:支持副本,依赖 ZooKeeper 实现高可用。
- SummingMergeTree:自动合并相同分组的聚合结果(如 SUM)。
(2)、查询处理层
向量化执行引擎:
- 批量处理:一次可处理 1024 行(或更多)数据,而非逐行执行。
- SIMD 指令:利用 CPU 的 AVX2/AVX512 指令集加速计算(如 COUNT、SUM)。
- 零拷贝:数据直接从磁盘映射到内存,减少内存拷贝开销。
查询执行流程:
- 解析与优化:将 SQL 转换为 AST(抽象语法树),优化查询计划(如下推过滤条件)。
- 执行管道:构建执行管道,按列读取数据,通过向量化函数处理。
- 聚合与合并:对结果进行聚合(如 GROUP BY),并合并分块数据。
索引与过滤:
- 主键索引:数据按 ORDER BY 排序,支持快速范围查询。
- 稀疏索引:每个数据块存储列的 min/max 值,跳过无关块。
(3)、分布式架构
分片(Sharding):
数据按分片键(如 PARTITION BY 或哈希)水平拆分到多个节点,实现负载均衡。副本(Replication):
每个分片可配置多个副本(如 ReplicatedMergeTree),通过 ZooKeeper 协调同步,确保高可用。分布式表(Distributed Table):
逻辑表,代理访问多个分片,支持跨节点查询:
CREATE TABLE distributed_table
ENGINE = Distributed('cluster', 'local_database', 'local_table');
查询时自动分发到各分片并行执行,结果合并后返回。
ZooKeeper 集成:
用于协调分布式集群的元数据(如副本状态、分片分配)和故障转移。
2、核心组件与流程
(1)、数据写入流程
- 插入数据:通过 INSERT INTO 写入本地表,数据暂存为 临时文件。
- 合并(Merge):后台进程定期合并小文件为大块,按 ORDER BY 排序,优化查询性能。
- 副本同步:ReplicatedMergeTree 通过 ZooKeeper 同步数据到其他副本。
(2)、查询执行流程
- 解析与优化:
- SQL 被解析为 AST,优化器选择最优执行计划(如过滤下推、并行策略)。
- 分布式查询:
- 若查询分布式表,ClickHouse 将任务分发到所有分片并行执行。
- 向量化计算:
- 按列读取数据块,利用 SIMD 指令批量处理(如过滤、聚合)。
- 结果合并:
- 分片结果返回后,ClickHouse 合并最终结果(如 GROUP BY 的最终聚合)。
(3)、数据压缩与存储
压缩算法:
- LZ4:压缩速度快,适合实时场景。
- ZSTD:压缩率更高,适合存储优化。
- 自适应压缩:根据列类型选择最优算法(如数值列用 Delta + LZ4)。
存储结构:
- 数据按 数据块(Block) 存储,每个块包含多个列的压缩数据。
- 索引信息(如 min/max)存储在块的元数据中。
3、关键特性与优势
(1)、列式存储的优势
- 高效查询:仅读取所需列,减少 I/O。
- 高压缩率:同类数据压缩效率比行式存储高 5-10倍。
- 向量化计算:CPU 利用率高,适合现代硬件的 SIMD 指令。
(2)、分布式与高可用
- 多主架构:集群节点对等,无单点故障,支持跨数据中心部署。
- 故障自动恢复:通过 ZooKeeper 监控节点状态,故障时自动切换副本。
(3)、向量化执行引擎
- 零拷贝技术:数据直接从磁盘映射到内存,避免 CPU 内存拷贝。
- 批量处理:一次处理 1024 行数据,减少分支预测开销。
4、架构示意图
5、典型应用场景
(1)、实时分析:如日志分析、用户行为统计。
(2)、OLAP 查询:快速聚合 PB 级数据(如 SUM、COUNT、DISTINCT)。
(3)、时序数据:物联网设备数据的高效存储与查询。
6、总结
ClickHouse的列式存储、向量化执行引擎和分布式架构 是其高性能的核心。通过 数据分块压缩、MPP 并行计算 和 ZooKeeper 协调,它在海量数据分析场景中实现了 秒级响应 和 线性扩展能力。其架构设计特别适合读多写少的场景,但需注意避免频繁更新/删除操作(因其追加写入模式)。
逆风翻盘,Dare To Be!!!