项目概述

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 的完整技术栈,从客户端接口到底层存储的各个层次,以及主要操作的执行流程。每个组件都有明确的职责分工,整体架构具有高度的模块化和可扩展性。