linux环境docker-compose部署Clickhouse 集群

服务器配置

💻 服务器配置参考(每台)

硬件资源最小可运行开发/测试 (可用)推荐配置 (生产环境)
CPU2 核,支持 SSE 4.24 核16 核或以上
内存4 GB8 GB64 GB 或以上
磁盘20 GB SSD50 GB+ SSDNVMe SSD 或高性能云盘
网络1 Gbit/s1 Gbit/s10 Gbit/s

说明

  • 4GB 内存可以完成 ClickHouse 的安装、启动和基础功能验证,但仅限功能验证,无法承载任何数据加载或查询负载。
  • 8GB 内存可满足开发测试和小规模数据加载,但需对默认配置进行调优(降低缓存、减少并行度等)。
  • 生产环境磁盘容量需根据数据量和保留策略规划,建议内存与存储空间比例 1:100 ~ 1:130
  • 如果每台服务器运行 2 个 ClickHouse 实例,内存需按实例数累加。

🦒 ZooKeeper / ClickHouse Keeper 配置参考

硬件资源最小可运行开发/测试推荐配置 (生产环境)
CPU1 核2 核4 核或以上
内存1 GB4 GB8 GB 或以上
磁盘10 GB HDD20 GB SSDNVMe SSD
实例数1 个1 个3 个

注意:如果资源充足,强烈建议将 ZooKeeper / ClickHouse Keeper 部署在独立的服务器上,与 ClickHouse 数据节点分离,避免资源竞争。

💎 总结

  • 最小可运行:4GB 内存即可安装启动,适合做功能验证和"能不能跑起来"的测试。
  • 开发/测试:8GB 内存可以执行简单查询和小规模数据加载。
  • 生产环境:建议 64GB 以上内存,具体规格需根据数据量、查询复杂度和并发量综合评估。

准备工作

每台服务器运行 2 个 ClickHouse 实例 + 1 个 ZooKeeper 节点,使用 host 网络模式
在每台服务器上配置host:

cat >> /etc/hosts << EOF
192.168.50.6 server01
192.168.50.157 server02
192.168.50.110 server03
EOF

1. 整体设计

  • 服务器规划(与原文一致)

    IP主机名服务
    192.168.50.6server01ZooKeeper (myid=1), ch-main, ch-sub (副本)
    192.168.50.157server02ZooKeeper (myid=2), ch-main, ch-sub (副本)
    192.168.50.110server03ZooKeeper (myid=3), ch-main, ch-sub (副本)
  • 网络模式:全部使用 host,避免端口映射和跨容器通信问题。


2. 前置准备(每台服务器)

2.1 创建目录结构

mkdir -p /usr/soft/zookeeper/{data,datalog,logs,conf}
mkdir -p /usr/soft/clickhouse-server/{main,sub}/{data,conf,log}
# 任何用户都能写入
chmod -R 777 /usr/soft/clickhouse-server/main/{data,log}
chmod -R 777 /usr/soft/clickhouse-server/sub/{data,log}

2.2 准备 ZooKeeper 配置文件

每台服务器/usr/soft/zookeeper/conf/zoo.cfg 中写入相同内容(注意 IP 改为您实际环境):

dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60

server.1=192.168.50.6:2888:3888
server.2=192.168.50.157:2888:3888
server.3=192.168.50.110:2888:3888

2.3 准备 ClickHouse 配置文件

(1) 获取基础配置(任选一台执行)
docker run --rm -d --name=temp-ch docker.1ms.run/clickhouse/clickhouse-server:26.4
docker cp temp-ch:/etc/clickhouse-server/ /etc/
docker rm -f temp-ch

然后将 /etc/clickhouse-server 复制到 /usr/soft/clickhouse-server/main/conf/usr/soft/clickhouse-server/sub/conf

# 复制配置到 main
cp -r /etc/clickhouse-server/* /usr/soft/clickhouse-server/main/conf/
# 复制配置到 sub
cp -r /etc/clickhouse-server/* /usr/soft/clickhouse-server/sub/conf/

# 将配置分发到 server02 和 server03或者手动复制
scp -r /usr/soft/clickhouse-server/main/ server02:/usr/soft/clickhouse-server/main/
scp -r /usr/soft/clickhouse-server/main/ server03:/usr/soft/clickhouse-server/main/
scp -r /usr/soft/clickhouse-server/sub/ server02:/usr/soft/clickhouse-server/sub/
scp -r /usr/soft/clickhouse-server/sub/ server03:/usr/soft/clickhouse-server/sub/
(2) 修改 config.xml

/usr/soft/clickhouse-server/main/conf/config.xml 中添加或修改以下内容(其他保持默认):

<listen_host>0.0.0.0</listen_host>
<timezone>Asia/Shanghai</timezone>
<!-- 删除原有 <remote_servers> 节点,并添加以下配置(与 <remote_servers> 同级) -->
<remote_servers incl="clickhouse_remote_servers" />
<include_from>/etc/clickhouse-server/metrika.xml</include_from>
<zookeeper incl="zookeeper-servers" optional="true" />
<macros incl="macros" optional="true" />

默认配置中可能还有 <listen_host>::</listen_host>(IPv6)或其他 listen_host 节点。建议:只保留一个 <listen_host>0.0.0.0</listen_host>,将其他的都注释掉或删除,避免配置冲突。

  • Sub 实例需额外修改端口(避免与 Main 冲突):
    /usr/soft/clickhouse-server/sub/conf/config.xml 中除了上述修改外,还需将端口改为:
 <!-- 改为未被占用的端口 -->
<http_port>8124</http_port>
<tcp_port>9001</tcp_port>
<mysql_port>9005</mysql_port>
<postgresql_port>9006</postgresql_port>  
<interserver_http_port>9010</interserver_http_port>
(3) 创建 metrika.xml

main/confsub/conf 中创建metrika.xml

vi /usr/soft/clickhouse-server/main/conf/metrika.xml
vi /usr/soft/clickhouse-server/sub/conf/metrika.xml

除了 <macros> 节点外,其余内容完全一致。下面列出 所有实例的 macros 值

服务器实例layershardreplica
server01ch-main0101cluster01-01-1
server01ch-sub0102cluster01-02-2
server02ch-main0102cluster01-02-1
server02ch-sub0103cluster01-03-2
server03ch-main0103cluster01-03-1
server03ch-sub0101cluster01-01-2

完整 metrika.xml 模板(除 macros 外相同,请复制到所有实例的配置目录):

<yandex>
    <clickhouse_remote_servers>
        <cluster_3s_1r>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>server01</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>server03</host>
                    <port>9001</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>server02</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>server01</host>
                    <port>9001</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>server03</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>server02</host>
                    <port>9001</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
        </cluster_3s_1r>
    </clickhouse_remote_servers>

    <zookeeper-servers>
        <node index="1">
            <host>192.168.50.6</host>   
            <port>2181</port>
        </node>
        <node index="2">
            <host>192.168.50.157</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>192.168.50.110</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>

    <macros>
        <layer>01</layer>
        <shard>01</shard>             <!-- 每个实例按上表修改 -->
        <replica>cluster01-01-1</replica>
    </macros>

    <networks>
        <ip>::/0</ip>
    </networks>

    <clickhouse_compression>
        <case>
            <min_part_size>10000000000</min_part_size>
            <min_part_size_ratio>0.01</min_part_size_ratio>
            <method>lz4</method>
        </case>
    </clickhouse_compression>
</yandex>
(4) 修改每个main和sub的 /conf/users.d/default-user.xml 配置

如果不设置密码:

<clickhouse>
  <!-- Docs: <https://clickhouse.com/docs/operations/settings/settings_users/> -->
  <users>
    <default>
      <!-- User default is available only locally -->
      <networks>
        <ip>::/0</ip>
      </networks>
    </default>
  </users>
</clickhouse>

如果设置密码:

<clickhouse>
  <users>
    <default>
      <password>你的密码</password> 
      <networks>
        <ip>::/0</ip>
      </networks>
    </default>
  </users>
</clickhouse>

如果设置密码,在每台服务器的 metrika.xml 中,为所有 配置相同的密码,例如123456:

 <clickhouse_remote_servers>
        <cluster_3s_1r>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>server01</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>server03</host>
                    <port>9001</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>server02</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>server01</host>
                    <port>9001</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>server03</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>server02</host>
                    <port>9001</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
        </cluster_3s_1r>
    </clickhouse_remote_servers>

3. 每台服务器的 docker-compose.yml

在每台服务器上创建 /usr/soft/docker-compose.yml(或任意位置),内容如下:

version: '3.8'

services:
  zookeeper:
    image: docker.1ms.run/library/zookeeper:3.9.5
    container_name: zookeeper_node
    network_mode: host
    restart: always
    environment:
      ZOO_MY_ID: ${ZOO_MY_ID}       # 通过 .env 文件注入
    volumes:
      - /usr/soft/zookeeper/data:/data
      - /usr/soft/zookeeper/datalog:/datalog
      - /usr/soft/zookeeper/logs:/logs
      - /usr/soft/zookeeper/conf:/conf

  ch-main:
    image: docker.1ms.run/clickhouse/clickhouse-server:26.4
    container_name: ch-main
    network_mode: host
    restart: always
    hostname: ${HOSTNAME}           # 必须与 /etc/hosts 中的名称一致
    extra_hosts:
      - "server01:192.168.50.6"
      - "server02:192.168.50.157"
      - "server03:192.168.50.110"
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    volumes:
      - /usr/soft/clickhouse-server/main/data:/var/lib/clickhouse:rw
      - /usr/soft/clickhouse-server/main/conf:/etc/clickhouse-server:rw
      - /usr/soft/clickhouse-server/main/log:/var/log/clickhouse-server:rw
    depends_on:
      - zookeeper

  ch-sub:
    image: docker.1ms.run/clickhouse/clickhouse-server:26.4
    container_name: ch-sub
    network_mode: host
    restart: always
    hostname: ${HOSTNAME}
    extra_hosts:
      - "server01:192.168.50.6"
      - "server02:192.168.50.157"
      - "server03:192.168.50.110"
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    volumes:
      - /usr/soft/clickhouse-server/sub/data:/var/lib/clickhouse:rw
      - /usr/soft/clickhouse-server/sub/conf:/etc/clickhouse-server:rw
      - /usr/soft/clickhouse-server/sub/log:/var/log/clickhouse-server:rw
    depends_on:
      - zookeeper

4. 环境变量文件(.env

在 /usr/soft/ 下创建 .env 文件,每台服务器内容不同
vi /usr/soft/.env
server01

ZOO_MY_ID=1
HOSTNAME=server01

server02

ZOO_MY_ID=2
HOSTNAME=server02

server03

ZOO_MY_ID=3
HOSTNAME=server03

5. 启动集群

  1. 确保 /etc/hosts 已配置三台服务器的 IP 和主机名(与 extra_hosts 一致)。
  2. 进入 Compose 文件所在目录,执行:
cd  /usr/soft/
docker-compose up -d
  1. 检查状态:
docker-compose ps
  1. 进入任意 ClickHouse 容器验证集群:
# 无密码
docker exec -it ch-main clickhouse-client 
# 已设置密码是123456
docker exec -it ch-main clickhouse-client --password 123456

6. 测试分布式表(示例)

在任一实例上执行(集群名称 cluster_3s_1r 需与 metrika.xml 一致):

CREATE TABLE test_new ON CLUSTER cluster_3s_1r
(
    id UInt32,
    name String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_new', '{replica}')
ORDER BY id;

# 创建分布式表(用于查询所有分片)
CREATE TABLE test_new_all ON CLUSTER cluster_3s_1r
AS test_new
ENGINE = Distributed(cluster_3s_1r, default, test_new, rand());

# 插入测试数据 在任意一个节点上执行
INSERT INTO test_new VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
# 查询分布式表(验证数据是否跨节点可见)期望结果应返回全部 3 行数据。
SELECT * FROM test_new_all ORDER BY id;
# 查询每个节点本地表,验证数据副本同步。分别在各个节点上执行,应都能看到全部数据。
 SELECT * FROM test_new

在这里插入图片描述

为方便参考各节点配置,已做分享:
夸克:
链接:https://pan.quark.cn/s/ac5aa6dcdbd6
提取码:uzMX
百度:
链接:https://pan.baidu.com/s/1v_9Ia85uF1INODvC2Aub9A?pwd=qe1m
提取码:qe1m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值