remote 与 cluster 表函数是什么
remote 表函数可以在一条 SQL 里查询其它 ClickHouse 实例的表,cluster 与 clusterAllReplicas 则按集群拓扑展开:cluster 对每个分片各查一次,clusterAllReplicas 覆盖全部分片的所有副本。它适合临时的跨集群对账与迁移校验,不需要提前建分布式表。跨实例查询会传输结果数据,过滤条件下推能力有限,大范围对账建议先在各集群内聚合再比较。
基本信息
| remote | remote('host:9000', db, table[, user, password]),查询单个实例 |
|---|---|
| cluster | cluster('prod', db, table),每个分片各查一次 |
| clusterAllReplicas | 覆盖全部分片的所有副本 |
| 典型用途 | 跨集群对账、迁移校验、临时查询 |
| 所属系统 | ClickHouse 表函数 |
典型使用场景
- 跨集群对账:对比两套集群里同一张表的行数与关键指标
- 迁移校验:新集群上线前核对数据是否完整
- 临时查询:不值得为一次需求去建分布式表
- 副本巡检:用 clusterAllReplicas 看各副本行数是否一致
- 故障排查:确认某个分片上的数据是否正常
跨实例查询
跨实例查询
SELECT count() FROM remote('10.0.0.8:9000', 'analytics', 'events'); -- 查单个远端实例
SELECT hostName(), count() -- 遍历所有副本
FROM clusterAllReplicas('prod', 'analytics', 'events')
GROUP BY hostName();函数读法
| 函数 | 扫描范围 | 注意 |
|---|---|---|
| remote | 指定单个实例 | 需要能直连目标端口 |
| cluster | 每个分片一次 | 副本不重复统计 |
| clusterAllReplicas | 每个分片的每个副本 | 副本数据相同会重复计数 |
| 连接信息 | 主机、库、表 | 可携带用户名与密码 |
| 返回数据 | 各节点结果汇总 | 传输量随结果集增大 |
跨实例查询会把结果数据传回本地节点,过滤条件下推能力有限;大范围对账建议先在各集群内做聚合,再比较聚合结果,传输量小且更可控。
remote 连接信息里硬编码的密码会进入查询日志,敏感场景应改用命名集合或预先建好的分布式表。
clusterAllReplicas 会遍历所有副本,副本数据一致时按副本聚合会产生重复计数,统计口径先要明确是分片维度还是副本维度。