Distributed 引擎是什么
Distributed 引擎本身不存数据,它把查询转发到集群各分片并把结果汇总,写入时按分片键把数据路由到本地表。建表参数是集群名、库名、本地表名与可选分片键。查询分布式表会扇出到所有分片,聚合在发起查询的节点二次汇总,因此它适合跨分片统计,而单分片明细查询直接查本地表更省资源。
基本信息
| 语法 | ENGINE = Distributed(cluster, database, local_table[, sharding_key]) |
|---|---|
| 写入 | 直接写入分布式表时按分片键路由,无分片键则随机分布 |
| 查询 | SELECT 扇出到所有分片,聚合在发起节点二次汇总 |
| 前提 | 集群配置中需定义该集群与各分片副本 |
| 配套 | 本地表通常用 ReplicatedMergeTree 保证副本 |
| 适用版本 | ClickHouse 全系列 |
典型使用场景
- 跨分片统计:全量计数、按维度汇总
- 写入入口统一:业务只写分布式表,由集群负责路由
- 分片拆分:按 user_id 哈希把数据打散
- 报表查询:跨分片聚合后统一返回
- 本地明细查询:统计分析走分布式表,明细走本地表
- 集群扩容后重新平衡数据时作为查询入口保持不变
示例
示例
CREATE TABLE events_all ON CLUSTER prod AS events_local
ENGINE = Distributed('prod', 'analytics', 'events_local', rand()); -- 随机分片
-- 按用户哈希分片,保证同一用户的数据落在同一分片
-- ENGINE = Distributed('prod', 'analytics', 'events_local', cityHash64(user_id));
SELECT count() FROM events_all; -- 跨分片统计
SELECT * FROM events_all WHERE user_id = 42 LIMIT 10; -- 带分片键可定位单分片参数与行为读法
| 项 | 含义 | 注意点 |
|---|---|---|
| cluster | 集群名称 | 需在配置中已定义 |
| database | 本地表所在库 | 各分片需一致 |
| local_table | 本地实体表名 | 通常为 Replicated 表 |
| sharding_key | 分片路由表达式 | 决定数据分布是否均衡 |
| 无分片键 | 随机或轮询写入 | 查询无法定位单分片 |
生产上通常查询分布式表做跨分片统计,对单分片明细或后台任务则直接查本地表更省资源,也避免无谓的扇出。
写入分布式表与写入本地表都会落数据,选择哪种写入方式要统一,避免同一份数据被双份写入造成重复统计。
分片键选错会造成数据倾斜:写入量与查询负载集中到个别分片,扩容也难以缓解。