ClickHouseNotes

第 20 章:数据均衡

zjc 于 2026-01-20 发布

这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 数据均衡不仅看磁盘容量,还要看写入吞吐、查询负载、part 数量、合并压力和副本延迟。ClickHouse 不会自动满足所有维度的“均衡”,需要容量规划和运维机制。

20.1 均衡维度

维度 观察
磁盘空间 分片和磁盘剩余量
写入量 行数、字节、批次
查询量 QPS、扫描量、CPU
part 数 合并压力
副本队列 同步延迟
网络 分片间和应用流量

只按磁盘均衡,可能出现某分片查询 CPU 持续过热。

20.2 查看容量

SELECT
    name,
    path,
    free_space,
    total_space,
    keep_free_space
FROM system.disks
ORDER BY free_space;

按表查看:

SELECT
    database,
    table,
    sum(bytes_on_disk) AS bytes,
    sum(rows) AS rows,
    count() AS parts
FROM system.parts
WHERE active
GROUP BY database, table
ORDER BY bytes DESC;

20.3 查看写入分布

SELECT event_date, cityHash64(user_id) % 4 AS bucket, count()
FROM analytics.events_all
GROUP BY event_date, bucket
ORDER BY event_date, bucket;

真实集群应采集各节点本地表的写入指标,并结合监控系统的磁盘吞吐、CPU 和网络曲线判断。

20.4 写入热点

常见原因:

  1. 大租户或大用户集中;
  2. 分片键基数低;
  3. 路由表达式倾斜;
  4. 集群权重配置不当;
  5. 某分片副本异常;
  6. 应用直连配置错误。

处理:

  1. 重新评估分片键;
  2. 大租户独立路由;
  3. 使用 hash 后均匀桶;
  4. 调整写入并发;
  5. 修复异常副本;
  6. 规划数据迁移。

20.5 查询热点

SELECT
    query,
    count() AS executions,
    sum(read_rows) AS total_read_rows,
    avg(query_duration_ms) AS avg_ms
FROM system.query_log
WHERE event_date >= today() - 1
GROUP BY normalized_query_hash, query
ORDER BY total_read_rows DESC
LIMIT 20;

处理方式:

  1. 慢查询优化;
  2. 预聚合;
  3. 读写入口分离;
  4. 查询排队;
  5. 限制扫描量;
  6. 大报表错峰;
  7. 增加只读副本。

20.6 分片权重

远程服务器分片可以配置权重:

<shard>
    <weight>2</weight>
    <replica>...</replica>
</shard>

权重影响写入或查询分布的具体行为与版本和使用方式有关。它不能解决业务键倾斜,也不能替代路由测试。

20.7 扩容方式

常见策略:

策略 说明
只加副本 提升读吞吐和可用性,不增加分片存储
加分片 提升写入和存储容量,需要路由规划
混合扩容 常见生产方案
迁移热点表 隔离大租户或高负载业务
冷热分层 历史数据移动到 cheaper 存储

加副本相对简单;加分片必须确认数据路由是否变化。

20.8 数据迁移

安全流程:

1. 停止或暂停目标表写入
2. 记录数据边界
3. 新集群建表
4. 分批复制历史分区
5. 校验行数、指纹和指标
6. 切换写入
7. 观察查询
8. 保留回滚窗口

复制分区:

INSERT INTO new_cluster.analytics.events_local
SELECT *
FROM old_cluster.analytics.events_local
WHERE event_date = '2026-08-01';

跨集群远程查询要控制并发和批大小,避免影响生产。

20.9 冷热分层

ClickHouse 支持存储策略,可以把热数据放 SSD,冷数据放对象存储或机械盘。配置与版本强相关,上线前要验证:

  1. 移动策略;
  2. 查询性能;
  3. 对象存储权限;
  4. 网络带宽;
  5. 故障恢复;
  6. 成本模型。

20.10 容量规划

估算公式:

原始日志大小
× 写入放大
× 副本数
÷ 压缩率
+ 索引和投影
+ 合并临时空间
+ 预留空间
= 需要磁盘容量

建议预留:

  1. 合并临时空间;
  2. 备份窗口;
  3. 查询临时文件;
  4. 升级回滚;
  5. 流量增长;
  6. 数据重放。

本章小结

数据均衡是容量、写入、查询、合并和网络的综合治理。分片键决定长期分布,副本影响读能力,存储策略影响成本。扩容前必须明确路由是否变化,并准备分批迁移、校验和回滚方案。

思考题

  1. 磁盘均衡是否代表系统均衡?
  2. 写入热点如何定位?
  3. 加副本和加分片分别解决什么问题?
  4. 分片路由变化有什么风险?
  5. 容量规划为什么要预留合并空间?