服务器配置
💻 服务器配置参考(每台)
| 硬件资源 | 最小可运行 | 开发/测试 (可用) | 推荐配置 (生产环境) |
|---|---|---|---|
| CPU | 2 核,支持 SSE 4.2 | 4 核 | 16 核或以上 |
| 内存 | 4 GB | 8 GB | 64 GB 或以上 |
| 磁盘 | 20 GB SSD | 50 GB+ SSD | NVMe SSD 或高性能云盘 |
| 网络 | 1 Gbit/s | 1 Gbit/s | 10 Gbit/s |
说明:
- 4GB 内存可以完成 ClickHouse 的安装、启动和基础功能验证,但仅限功能验证,无法承载任何数据加载或查询负载。
- 8GB 内存可满足开发测试和小规模数据加载,但需对默认配置进行调优(降低缓存、减少并行度等)。
- 生产环境磁盘容量需根据数据量和保留策略规划,建议内存与存储空间比例 1:100 ~ 1:130。
- 如果每台服务器运行 2 个 ClickHouse 实例,内存需按实例数累加。
🦒 ZooKeeper / ClickHouse Keeper 配置参考
| 硬件资源 | 最小可运行 | 开发/测试 | 推荐配置 (生产环境) |
|---|---|---|---|
| CPU | 1 核 | 2 核 | 4 核或以上 |
| 内存 | 1 GB | 4 GB | 8 GB 或以上 |
| 磁盘 | 10 GB HDD | 20 GB SSD | NVMe 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.6 server01 ZooKeeper (myid=1), ch-main, ch-sub (副本) 192.168.50.157 server02 ZooKeeper (myid=2), ch-main, ch-sub (副本) 192.168.50.110 server03 ZooKeeper (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/conf 和 sub/conf 中创建metrika.xml 。
vi /usr/soft/clickhouse-server/main/conf/metrika.xml
vi /usr/soft/clickhouse-server/sub/conf/metrika.xml
除了 <macros> 节点外,其余内容完全一致。下面列出 所有实例的 macros 值:
| 服务器 | 实例 | layer | shard | replica |
|---|---|---|---|---|
| server01 | ch-main | 01 | 01 | cluster01-01-1 |
| server01 | ch-sub | 01 | 02 | cluster01-02-2 |
| server02 | ch-main | 01 | 02 | cluster01-02-1 |
| server02 | ch-sub | 01 | 03 | cluster01-03-2 |
| server03 | ch-main | 01 | 03 | cluster01-03-1 |
| server03 | ch-sub | 01 | 01 | cluster01-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. 启动集群
- 确保
/etc/hosts已配置三台服务器的 IP 和主机名(与extra_hosts一致)。 - 进入 Compose 文件所在目录,执行:
cd /usr/soft/
docker-compose up -d
- 检查状态:
docker-compose ps
- 进入任意 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

420

被折叠的 条评论
为什么被折叠?



