【Docker 部署ClickHouse 集群】
·
文章目录
Docker 部署一个包含 3 个节点的 ClickHouse 集群:
提示:这里简单的ClickHouse集群部署流程(如有问题疑问,欢迎评论区留言学习和交流)
1. 创建网络:
首先创建一个 Docker 网络用于集群内部通信:
例如:
docker network create clickhouse-network
2. 创建配置文件目录:
为每个节点创建配置目录:
例如:
mkdir -p clickhouse/{node1,node2,node3}/{config,data,logs}
3. 配置集群配置文件:
为每个节点创建 config.xml 配置文件
例如:
- 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>
- clickhouse/node2/config/config.xml:
<yandex>
<!-- 与 node1 相同的配置,仅修改 macros 部分 -->
<macros>
<shard>2</shard>
<replica>node2</replica>
</macros>
<!-- 其余配置与 node1 相同 -->
</yandex>
- 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. 验证集群状态
- 连接到任意一个节点检查集群状态:
docker exec -it clickhouse-node1 clickhouse-client
- 在 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;
注意事项
- 数据持久化:确保正确挂载数据卷以防止数据丢失
- 网络通信:所有节点必须在同一个 Docker 网络中
- ZooKeeper:用于协调分布式 DDL 操作和副本同步
- 端口映射:避免端口冲突,每个节点使用不同的主机端口
- 配置一致性:确保所有节点的集群配置保持一致
- 版本兼容性:建议使用相同版本的 ClickHouse 镜像
这样就完成了 3 节点 ClickHouse 集群的部署。
更多推荐

所有评论(0)