ClickHouseNotes

第 02 章:环境搭建

zjc 于 2026-01-02 发布

这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 ClickHouse 的环境搭建并不复杂,难的是把开发、测试、生产三种环境的资源边界和配置差异想清楚。本章从单机版开始,再到 Docker 和多节点集群,并给出常用配置与验证方法。

2.1 版本选择

ClickHouse 版本迭代较快,建议选择当前官方推荐的稳定版本,并在生产环境固定版本。不要把长期未升级的集群直接跨大版本升级。

查看版本:

SELECT version();

版本选择建议:

环境 建议
本地学习 官方稳定版或 Docker 最新稳定镜像
功能验证 与生产同一大版本
生产 固定版本、灰度升级、回滚方案完备

生产升级前至少确认:

  1. 兼容性列表;
  2. 表引擎和 SQL 行为差异;
  3. 元数据存储格式变化;
  4. Keeper 或 ZooKeeper 版本;
  5. 客户端和 JDBC、ODBC 驱动版本。

2.2 使用 Docker 启动单节点

适合学习和快速验证:

docker run -d \
  --name clickhouse-server \
  -p 8123:8123 \
  -p 9000:9000 \
  -e ULIMIT_NOFILE=262144:262144 \
  clickhouse/clickhouse-server:24.8

进入容器:

docker exec -it clickhouse-server clickhouse-client

HTTP 验证:

curl 'http://127.0.0.1:8123/?query=SELECT%201'

常见端口:

端口 协议 用途
8123 HTTP HTTP API、健康检查
9000 Native clickhouse-client、高吞吐写入
9440 Native TLS 加密原生协议
8443 HTTP TLS 加密 HTTP
9181 Keeper Raft 通信,集群使用

2.3 Linux 单机安装

以 Debian、Ubuntu 系为例,官方文档提供安装脚本。生产环境建议使用内部制品库或镜像源,避免构建机直接依赖外网。

安装后确认服务:

sudo systemctl status clickhouse-server
sudo systemctl enable clickhouse-server

启动和停止:

sudo systemctl start clickhouse-server
sudo systemctl stop clickhouse-server

连接:

clickhouse-client --host 127.0.0.1 --port 9000 --user default

2.4 目录结构

默认目录可能因安装方式不同而变化,常见位置如下:

/etc/clickhouse-server/config.xml        服务配置
/etc/clickhouse-server/users.xml          用户配置
/var/lib/clickhouse/                      数据目录
/var/log/clickhouse-server/               日志目录

生产环境必须独立规划数据盘:

/data01/clickhouse/
/data02/clickhouse/
/data03/clickhouse/

多磁盘配置要结合存储策略使用,不要只是简单挂载后不声明策略。

2.5 核心配置

服务主配置通常是 config.xml,用户相关配置在 users.xml 或用户目录中。推荐使用独立配置文件减少主文件冲突,例如:

/etc/clickhouse-server/config.d/logging.xml
/etc/clickhouse-server/config.d/storage.xml
/etc/clickhouse-server/users.d/app_user.xml

资源限制示例:

<clickhouse>
    <max_server_memory_usage>0</max_server_memory_usage>
    <max_thread_pool_size>10000</max_thread_pool_size>
</clickhouse>

用户配额示例:

<clickhouse>
    <profiles>
        <app_profile>
            <max_memory_usage>4294967296</max_memory_usage>
            <max_execution_time>60</max_execution_time>
        </app_profile>
    </profiles>
</clickhouse>

更推荐使用 SQL 方式创建用户和角色:

CREATE ROLE app_reader;
GRANT SELECT ON analytics.* TO app_reader;

CREATE USER app_user IDENTIFIED BY 'strong-password'
SETTINGS PROFILE app_profile;
GRANT app_reader TO app_user;

2.6 命令行客户端

执行 SQL 文件:

clickhouse-client --multiquery < schema.sql

指定格式输出:

clickhouse-client --query "SELECT number FROM system.numbers LIMIT 3 FORMAT PrettyCompact"

常用格式:

格式 场景
PrettyCompact 人工查看
TabSeparated 管道处理
CSV / CSVWithNames 表格交换
JSONEachRow 应用写入
Parquet 外部数据交换

写入数据:

clickhouse-client --query "
INSERT INTO target_table FORMAT CSVWithNames
" < data.csv

2.7 搭建三节点测试集群

测试集群至少包含:

2 个 ClickHouse 分片副本混合部署,或 2 个 ClickHouse 节点
3 个 ClickHouse Keeper 节点

Keeper 负责副本元数据和分布式 DDL 协调。生产通常使用 3 个或 5 个节点,保证奇数多数派。

config.xml 中的远程服务器示例:

<clickhouse>
    <remote_servers>
        <analytics_cluster>
            <shard>
                <replica>
                    <host>ch-01.internal</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>ch-02.internal</host>
                    <port>9000</port>
                </replica>
            </shard>
        </analytics_cluster>
    </remote_servers>
</clickhouse>

查看集群:

SELECT * FROM system.clusters;

确认 Keeper:

echo ruok | nc keeper-01 9181

ClickHouse Keeper 使用四字命令时要以 telnet 或 TCP 工具发送,命令支持程度与版本有关。

2.8 数据库和表初始化

CREATE DATABASE IF NOT EXISTS analytics;

CREATE TABLE analytics.events_local
(
    event_date Date,
    event_time DateTime,
    event_id String,
    user_id UInt64,
    event_type LowCardinality(String),
    city_id UInt32,
    amount Decimal64(2)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_type, city_id, user_id);

插入测试数据:

INSERT INTO analytics.events_local
SELECT
    today() AS event_date,
    now() AS event_time,
    toString(number) AS event_id,
    number % 10000 AS user_id,
    if(number % 3 = 0, 'view', 'pay') AS event_type,
    number % 100 AS city_id,
    toDecimal64(number % 500, 2) AS amount
FROM system.numbers
LIMIT 100000;

验证:

SELECT event_type, count(), round(sum(amount), 2)
FROM analytics.events_local
GROUP BY event_type;

2.9 常见安装问题

连接被拒绝

排查顺序:

systemctl status clickhouse-server
ss -lntp | grep -E '8123|9000'
docker port clickhouse-server

常见原因:

  1. 服务未启动;
  2. 监听地址只绑定 127.0.0.1;
  3. 安全组或防火墙未放行;
  4. 客户端使用错协议端口;
  5. TLS 配置不匹配。

认证失败

确认用户名、密码和网络来源:

SELECT name, networks, auth_type
FROM system.users;

磁盘空间不足

SELECT
    name,
    path,
    free_space,
    total_space
FROM system.disks
ORDER BY free_space;

本章小结

单机环境适合学习 SQL 和 MergeTree;测试和生产环境要提前规划版本、端口、数据目录、用户权限、Keeper 集群和资源限制。ClickHouse 的性能高度依赖机器资源和配置边界,环境搭建阶段就应该把可观测性和回滚方案一并纳入。

思考题

  1. HTTP 端口和 Native 端口分别适合什么访问方式?
  2. 为什么生产环境要独立规划 ClickHouse 数据目录?
  3. Keeper 在集群中承担哪些职责?
  4. 如何避免用户执行无限制的大查询?
  5. 如果服务启动失败,你会按什么顺序排查?