ClickHouse 作为一款高性能的列式数据库管理系统,在处理大规模数据分析场景中表现卓越。本文将详细介绍如何搭建一个高可用的 ClickHouse 22.3 版本集群,包括环境准备、配置文件设置、集群初始化及验证等关键步骤。
一、环境准备
1.1 服务器规划
本次搭建示例采用 3 台服务器组成 ClickHouse 集群,每台服务器同时作为 ClickHouse 服务节点和 ZooKeeper 节点(实际生产环境建议分离部署):
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| ck-node1 | 192.168.1.101 | ClickHouse + ZooKeeper |
| ck-node2 | 192.168.1.102 | ClickHouse + ZooKeeper |
| ck-node3 | 192.168.1.103 | ClickHouse + ZooKeeper |
1.2 系统要求
- 操作系统:CentOS 7.x 或 Ubuntu 20.04 LTS
- 内存:至少 8GB RAM(生产环境建议 16GB+)
- 磁盘:SSD 或 HDD(建议使用 RAID 确保数据安全)
- 网络:所有节点间网络互通,关闭防火墙或开放必要端口
1.3 前置操作
在所有节点执行以下操作:
bash
# 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 配置主机名解析
cat >> /etc/hosts << EOF
192.168.1.101 ck-node1
192.168.1.102 ck-node2
192.168.1.103 ck-node3
EOF
# 安装依赖
yum install -y curl openssl-devel
二、安装 ZooKeeper 集群
ClickHouse 集群依赖 ZooKeeper 进行元数据管理和分布式协调,我们先搭建一个 3 节点的 ZooKeeper 集群。
2.1 安装 Java
ZooKeeper 需要 Java 环境:
bash
yum install -y java-1.8.0-openjdk-devel
java -version # 验证安装
2.2 安装 ZooKeeper
在所有节点执行:
bash
# 下载并解压ZooKeeper
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /opt/
ln -s /opt/apache-zookeeper-3.7.0-bin /opt/zookeeper
# 创建数据和日志目录
mkdir -p /data/zookeeper/data
mkdir -p /data/zookeeper/logs
# 创建myid文件(每个节点值不同)
# 在ck-node1上
echo 1 > /data/zookeeper/data/myid
# 在ck-node2上
echo 2 > /data/zookeeper/data/myid
# 在ck-node3上
echo 3 > /data/zookeeper/data/myid
2.3 配置 ZooKeeper
在所有节点创建配置文件:
bash
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
cat > /opt/zookeeper/conf/zoo.cfg << EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
server.1=ck-node1:2888:3888
server.2=ck-node2:2888:3888
server.3=ck-node3:2888:3888
EOF
2.4 启动 ZooKeeper
在所有节点执行:
bash
# 创建系统服务
cat > /etc/systemd/system/zookeeper.service << EOF
[Unit]
Description=Apache ZooKeeper Server
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
ExecReload=/opt/zookeeper/bin/zkServer.sh restart
User=root
Group=root
[Install]
WantedBy=multi-user.target
EOF
# 启动并设置开机自启
systemctl daemon-reload
systemctl start zookeeper
systemctl enable zookeeper
# 查看状态(应分别显示leader和follower)
/opt/zookeeper/bin/zkServer.sh status
三、安装 ClickHouse 22.X
3.1 添加 ClickHouse 仓库
在所有节点执行:
bash
# 添加官方仓库
yum install -y yum-utils
rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
yum-config-manager --add-repo https://repo.clickhouse.tech/rpms/stable/x86_64
3.2 安装指定版本
bash
# 查看可用版本
yum list 'clickhouse*' --showduplicates | grep 22.
# 安装22.3版本(示例)
yum install -y clickhouse-server-22.3.15.32 clickhouse-client-22.3.15.32
3.3 初始配置
在所有节点执行:
bash
# 创建数据和日志目录
mkdir -p /data/clickhouse/data
mkdir -p /data/clickhouse/logs
chown -R clickhouse:clickhouse /data/clickhouse
# 备份默认配置
mv /etc/clickhouse-server/config.xml /etc/clickhouse-server/config.xml.bak
mv /etc/clickhouse-server/users.xml /etc/clickhouse-server/users.xml.bak
四、配置 ClickHouse 集群
4.1 配置 config.xml
在所有节点创建新的配置文件 /etc/clickhouse-server/config.xml:
xml
<?xml version="1.0"?>
<yandex>
<!-- 日志和数据存储路径 -->
<path>/data/clickhouse/</path>
<tmp_path>/data/clickhouse/tmp/</tmp_path>
<user_files_path>/data/clickhouse/user_files/</user_files_path>
<log>/data/clickhouse/logs/clickhouse-server.log</log>
<errorlog>/data/clickhouse/logs/clickhouse-server.err.log</errorlog>
<!-- 网络配置 -->
<listen_host>::</listen_host>
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<interserver_http_port>9009</interserver_http_port>
<!-- 集群配置 -->
<remote_servers>
<clickhouse_cluster>
<!-- 分片1 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck-node1</host>
<port>9000</port>
</replica>
</shard>
<!-- 分片2 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck-node2</host>
<port>9000</port>
</replica>
</shard>
<!-- 分片3 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck-node3</host>
<port>9000</port>
</replica>
</shard>
</clickhouse_cluster>
</remote_servers>
<!-- ZooKeeper配置 -->
<zookeeper>
<node index="1">
<host>ck-node1</host>
<port>2181</port>
</node>
<node index="2">
<host>ck-node2</host>
<port>2181</port>
</node>
<node index="3">
<host>ck-node3</host>
<port>2181</port>
</node>
</zookeeper>
<!-- 宏定义 - 每个节点不同 -->
<macros>
<shard>01</shard> <!-- 节点1设为01,节点2设为02,节点3设为03 -->
<replica>ck-node1</replica> <!-- 对应节点主机名 -->
</macros>
<!-- 其他默认配置 -->
<max_connections>4096</max_connections>
<keep_alive_timeout>3</keep_alive_timeout>
<max_concurrent_queries>100</max_concurrent_queries>
<uncompressed_cache_size>8589934592</uncompressed_cache_size>
<mark_cache_size>5368709120</mark_cache_size>
</yandex>
注意:每个节点的 <macros> 部分需要修改为对应的值:
- ck-node1:
<shard>01</shard><replica>ck-node1</replica> - ck-node2:
<shard>02</shard><replica>ck-node2</replica> - ck-node3:
<shard>03</shard><replica>ck-node3</replica>
4.2 配置 users.xml
在所有节点创建 /etc/clickhouse-server/users.xml:
xml
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<max_memory_usage>10000000000</max_memory_usage>
<use_uncompressed_cache>0</use_uncompressed_cache>
<load_balancing>random</load_balancing>
</default>
<readonly>
<readonly>1</readonly>
</readonly>
</profiles>
<users>
<default>
<password></password> <!-- 生产环境建议设置密码 -->
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
</users>
<quotas>
<default>
<interval>
<duration>3600</duration>
<queries>0</queries>
<errors>0</errors>
<result_rows>0</result_rows>
<read_rows>0</read_rows>
<execution_time>0</execution_time>
</interval>
</default>
</quotas>
</yandex>
五、启动 ClickHouse 集群
在所有节点执行:
bash
# 修改目录权限
chown -R clickhouse:clickhouse /etc/clickhouse-server/
chown -R clickhouse:clickhouse /data/clickhouse/
# 启动服务
systemctl start clickhouse-server
systemctl enable clickhouse-server
# 查看状态
systemctl status clickhouse-server
六、验证集群配置
6.1 连接到 ClickHouse
bash
clickhouse-client --host ck-node1
6.2 查看集群状态
sql
SELECT * FROM system.clusters;
该命令应显示我们配置的 clickhouse_cluster 及所有节点信息。
6.3 创建分布式表测试
sql
-- 创建本地表
CREATE TABLE default.test_local ON CLUSTER clickhouse_cluster (
id Int32,
name String,
create_time DateTime
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
ORDER BY id;
-- 创建分布式表
CREATE TABLE default.test_distributed ON CLUSTER clickhouse_cluster (
id Int32,
name String,
create_time DateTime
) ENGINE = Distributed(clickhouse_cluster, default, test_local, rand());
6.4 插入测试数据
sql
-- 插入测试数据
INSERT INTO default.test_distributed (id, name, create_time)
VALUES
(1, 'test1', now()),
(2, 'test2', now()),
(3, 'test3', now());
-- 查询数据
SELECT * FROM default.test_distributed;
-- 查看各节点数据分布
SELECT
hostName() AS node,
count(*) AS cnt
FROM default.test_local
GROUP BY node;
七、常见问题及解决方案
-
服务启动失败:
- 检查日志文件
/data/clickhouse/logs/clickhouse-server.err.log - 确认 ZooKeeper 集群正常运行
- 检查目录权限是否正确
- 检查日志文件
-
集群节点无法通信:
- 确认防火墙已关闭或相关端口已开放
- 检查
/etc/hosts配置是否正确 - 验证节点间网络连通性
-
分布式表创建失败:
- 检查 ZooKeeper 连接配置
- 确认所有节点 ClickHouse 服务正常运行
- 检查集群名称是否一致
八、生产环境建议
-
硬件配置:
- 使用高性能 CPU 和足够的内存
- 采用 SSD 存储提升查询性能
- 配置冗余电源和 RAID 阵列
-
安全加固:
- 为 ClickHouse 设置强密码
- 限制网络访问,只开放必要端口
- 定期备份数据
-
监控与维护:
- 部署 Prometheus + Grafana 监控集群
- 配置日志轮转防止磁盘占满
- 定期执行 OPTIMIZE 操作优化表性能
-
高可用设计:
- 每个分片至少配置 2 个副本
- 考虑使用负载均衡器分发查询请求
- 部署 ZooKeeper 独立集群并配置监控
1680

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



