You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨地域ClickHouse集群配置咨询:9节点5分片3副本部署方案

多地域ClickHouse集群配置方案(5 Shard × 3 Replica,9节点跨DC部署)

核心结论

不需要为不同数据中心设置不同集群名称,所有节点共用同一个集群配置,核心依赖跨地域ZooKeeper集群实现跨DC的副本状态同步与元数据协调。


一、节点分布规划

因5个Shard × 3个Replica共需15个Replica实例,而你只有9个节点,需让部分节点承担多个Shard的Replica(需确保节点资源充足,CPU/内存/磁盘能承载多Replica负载)。示例分布如下:

  • DC1:5个节点(dc1-node-1 ~ dc1-node-5),每个节点作为1个Shard的主Replica,同时其中4个节点各额外承担1个其他Shard的Replica
  • DC2:4个节点(dc2-node-1 ~ dc2-node-4),每个节点承担1-2个Shard的Replica

二、跨地域ZooKeeper配置

ClickHouse副本完全依赖ZK做协调,必须搭建跨DC的ZK集群(建议奇数节点,避免脑裂)。

1. ZK集群部署建议

  • DC1部署2个ZK节点,DC2部署2个ZK节点,额外部署1个仲裁ZK节点(可选,或DC1部署3个,DC2部署2个,共5个节点)
  • 确保所有ClickHouse节点能访问所有ZK节点(打通跨DC网络端口2181)

2. ClickHouse节点的ZK配置(所有节点一致,写入/etc/clickhouse-server/config.xml)

<zookeeper>
    <node index="1">
        <host>dc1-zk-1</host>
        <port>2181</port>
    </node>
    <node index="2">
        <host>dc1-zk-2</host>
        <port>2181</port>
    </node>
    <node index="3">
        <host>dc2-zk-1</host>
        <port>2181</port>
    </node>
    <node index="4">
        <host>dc2-zk-2</host>
        <port>2181</port>
    </node>
    <node index="5">
        <host>arbiter-zk</host>
        <port>2181</port>
    </node>
</zookeeper>

三、ClickHouse集群配置(所有节点一致,写入/etc/clickhouse-server/config.d/clusters.xml)

<yandex>
    <clickhouse_remote_servers>
        <multi_dc_cluster> <!-- 所有节点共用同一个集群名称 -->
            <!-- Shard 1 -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>dc1-node-1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc2-node-1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc1-node-2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
            </shard>

            <!-- Shard 2 -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>dc1-node-2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc2-node-2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc1-node-3</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
            </shard>

            <!-- Shard 3 -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>dc1-node-3</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc2-node-3</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc1-node-4</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
            </shard>

            <!-- Shard 4 -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>dc1-node-4</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc2-node-4</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc1-node-5</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
            </shard>

            <!-- Shard 5 -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>dc1-node-5</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc2-node-1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
                <replica>
                    <host>dc1-node-1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>your_secure_password</password>
                </replica>
            </shard>
        </multi_dc_cluster>
    </clickhouse_remote_servers>
</yandex>

四、关键配置说明

  1. internal_replication: true:开启Shard内自动副本读写负载均衡,无需客户端处理
  2. 跨DC网络优化:因跨DC延迟高,可在config.xml中添加以下参数:
    <distributed_ddl>
        <max_replica_delay_to_serve>30</max_replica_delay_to_serve> <!-- 延迟超过30秒的副本不参与查询 -->
    </distributed_ddl>
    
  3. 节点复用注意事项:若一个节点承担多个Shard的Replica,需监控节点资源使用率,避免IO/CPU瓶颈

五、验证步骤

  1. 启动所有ClickHouse节点后,执行SELECT * FROM system.replicas查看副本状态,确保所有Replica都处于Active状态
  2. 创建分布式表测试:
    CREATE TABLE test_local ON CLUSTER multi_dc_cluster
    (id UInt64, name String)
    ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
    ORDER BY id;
    
    CREATE TABLE test_distributed ON CLUSTER multi_dc_cluster
    AS test_local
    ENGINE = Distributed(multi_dc_cluster, default, test_local, id);
    
  3. 写入数据后,跨DC节点查询验证数据同步

内容的提问来源于stack exchange,提问作者Ananth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:16:09