本文档将指导您在 2 台服务器上手动搭建一个高可用的 ClickHouse 单分片、双副本集群,并集成 ClickHouse Keeper 作为协调服务。我们将涵盖从系统准备、软件安装、详细配置、参数优化到最终验证的完整流程。
1. 集群规划与架构
-
集群模式:单分片(Shard 1)、双副本(Replica 2)
-
服务器:
-
172.21.204.200(副本 1 + Keeper 节点 1) -
172.21.204.201(副本 2 + Keeper 节点 2)
-
-
协调服务:ClickHouse Keeper (集成于 clickhouse-server 内)
-
网络访问:开启
0.0.0.0监听,支持跨节点与远程访问
2. 系统环境准备
2.1. 设置主机名与 hosts 解析(两台服务器)
# 在 172.21.204.200 上执行
sudo hostnamectl set-hostname zb-yunweitest-mysql-204-200
sudo vim /etc/hosts
在 /etc/hosts 文件中添加:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
172.21.204.200 zb-yunweitest-mysql-204-200
172.21.204.201 zb-yunweitest-mysql-204-201
# 在 172.21.204.201 上执行
sudo hostnamectl set-hostname zb-yunweitest-mysql-204-201
# 编辑 /etc/hosts,添加相同内容
2.2. 关闭 SELinux(可选,生产环境请按需配置)
# 临时关闭
sudo setenforce 0
# 永久关闭(需要重启)
sudo vim /etc/selinux/config
# 修改为:SELINUX=disabled
2.3. 配置防火墙规则
# 在两台服务器上执行
# 开放 ClickHouse 及 Keeper 所需端口
sudo firewall-cmd --permanent --add-port=9000/tcp # ClickHouse TCP 端口
sudo firewall-cmd --permanent --add-port=8123/tcp # ClickHouse HTTP 端口
sudo firewall-cmd --permanent --add-port=9009/tcp # ClickHouse 内部通信端口
sudo firewall-cmd --permanent --add-port=9181/tcp # Keeper 客户端端口
sudo firewall-cmd --permanent --add-port=9234/tcp # Keeper 内部通信端口
sudo firewall-cmd --reload
# 查看已开放端口
sudo firewall-cmd --list-all
2.4. 系统参数优化
# 调整文件描述符限制
echo "fs.file-max = 1000000" | sudo tee -a /etc/sysctl.conf
echo "vm.max_map_count = 262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 为 clickhouse 用户设置资源限制
sudo vim /etc/security/limits.d/clickhouse.conf
添加以下内容:
clickhouse soft nofile 262144
clickhouse hard nofile 262144
clickhouse soft nproc 131072
clickhouse hard nproc 131072
3. ClickHouse 软件安装
3.1. 下载安装包
请确保在两台服务器上准备好以下 RPM 包:
-
clickhouse-common-static-*.x86_64.rpm -
clickhouse-server-*.x86_64.rpm -
clickhouse-client-*.x86_64.rpm
注意:从 ClickHouse v23.8+ 开始,
clickhouse-server已包含 Keeper 功能,无需单独安装clickhouse-keeper包。
3.2. 安装 ClickHouse
# 在两台服务器上执行
cd /path/to/clickhouse-packages/
# 按顺序安装
sudo rpm -ivh clickhouse-common-static-*.x86_64.rpm
sudo rpm -ivh clickhouse-server-*.x86_64.rpm
sudo rpm -ivh clickhouse-client-*.x86_64.rpm
安装过程中会提示设置 default 用户密码,直接回车设置为空密码。
3.3. 创建必要目录并设置权限
# 创建 Keeper 数据目录
sudo mkdir -p /var/lib/clickhouse/coordination/{log,snapshots}
# 调整数据目录(如果使用自定义路径,比如 /data/clickhouse/)
sudo mkdir -p /data/clickhouse/
sudo chown -R clickhouse:clickhouse /data/clickhouse/
# 设置目录权限
sudo chown -R clickhouse:clickhouse /var/lib/clickhouse/
sudo chmod -R 755 /var/lib/clickhouse/
4. ClickHouse 服务配置
4.1. 主配置文件 /etc/clickhouse-server/config.xml
这是最关键的部分,确保 Keeper 和 ClickHouse 都监听 0.0.0.0:
<?xml version="1.0"?>
<clickhouse>
<!-- ========== 日志配置 ========== -->
<logger>
<level>information</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>
<!-- ========== 网络监听配置 ========== -->
<!-- 关键:开启 0.0.0.0 监听,支持远程访问 -->
<listen_host>0.0.0.0</listen_host>
<listen_host>::</listen_host>
<!-- 注释掉默认的本地监听 -->
<!-- <listen_host>::1</listen_host> -->
<!-- <listen_host>127.0.0.1</listen_host> -->
<!-- 服务器间通信的主机名 -->
<interserver_http_host>172.21.204.200</interserver_http_host>
<!-- 注意:在 201 服务器上改为 172.21.204.201 -->
<!-- ========== 端口配置 ========== -->
<tcp_port>9000</tcp_port>
<http_port>8123</http_port>
<mysql_port>9004</mysql_port>
<postgresql_port>9005</postgresql_port>
<interserver_http_port>9009</interserver_http_port>
<!-- ========== Keeper 配置 ========== -->
<!-- 关键:Keeper 也必须监听 0.0.0.0 -->
<keeper_server>
<tcp_port>9181</tcp_port>
<!-- 关键:Keeper 监听所有网络接口 -->
<listen_host>0.0.0.0</listen_host>
<listen_host>::</listen_host>
<!-- 服务器ID,每台必须唯一 -->
<server_id>1</server_id>
<!-- 注意:在 201 服务器上改为 <server_id>2</server_id> -->
<!-- 日志存储路径 -->
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<!-- Raft 配置 - 定义两个 Keeper 节点 -->
<raft_configuration>
<server>
<id>1</id>
<hostname>172.21.204.200</hostname>
<port>9234</port>
</server>
<server>
<id>2</id>
<hostname>172.21.204.201</hostname>
<port>9234