ClickHouse 分布式集群环境中各个表关系

在 ClickHouse 分布式集群环境中,b_normal 通常是一个分布式表(Distributed Table),它是整个集群的"统一查询入口"。


1. 三者的角色定位

表名 类型 作用
b_normal 分布式表 逻辑上的"总表",不存储实际数据,只提供统一的查询入口,读写操作会自动路由到集群各节点
b_normal_local 本地表 实际存储数据的物理表,数据只存在于当前节点
b_normal_sip_dip_dport_type_local_mv 物化视图(目标表) 基于本地表自动聚合的结果表,也是本地表

2. 它们的关系可以用一个图来表示

text

复制代码
                    ┌─────────────────────────────────────┐
                    │       b_normal (分布式表)          │
                    │   统一查询入口,不存数据,自动路由     │
                    └──────────────┬──────────────────────┘
                                   │ 查询/写入时自动分发
          ┌────────────────────────┼────────────────────────┐
          │                        │                        │
          ▼                        ▼                        ▼
┌─────────────────┐      ┌─────────────────┐      ┌─────────────────┐
│  Node 1         │      │  Node 2         │      │  Node 3         │
│ b_normal_local│      │ b_normal_local│      │ b_normal_local│
│   (实际数据)     │      │   (实际数据)     │      │   (实际数据)     │
└────────┬────────┘      └────────┬────────┘      └────────┬────────┘
         │                        │                        │
         │ 写入时自动触发          │ 写入时自动触发          │ 写入时自动触发
         ▼                        ▼                        ▼
┌─────────────────┐      ┌─────────────────┐      ┌─────────────────┐
│b_normal_..._mv│        │b_normal_..._mv│      │    b_normal_..._mv│
│  (聚合结果)      │      │  (聚合结果)      │      │  (聚合结果)      │
└─────────────────┘      └─────────────────┘      └─────────────────┘

3. 为什么要这样设计?

分布式表 (b_normal) 的好处
  • 对应用透明 :你只需要操作 b_normal 这一个表,ClickHouse 会自动把查询分发到所有节点,并把结果汇总返回。

  • 写入自动分片 :写入 b_normal 时,数据会根据分片规则(如轮询、哈希)自动分配到不同节点的 b_normal_local 中。

本地表 (b_normal_local) 的好处
  • 数据物理存储:每个节点只存自己负责的那部分数据,实现数据分片。

  • 物化视图依赖:物化视图必须建立在本地表上,因为数据写入是发生在每个节点本地的。


4. 如何验证 b_normal 是分布式表?

你可以执行以下 SQL 查看表引擎:

sql

复制代码
SHOW CREATE TABLE b_normal;

输出通常会包含:

sql

复制代码
ENGINE = Distributed(cluster_name, database_name, b_normal_local, rand())

或者查看系统表:

sql

复制代码
SELECT 
    name,
    engine,
    engine_full
FROM system.tables
WHERE database = 'your_database' 
  AND name = 'b_normal';

如果 engine 显示为 Distributed,就证明它是一个分布式表。


5. 总结一下三者的完整链路

text

复制代码
应用写入/查询 → b_normal (分布式表)
                    ↓ 自动路由
         各节点上的 b_normal_local (本地表,存原始数据)
                    ↓ 自动触发
         各节点上的 b_normal_xxx_local_mv (物化视图,存聚合结果)
  • b_normal:对外统一接口,集群入口

  • b_normal_local:实际数据存储,各节点一份

  • b_normal_..._local_mv:基于本地表的预聚合结果,用于加速查询