项目概述
ClickHouse 是一个开源的列式数据库管理系统,专为实时分析查询而设计。项目采用模块化架构,支持多种接口协议和部署模式。
整体架构图
graph TB
%% 客户端层
subgraph "客户端层 (Client Layer)"
CLI[ClickHouse Client]
HTTP_CLIENT[HTTP Client]
JDBC[JDBC Driver]
ODBC[ODBC Driver]
NATIVE[Native Client]
end
%% 协议接口层
subgraph "协议接口层 (Protocol Layer)"
HTTP_HANDLER[HTTP Handler]
TCP_HANDLER[TCP Handler]
MYSQL_HANDLER[MySQL Handler]
POSTGRES_HANDLER[PostgreSQL Handler]
GRPC_HANDLER[gRPC Handler]
end
%% 服务层
subgraph "服务层 (Service Layer)"
SERVER[ClickHouse Server]
KEEPER[ClickHouse Keeper]
LOCAL[ClickHouse Local]
end
%% 查询处理层
subgraph "查询处理层 (Query Processing Layer)"
PARSER[SQL Parser]
ANALYZER[Query Analyzer]
PLANNER[Query Planner]
INTERPRETER[Query Interpreter]
OPTIMIZER[Query Optimizer]
end
%% 执行引擎层
subgraph "执行引擎层 (Execution Engine)"
PIPELINE[Query Pipeline]
PROCESSORS[Processors]
FUNCTIONS[Functions]
AGGREGATES[Aggregate Functions]
end
%% 存储层
subgraph "存储层 (Storage Layer)"
MERGETREE[MergeTree Engine]
REPLICATEDMT[ReplicatedMergeTree]
MEMORY[Memory Engine]
DISTRIBUTED[Distributed Engine]
EXTERNAL[External Storages]
end
%% 基础设施层
subgraph "基础设施层 (Infrastructure Layer)"
IO[I/O System]
COMPRESSION[Compression]
FORMATS[Data Formats]
DISKS[Disk Management]
COORDINATION[Coordination Service]
end
%% 系统组件
subgraph "系统组件 (System Components)"
ACCESS[Access Control]
BACKUP[Backup/Restore]
MONITORING[Monitoring]
CONFIG[Configuration]
end
%% 连接关系
CLI --> TCP_HANDLER
HTTP_CLIENT --> HTTP_HANDLER
JDBC --> TCP_HANDLER
ODBC --> TCP_HANDLER
NATIVE --> TCP_HANDLER
HTTP_HANDLER --> SERVER
TCP_HANDLER --> SERVER
MYSQL_HANDLER --> SERVER
POSTGRES_HANDLER --> SERVER
GRPC_HANDLER --> SERVER
SERVER --> PARSER
PARSER --> ANALYZER
ANALYZER --> PLANNER
PLANNER --> INTERPRETER
INTERPRETER --> OPTIMIZER
OPTIMIZER --> PIPELINE
PIPELINE --> PROCESSORS
PROCESSORS --> FUNCTIONS
PROCESSORS --> AGGREGATES
PROCESSORS --> MERGETREE
PROCESSORS --> REPLICATEDMT
PROCESSORS --> MEMORY
PROCESSORS --> DISTRIBUTED
PROCESSORS --> EXTERNAL
MERGETREE --> IO
REPLICATEDMT --> COORDINATION
IO --> COMPRESSION
IO --> FORMATS
IO --> DISKS
SERVER --> ACCESS
SERVER --> BACKUP
SERVER --> MONITORING
SERVER --> CONFIG
KEEPER --> COORDINATION
核心模块说明
1. 客户端层 (Client Layer)
- ClickHouse Client: 官方命令行客户端
- HTTP Client: 基于 HTTP 协议的客户端
- JDBC/ODBC: 标准数据库连接驱动
- Native Client: 使用原生 TCP 协议的客户端
2. 协议接口层 (Protocol Layer)
- HTTP Handler: 处理 HTTP/HTTPS 请求
- TCP Handler: 处理原生 TCP 协议
- MySQL Handler: MySQL 协议兼容
- PostgreSQL Handler: PostgreSQL 协议兼容
- gRPC Handler: gRPC 协议支持
3. 服务层 (Service Layer)
- ClickHouse Server: 主服务器进程
- ClickHouse Keeper: 分布式协调服务(ZooKeeper 替代)
- ClickHouse Local: 本地单机模式
4. 查询处理层 (Query Processing Layer)
- SQL Parser: SQL 语句解析器
- Query Analyzer: 查询分析器
- Query Planner: 查询计划器
- Query Interpreter: 查询解释器
- Query Optimizer: 查询优化器
5. 执行引擎层 (Execution Engine)
- Query Pipeline: 查询管道
- Processors: 数据处理器
- Functions: 内置函数库
- Aggregate Functions: 聚合函数
6. 存储层 (Storage Layer)
- MergeTree Engine: 主要存储引擎
- ReplicatedMergeTree: 复制表引擎
- Memory Engine: 内存存储引擎
- Distributed Engine: 分布式表引擎
- External Storages: 外部存储集成
7. 基础设施层 (Infrastructure Layer)
- I/O System: 输入输出系统
- Compression: 数据压缩
- Data Formats: 数据格式支持
- Disk Management: 磁盘管理
- Coordination Service: 协调服务
8. 系统组件 (System Components)
- Access Control: 访问控制
- Backup/Restore: 备份恢复
- Monitoring: 监控系统
- Configuration: 配置管理
主要接口时序图
1. HTTP 查询处理时序图
sequenceDiagram
participant Client as HTTP Client
participant HTTPHandler as HTTP Handler
participant Server as ClickHouse Server
participant Parser as SQL Parser
participant Interpreter as Query Interpreter
participant Pipeline as Query Pipeline
participant Storage as Storage Engine
participant Formatter as Output Formatter
Client->>HTTPHandler: HTTP POST /query
HTTPHandler->>HTTPHandler: 解析 HTTP 请求
HTTPHandler->>Server: 创建查询会话
Server->>Parser: 解析 SQL 语句
Parser->>Parser: 构建 AST
Parser-->>Server: 返回 AST
Server->>Interpreter: 创建查询解释器
Interpreter->>Interpreter: 分析查询计划
Interpreter->>Pipeline: 构建执行管道
Pipeline->>Storage: 读取数据
Storage-->>Pipeline: 返回数据块
Pipeline->>Pipeline: 处理数据
Pipeline-->>Interpreter: 返回结果
Interpreter->>Formatter: 格式化输出
Formatter-->>HTTPHandler: 返回格式化结果
HTTPHandler->>Client: HTTP Response
2. TCP 原生协议查询时序图
sequenceDiagram
participant Client as Native Client
participant TCPHandler as TCP Handler
participant Session as Session
participant Context as Query Context
participant Interpreter as Query Interpreter
participant Pipeline as Query Pipeline
participant Storage as Storage Engine
Client->>TCPHandler: 建立 TCP 连接
TCPHandler->>Session: 创建会话
Client->>TCPHandler: 发送认证信息
TCPHandler->>Session: 验证用户
Session-->>TCPHandler: 认证成功
TCPHandler-->>Client: 认证确认
Client->>TCPHandler: 发送查询请求
TCPHandler->>Context: 创建查询上下文
Context->>Interpreter: 创建解释器
Interpreter->>Pipeline: 构建执行管道
loop 数据处理循环
Pipeline->>Storage: 请求数据块
Storage-->>Pipeline: 返回数据块
Pipeline->>Pipeline: 处理数据块
Pipeline-->>TCPHandler: 发送结果块
TCPHandler-->>Client: 传输数据块
end
Pipeline-->>TCPHandler: 查询完成
TCPHandler-->>Client: 发送完成信号
3. 分布式查询时序图
sequenceDiagram
participant Client as Client
participant Coordinator as Coordinator Node
participant Shard1 as Shard 1
participant Shard2 as Shard 2
participant Shard3 as Shard 3
Client->>Coordinator: 发送分布式查询
Coordinator->>Coordinator: 解析查询计划
Coordinator->>Coordinator: 确定分片策略
par 并行执行
Coordinator->>Shard1: 发送子查询
Coordinator->>Shard2: 发送子查询
Coordinator->>Shard3: 发送子查询
end
par 并行处理
Shard1->>Shard1: 执行本地查询
Shard2->>Shard2: 执行本地查询
Shard3->>Shard3: 执行本地查询
end
par 返回结果
Shard1-->>Coordinator: 返回部分结果
Shard2-->>Coordinator: 返回部分结果
Shard3-->>Coordinator: 返回部分结果
end
Coordinator->>Coordinator: 合并结果
Coordinator-->>Client: 返回最终结果
4. 数据写入时序图
sequenceDiagram
participant Client as Client
participant Server as ClickHouse Server
participant Parser as SQL Parser
participant InsertInterpreter as Insert Interpreter
participant Storage as MergeTree Storage
participant PartWriter as Part Writer
participant Merger as Background Merger
Client->>Server: INSERT INTO table VALUES/FORMAT
Server->>Parser: 解析 INSERT 语句
Parser-->>Server: 返回 INSERT AST
Server->>InsertInterpreter: 创建插入解释器
InsertInterpreter->>Storage: 获取表结构
Storage-->>InsertInterpreter: 返回表元数据
InsertInterpreter->>InsertInterpreter: 验证数据格式
InsertInterpreter->>PartWriter: 创建数据部分写入器
loop 数据写入循环
Client->>Server: 发送数据块
Server->>InsertInterpreter: 处理数据块
InsertInterpreter->>PartWriter: 写入数据块
PartWriter->>Storage: 创建数据部分
end
PartWriter->>Storage: 提交数据部分
Storage->>Merger: 触发后台合并
Storage-->>Server: 写入完成
Server-->>Client: 返回写入结果
Note over Merger: 后台异步执行
Merger->>Merger: 合并小的数据部分
Merger->>Storage: 更新合并后的部分
5. ClickHouse Keeper 协调时序图
sequenceDiagram
participant Client as ClickHouse Server
participant Leader as Keeper Leader
participant Follower1 as Keeper Follower 1
participant Follower2 as Keeper Follower 2
Client->>Leader: 发送写入请求
Leader->>Leader: 验证请求
par Raft 复制
Leader->>Follower1: 发送日志条目
Leader->>Follower2: 发送日志条目
end
par 确认复制
Follower1->>Follower1: 写入日志
Follower2->>Follower2: 写入日志
Follower1-->>Leader: 确认写入
Follower2-->>Leader: 确认写入
end
Leader->>Leader: 达到多数确认
Leader->>Leader: 提交日志条目
Leader-->>Client: 返回成功响应
par 通知提交
Leader->>Follower1: 通知提交
Leader->>Follower2: 通知提交
end
par 应用状态
Follower1->>Follower1: 应用到状态机
Follower2->>Follower2: 应用到状态机
end
关键设计特点
1. 列式存储
- 数据按列存储,提高压缩率和查询性能
- 支持多种压缩算法(LZ4、ZSTD、Delta 等)
2. 向量化执行
- 批量处理数据块,提高 CPU 利用率
- SIMD 指令优化
3. 分布式架构
- 支持水平扩展
- 自动分片和复制
- 无单点故障
4. 实时写入
- 支持高并发写入
- 异步合并机制
- 最终一致性
5. 多协议支持
- HTTP/HTTPS
- 原生 TCP 协议
- MySQL/PostgreSQL 兼容
- gRPC 支持
6. 高可用性
- ClickHouse Keeper 提供协调服务
- 数据复制和故障转移
- 健康检查和监控
性能优化特性
1. 查询优化
- 基于成本的优化器
- 谓词下推
- 投影下推
- 分区裁剪
2. 存储优化
- 主键索引
- 跳数索引
- 布隆过滤器
- 数据分区
3. 内存管理
- 内存池管理
- 查询内存限制
- 缓存机制
4. 并发控制
- 无锁数据结构
- 读写分离
- 异步 I/O
这个架构分析展示了 ClickHouse 的完整技术栈,从客户端接口到底层存储的各个层次,以及主要操作的执行流程。每个组件都有明确的职责分工,整体架构具有高度的模块化和可扩展性。