在 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:基于本地表的预聚合结果,用于加速查询