ClickHouse 集群部署 详解

该文章已生成可运行项目,

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 ... FREEZEclickhouse-backup 工具
升级滚动升级,先升级非 Leader 副本

🎯 八、总结:ClickHouse 集群的核心价值

能力说明
📈 水平扩展分片支持 PB 级数据
🛡️ 高可用副本防止单点故障
🔄 自动同步数据一致性由 Keeper 协调
🚀 高性能查询分布式并行执行
🧩 灵活架构支持多种分片和复制策略

🎯 ClickHouse 集群 = 分片(Sharding) + 复制(Replication) + 分布式查询(Distributed Engine)

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值