ClickHouse 集群部署是将 ClickHouse 从单机系统升级为高可用、可扩展的分布式分析平台的关键步骤。本篇将全面、深入地详解 ClickHouse 集群的架构设计、配置方法、部署流程和最佳实践,帮助你构建一个稳定、高效的生产级集群。
🏗️ 一、ClickHouse 集群的核心概念
1. 分片(Shard)
- 数据水平拆分到多个节点。
- 每个分片存储部分数据,提升写入和查询吞吐。
- 例如:按
user_id % 2拆分到两个分片。
2. 副本(Replica)
- 每个分片的数据在多个节点上复制(通常 2 副本)。
- 提供高可用和读扩展能力。
- 使用
ReplicatedMergeTree引擎实现副本间同步。
3. 集群(Cluster)
- 由多个 分片 + 副本 组成的逻辑集合。
- 通过
Distributed表引擎实现跨分片查询。
✅ 典型结构:
Cluster: analytics_cluster
│
├── Shard 1
│ ├── Replica 1 → node1
│ └── Replica 2 → node2
│
├── Shard 2
│ ├── Replica 1 → node3
│ └── Replica 2 → node4
🧩 二、集群架构选择
| 架构 | 说明 | 适用场景 |
|---|---|---|
| 单分片多副本 | 1 个分片,2+ 副本 | 数据量不大,但要求高可用 |
| 多分片单副本 | 多个分片,无副本 | 成本敏感,可接受单点故障 |
| 多分片多副本 | 分片 + 副本组合 | 生产环境推荐,高可用 + 高扩展 |
🚀 推荐生产环境使用:多分片多副本
🔧 三、部署前准备
1. 环境要求
| 项目 | 要求 |
|---|---|
| 节点数量 | 至少 2 台(建议 3~6 台) |
| 操作系统 | Linux(Ubuntu/CentOS/RedHat) |
| 内存 | 每节点 16GB+(建议 32GB+) |
| CPU | 多核(16 核+) |
| 磁盘 | SSD,足够空间(按数据量规划) |
| 网络 | 千兆以上,低延迟 |
2. 协调服务(必选其一)
- ZooKeeper 集群:传统方式,独立部署
- ClickHouse Keeper:v21+ 内置,推荐新集群使用
✅ 建议:3 节点 ZooKeeper 或 ClickHouse Keeper
🛠️ 四、集群配置详解(以 2 分片 × 2 副本为例)
1. 配置文件:config.xml
在每个 ClickHouse 节点的 config.xml 中添加集群定义:
<clickhouse>
<!-- 集群定义 -->
<remote_servers>
<analytics_cluster>
<!-- 分片 1 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
<!-- 分片 2 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>node3</host>
<port>9000</port>
</replica>
<replica>
<host>node4</host>
<port>9000</port>
</replica>
</shard>
</analytics_cluster>
</remote_servers>
<!-- ClickHouse Keeper(替代 ZooKeeper) -->
<clickhouse_keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id> <!-- 每节点不同 -->
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>node1</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>node2</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>node3</hostname>
<port>9444</port>
</server>
</raft_configuration>
</clickhouse_keeper_server>
<!-- 其他通用配置 -->
<zookeeper>
<node>
<host>keeper1</host>
<port>2181</port>
</node>
</zookeeper>
</clickhouse>
🔁 注意:
- 所有节点使用相同的
remote_servers配置server_id在每个 Keeper 节点上必须唯一- 如果使用外部 ZooKeeper,注释掉
clickhouse_keeper_server
2. 创建复制表(在每个节点执行)
CREATE TABLE user_log_local (
user_id UInt32,
event_date Date,
action String,
duration UInt32
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/user_log', -- ZooKeeper 路径
'{replica}' -- 副本标识(自动替换为主机名)
)
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, user_id);
✅
{shard}和{replica}会自动替换为集群配置中的值。
3. 创建分布式表(用于查询)
CREATE TABLE user_log_all ON CLUSTER 'analytics_cluster'
ENGINE = Distributed(
'analytics_cluster', -- 集群名
'default', -- 数据库名
'user_log_local', -- 本地表名
rand() -- 分片键(可替换为 user_id 哈希)
);
✅ 查询
user_log_all会自动路由到所有分片的副本。
📦 五、部署流程(实战步骤)
步骤 1:准备所有节点
- 安装 ClickHouse(参考前文快速安装)
- 配置
/etc/clickhouse-server/config.xml - 确保节点间网络互通(9000、9009、9181、9444 等端口开放)
步骤 2:启动 ClickHouse Keeper(或 ZooKeeper)
- 在 3 个节点上启动 ClickHouse Keeper
- 或独立部署 ZooKeeper 集群
步骤 3:启动 ClickHouse Server
sudo service clickhouse-server start
步骤 4:创建表
- 在任意节点执行
CREATE TABLE user_log_local(会自动在所有节点创建) - 执行
CREATE TABLE user_log_all(分布式表)
步骤 5:写入与查询测试
-- 写入(可写任意副本)
INSERT INTO user_log_all VALUES (1001, '2024-04-01', 'click', 30);
-- 查询(自动聚合所有分片)
SELECT event_date, action, COUNT(*) FROM user_log_all GROUP BY event_date, action;
📊 六、集群管理与监控
1. 查看集群配置
SELECT * FROM system.clusters WHERE cluster = 'analytics_cluster';
2. 监控复制状态
SELECT
table,
is_leader,
queue_size,
absolute_delay
FROM system.replicas
WHERE database = 'default';
3. 查看分布式查询状态
SELECT * FROM system.distributed_queues;
4. 常用监控指标
| 指标 | 查询 |
|---|---|
| 副本延迟 | absolute_delay |
| 同步队列积压 | queue_size |
| 查询延迟 | system.query_log |
| 资源使用 | system.metrics, system.asynchronous_metrics |
⚠️ 七、常见问题与最佳实践
常见问题
| 问题 | 解决方案 |
|---|---|
| 数据未同步 | 检查 ZooKeeper/Keeper 连接、网络、表路径 |
| 写入性能低 | 检查磁盘 I/O、合并队列、分片策略 |
| 查询慢 | 检查分区裁剪、主键设计、是否走分布式表 |
| 脑裂 | 确保 Keeper 集群多数节点存活 |
最佳实践
| 项目 | 推荐做法 |
|---|---|
| 分片键 | 使用 user_id, city_hash 等均匀分布字段 |
| 副本数 | 2 副本(平衡成本与可用性) |
| 写入 | 写 Distributed 表,由其路由到分片 |
| 查询 | 优先查 Distributed 表,或直连本地表 |
| 备份 | 使用 ALTER TABLE ... FREEZE 或 clickhouse-backup 工具 |
| 升级 | 滚动升级,先升级非 Leader 副本 |
🎯 八、总结:ClickHouse 集群的核心价值
| 能力 | 说明 |
|---|---|
| 📈 水平扩展 | 分片支持 PB 级数据 |
| 🛡️ 高可用 | 副本防止单点故障 |
| 🔄 自动同步 | 数据一致性由 Keeper 协调 |
| 🚀 高性能查询 | 分布式并行执行 |
| 🧩 灵活架构 | 支持多种分片和复制策略 |
🎯 ClickHouse 集群 = 分片(Sharding) + 复制(Replication) + 分布式查询(Distributed Engine)
794

被折叠的 条评论
为什么被折叠?



