ClickHouse 集群运维
概述
ClickHouse 集群通过分片扩展容量、副本保障可用,协调依赖 ZooKeeper/Keeper。本文讲清集群架构、副本分片配置、扩容缩容、权限与监控运维要点。
一、集群架构
┌──────────────┐
│ 应用/查询入口 │
└──────┬───────┘
│ Distributed 表
┌──────┴──────────────────────┐
│ 分片 1 分片 2 │
│ ┌────────┐ ┌────────┐ │
│ │副本 1-1 │ │副本 2-1 │ │
│ │副本 1-2 │ │副本 2-2 │ │
│ └────────┘ └────────┘ │
└─────────────┬────────────────┘
ZooKeeper / Keeper(协调)| 概念 | 说明 |
|---|---|
| 分片(Shard) | 数据水平切分 |
| 副本(Replica) | 数据冗余 |
| 分布式表 | 统一入口 |
| 协调 | ZK/Keeper |
二、分片与副本配置
2.1 集群定义
xml
<!-- config.xml -->
<clickhouse>
<remote_servers>
<cluster>
<shard>
<replica><host>ch1</host><port>9000</port></replica>
<replica><host>ch2</host><port>9000</port></replica>
</shard>
<shard>
<replica><host>ch3</host><port>9000</port></replica>
<replica><host>ch4</host><port>9000</port></replica>
</shard>
</cluster>
</remote_servers>
</clickhouse>2.2 副本表(ReplicatedMergeTree)
sql
CREATE TABLE events ON CLUSTER cluster (
event_date Date, count UInt64
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/events', -- ZK 路径
'{replica}'
)
ORDER BY event_date;| 参数 | 说明 |
|---|---|
| ZK 路径 | 副本协调路径(含分片) |
| replica | 副本名 |
| 数据同步 | 主副本写,从副本复制 |
2.3 数据分布
分布式表 + 分片键:
写:按分片键路由
读:全分片并行 + 合并三、ZooKeeper 与 ClickHouse Keeper
3.1 作用
| 职责 | 说明 |
|---|---|
| 副本元数据 | part 列表 |
| 协调 | 合并/复制 |
| 选举 | 主副本 |
3.2 ZK vs Keeper
| 对比 | ZooKeeper | ClickHouse Keeper |
|---|---|---|
| 来源 | Apache | ClickHouse 自带 |
| 部署 | 独立 | 内置 |
| 运维 | 独立集群 | 简化 |
| 性能 | 一般 | 更优 |
新版本推荐 Keeper:
部署简单、性能好3.3 Keeper 配置
xml
<keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<raft_configuration>
<server><id>1</id><hostname>ch1</hostname><port>9444</port></server>
<server><id>2</id><hostname>ch2</hostname><port>9444</port></server>
<server><id>3</id><hostname>ch3</hostname><port>9444</port></server>
</raft_configuration>
</keeper_server>四、写入与查询
4.1 写入路径
应用 → 分布式表 → 分片路由 → 本地表 → ZK 记录 → 副本复制4.2 批量写入建议
| 建议 | 说明 |
|---|---|
| 批量插入 | 减少 part 数量 |
| 控制大小 | 每批 5 万-10 万行 |
| 异步写 | 提高吞吐 |
五、扩容缩容
5.1 扩容(加节点)
1. 新节点安装配置
2. 加入集群 remote_servers
3. 建本地/分布式表
4. 数据迁移(新分片)| 方式 | 说明 |
|---|---|
| 加副本 | 提升可用性 |
| 加分片 | 提升容量 |
| 数据重分布 | 按需迁移 |
5.2 缩容
1. 迁移/下线数据
2. 从集群配置移除
3. 停节点| 注意 | 说明 |
|---|---|
| 先迁数据 | 防数据丢失 |
| 后移除 | 优雅下线 |
| 检查副本 | 至少留一份 |
六、权限管理
6.1 用户
xml
<users>
<readonly_user>
<password>***</password>
<networks><ip>10.0.0.0/8</ip></networks>
<profile>readonly</profile>
<quota>default</quota>
</readonly_user>
</users>6.2 权限模型
| 机制 | 说明 |
|---|---|
| Profile | 资源/权限集 |
| Quota | 配额 |
| RBAC(新版) | GRANT/REVOKE |
| Row Policy | 行级权限 |
sql
CREATE USER analyst IDENTIFIED BY '***';
GRANT SELECT ON db.* TO analyst;| 权限 | 说明 |
|---|---|
| SELECT | 查询 |
| INSERT | 写入 |
| CREATE/DROP | 表管理 |
| ALTER | 变更 |
七、监控与告警
7.1 关键指标
| 指标 | 说明 |
|---|---|
| 查询延迟/吞吐 | 性能 |
| 分区 part 数 | 合并健康 |
| 副本同步延迟 | 数据一致性 |
| 磁盘/内存 | 容量 |
| ZK 延迟 | 协调健康 |
7.2 监控方案
Prometheus + Grafana:
官方 clickhouse-exporter
指标采集与告警7.3 运维命令
| 命令 | 说明 |
|---|---|
| SYSTEM RELOAD CONFIG | 重载配置 |
| OPTIMIZE TABLE ... FINAL | 强制合并 |
| SYSTEM DROP REPLICA | 删除副本 |
| SELECT * FROM system.parts | 检查 part |
八、常见运维问题
| 问题 | 处理 |
|---|---|
| 副本不同步 | 查 ZK 路径与网络 |
| part 堆积 | 调合并线程/粒度 |
| 磁盘满 | 清理 TTL/扩容 |
| 查询慢 | 看指标定位 |
| 节点故障 | 副本自动接管 |
| 写入失败 | 检查分片路由 |
常见问题速查
| 问题 | 原因与处理 |
|---|---|
| 副本不一致 | 检查 ZK 与复制队列 |
| ZK 压力大 | 换 Keeper |
| 数据分布不均 | 分片键设计 |
| 扩容后查询慢 | 数据未迁移 |
| 权限失效 | 检查 profile/用户配置 |