Docker 部署一个包含 3 个节点的 ClickHouse 集群:

提示:这里简单的ClickHouse集群部署流程(如有问题疑问,欢迎评论区留言学习和交流)


1. 创建网络:

首先创建一个 Docker 网络用于集群内部通信:

例如:

docker network create clickhouse-network

2. 创建配置文件目录:

为每个节点创建配置目录:

例如:

mkdir -p clickhouse/{node1,node2,node3}/{config,data,logs}

3. 配置集群配置文件:

为每个节点创建 config.xml 配置文件

例如:

  1. clickhouse/node1/config/config.xml:
<yandex>
    <logger>
        <level>trace</level>
        <log>/var/log/clickhouse-server/clickhouse-server.log</log>
        <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>10</count>
    </logger>
    
    <http_port>8123</http_port>
    <tcp_port>9000</tcp_port>
    <interserver_http_port>9009</interserver_http_port>
    
    <listen_host>0.0.0.0</listen_host>
    
    <path>/var/lib/clickhouse/</path>
    <tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
    <user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
    <access_control_path>/var/lib/clickhouse/access/</access_control_path>
    
    <users_config>users.xml</users_config>
    <default_profile>default</default_profile>
    <default_database>default</default_database>
    <mark_cache_size>5368709120</mark_cache_size>
    <mlock_executable>false</mlock_executable>
    
    <remote_servers>
        <cluster_3shards_1replicas>
            <shard>
                <replica>
                    <host>clickhouse-node1</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>clickhouse-node2</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>clickhouse-node3</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster_3shards_1replicas>
    </remote_servers>
    
    <zookeeper>
        <node>
            <host>zookeeper</host>
            <port>2181</port>
        </node>
    </zookeeper>
    
    <macros>
        <shard>1</shard>
        <replica>node1</replica>
    </macros>
    
    <distributed_ddl>
        <path>/clickhouse/task_queue/ddl</path>
    </distributed_ddl>
</yandex>
  1. clickhouse/node2/config/config.xml:
<yandex>
    <!-- 与 node1 相同的配置,仅修改 macros 部分 -->
    <macros>
        <shard>2</shard>
        <replica>node2</replica>
    </macros>
    <!-- 其余配置与 node1 相同 -->
</yandex>

  1. clickhouse/node3/config/config.xml:
<yandex>
    <!-- 与 node1 相同的配置,仅修改 macros 部分 -->
    <macros>
        <shard>3</shard>
        <replica>node3</replica>
    </macros>
    <!-- 其余配置与 node1 相同 -->
</yandex>

ndoe2、node3的config.xml可以复制node1的然后再修改,通过cp config.xml youpath/clickhouse/node3/config/

4. 创建 ZooKeeper 配置

创建 zookeeper 目录和配置文件:

mkdir -p zookeeper/data

zoo.cfg:
tickTime=2000
dataDir=/data
clientPort=2181
initLimit=5
syncLimit=2

5. 启动 ZooKeeper

docker run -d \
  --name zookeeper \
  --network clickhouse-network \
  --restart always \
  -v $(pwd)/zookeeper/data:/data \
  -v $(pwd)/zoo.cfg:/conf/zoo.cfg \
  zookeeper:3.7

6. 启动 ClickHouse 节点

  • 启动第一个节点:
docker run -d \
  --name clickhouse-node1 \
  --network clickhouse-network \
  --hostname clickhouse-node1 \
  --restart always \
  -p 9001:9000 \
  -p 8124:8123 \
  -v $(pwd)/clickhouse/node1/config/config.xml:/etc/clickhouse-server/config.xml \
  -v $(pwd)/clickhouse/node1/data:/var/lib/clickhouse \
  -v $(pwd)/clickhouse/node1/logs:/var/log/clickhouse-server \
  clickhouse/clickhouse-server:22.3
  • 启动第二个节点:

docker run -d \
  --name clickhouse-node2 \
  --network clickhouse-network \
  --hostname clickhouse-node2 \
  --restart always \
  -p 9002:9000 \
  -p 8125:8123 \
  -v $(pwd)/clickhouse/node2/config/config.xml:/etc/clickhouse-server/config.xml \
  -v $(pwd)/clickhouse/node2/data:/var/lib/clickhouse \
  -v $(pwd)/clickhouse/node2/logs:/var/log/clickhouse-server \
  clickhouse/clickhouse-server:22.3
  • 启动第三个节点:

docker run -d \
  --name clickhouse-node3 \
  --network clickhouse-network \
  --hostname clickhouse-node3 \
  --restart always \
  -p 9003:9000 \
  -p 8126:8123 \
  -v $(pwd)/clickhouse/node3/config/config.xml:/etc/clickhouse-server/config.xml \
  -v $(pwd)/clickhouse/node3/data:/var/lib/clickhouse \
  -v $(pwd)/clickhouse/node3/logs:/var/log/clickhouse-server \
  clickhouse/clickhouse-server:22.3

7. 验证集群状态

  1. 连接到任意一个节点检查集群状态:
docker exec -it clickhouse-node1 clickhouse-client
  1. 在 ClickHouse 客户端中执行:
SELECT * FROM system.clusters;

结果如图
在这里插入图片描述

8. 创建分布式表

在每个节点上创建本地表和分布式表:

-- 创建本地表
CREATE TABLE IF NOT EXISTS test_local ON CLUSTER cluster_3shards_1replicas (
    id UInt32,
    name String,
    created_at DateTime
) ENGINE = MergeTree()
ORDER BY (id);

-- 创建分布式表
CREATE TABLE IF NOT EXISTS test_distributed ON CLUSTER cluster_3shards_1replicas AS test_local
ENGINE = Distributed(cluster_3shards_1replicas, default, test_local, rand());

9. 测试集群功能

向分布式表插入数据:


INSERT INTO test_distributed (id, name, created_at) VALUES 
(1, 'Alice', now()),
(2, 'Bob', now()),
(3, 'Charlie', now());

查询数据:

SELECT * FROM test_distributed;

注意事项

  1. 数据持久化:确保正确挂载数据卷以防止数据丢失
  2. 网络通信:所有节点必须在同一个 Docker 网络中
  3. ZooKeeper:用于协调分布式 DDL 操作和副本同步
  4. 端口映射:避免端口冲突,每个节点使用不同的主机端口
  5. 配置一致性:确保所有节点的集群配置保持一致
  6. 版本兼容性:建议使用相同版本的 ClickHouse 镜像

这样就完成了 3 节点 ClickHouse 集群的部署。

更多推荐