ClickHouse 是一个开源的列式数据库管理系统(Columnar DBMS),专为在线分析处理(OLAP)设计,具备高性能、可扩展性和实时数据分析能力,适用于大规模数据集的快速查询场景。
核心特性
- 列式存储与向量化查询
- 数据按列存储而非行,减少查询时读取的无关数据量,提升聚合操作效率。
- 向量化执行引擎(SIMD 指令优化)加速批量数据处理,单节点吞吐量可达每秒数百万行。
- 实时分析与高吞吐
- 支持近实时数据插入和查询,适用于实时监控、日志分析等场景。
- 示例:Yandex 曾实现每秒处理数百万条搜索日志的查询性能。
- SQL 兼容性与生态集成
- 支持标准 SQL 语法,兼容主流 BI 工具(如 Tableau、Power BI)。
- 提供外部表函数,可直接查询 PostgreSQL、MySQL、MongoDB 等系统数据,或读取 S3、GCS 等对象存储。
- 分布式架构与扩展性
- 支持多节点集群部署,数据分片(Sharding)和复制(Replication)实现水平扩展。
- 可处理 PB 级数据,高并发场景下保持低延迟。
- 高压缩率与存储优化
- 使用 LZ4、ZSTD 等算法压缩数据,减少存储空间占用(通常压缩比达 5-10 倍)。
- 支持 Parquet、Avro 等开放文件格式,降低跨系统数据交换成本。
技术优势
- 性能卓越:列式存储+向量化执行+并行计算,复杂查询响应时间亚秒级。
- 灵活数据模型:支持动态表结构修改、嵌套数据类型,适应多变分析需求。
- 开源生态:Apache 2.0 许可证,社区活跃,持续迭代新功能(如 MaterializeMySQL 引擎实现 MySQL 数据实时同步)。
典型应用场景
- 实时日志分析
- 案例:网站访问日志、应用日志实时写入 ClickHouse,支持秒级查询用户行为模式。
- 用户行为分析(UBA)
- 案例:电商、游戏行业构建用户特征大宽表,快速分析点击、浏览、购买等行为,支撑精准营销。
- 企业经营分析
- 案例:处理数亿条业务数据,支持数百维度查询,辅助商业决策(如收入、用户数趋势分析)。
- 物联网(IoT)与监控
- 案例:实时分析设备指标数据,构建高效监控告警系统。
局限性
- 事务支持弱:不支持 ACID 事务,修改操作(如 UPDATE/DELETE)需通过特殊引擎(如 ReplacingMergeTree)实现。
- 短查询延迟较高:单条查询可能占用全部 CPU 资源,高 QPS 场景需优化。
- 社区规模较小:相比 PostgreSQL、MySQL 等,生态工具和文档丰富度有待提升。
适用场景建议
- 推荐使用:读多写少、数据量大、查询复杂的分析场景(如报表生成、数据挖掘)。
- 不推荐使用:高频事务处理、强一致性要求的 OLTP 场景。
一、环境准备
sudo apt update # 更新软件包列表
sudo apt install -y curl apt-transport-https ca-certificates dirmngr # 安装必要工具
二、添加 ClickHouse 官方仓库
1. 添加 GPG 公钥
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754
2. 添加仓库源
echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
3. 更新包列表
sudo apt update
三、安装 ClickHouse
sudo apt install -y clickhouse-server clickhouse-client # 安装服务端和客户端
clickhouse-server
:数据库服务clickhouse-client
:命令行客户端
四、启动并启用服务
sudo systemctl start clickhouse-server # 启动服务
sudo systemctl enable clickhouse-server # 设置开机自启
sudo systemctl status clickhouse-server # 查看状态

五、首次登录 ClickHouse
使用命令行客户端:
clickhouse-client

六、测试基本操作
1. 创建数据库
CREATE DATABASE test_db;
2. 使用数据库
USE test_db;
3. 创建表(示例:日志表)
CREATE TABLE logs (timestamp DateTime,user_id UInt32,action String,duration_ms UInt32
) ENGINE = MergeTree
ORDER BY (user_id, timestamp);
4. 插入数据
INSERT INTO logs VALUES
('2025-09-28 10:00:00', 1001, 'login', 120),
('2025-09-28 10:05:00', 1001, 'search', 80),
('2025-09-28 10:10:00', 1002, 'login', 150);
5. 查询数据
SELECT user_id, COUNT(*) AS cnt, AVG(duration_ms) AS avg_time
FROM logs
GROUP BY user_id;

七、配置远程访问
1. 编辑配置文件
sudo nano /etc/clickhouse-server/config.xml
2. 找到 <listen_host>
,修改为:
<!-- 允许所有 IP 访问 -->
<listen_host>0.0.0.0</listen_host><!-- 或只允许特定 IP -->
<!-- <listen_host>192.168.1.100</listen_host> -->
3. 重启服务
sudo systemctl restart clickhouse-server.service
八、设置密码
1. 编辑用户配置
sudo nano /etc/clickhouse-server/users.d/default.xml
2. 创建配置文件内容:
<yandex><users><default><password>your_secure_password</password> <!-- 设置密码 --><!-- 或使用 SHA256 加密 --><!-- <password_sha256_hex>...</password_sha256_hex> --></default></users>
</yandex>
3. 重启服务
sudo systemctl restart clickhouse-server.service
4. 远程连接示例
clickhouse-client --host <your-ip> --user default --password 'your_secure_password'
九、shell脚本自动化安装
#!/bin/sh# =============================================================================
# ClickHouse 安装脚本(一键搞定 systemd + 远程 + 密码)
# 作者:LoneEon
# 2025 年 9 月 28 日 - 稳定 · 安全 · 兼容
# =============================================================================# ================== 🔧 配置区 ==================
ENABLE_REMOTE="yes"
LISTEN_HOST="0.0.0.0"
SET_PASSWORD="yes"
CLICKHOUSE_PASSWORD="MySecurePass123!" # 👈 修改为你的密码
# ==============================================echo "🚀 开始安装 ClickHouse..."# 1. 清理旧文件
rm -f ./clickhouse# 2. 下载安装器
echo "📥 下载 ClickHouse 安装器..."
if ! curl -sS https://clickhouse.com/ | sh; thenecho "❌ 下载失败"exit 1
fi# 3. 安装
echo "🛠️ 安装中..."
if ! sudo ./clickhouse install; thenecho "❌ 安装失败"exit 1
fiecho "✅ 安装完成"# 4. 停止可能已运行的实例
echo "🛑 停止已有服务..."
sudo pkill -f clickhouse-server || true# 5. ✅ 关键:修复数据目录权限(解决 status=76)
echo "🔧 修复数据目录权限 (/var/lib/clickhouse)..."
DATA_DIR="/var/lib/clickhouse"
sudo rm -rf "$DATA_DIR"/* # 清空数据(新安装推荐)
sudo mkdir -p "$DATA_DIR"
sudo chown -R clickhouse:clickhouse "$DATA_DIR"
sudo chmod -R 750 "$DATA_DIR"
echo "✅ 数据目录已清理并设置权限"# 6. 创建 systemd 服务文件
echo "📄 创建 systemd 服务文件..."
SERVICE_FILE="/etc/systemd/system/clickhouse-server.service"
sudo tee "$SERVICE_FILE" > /dev/null << 'EOF'
[Unit]
Description=ClickHouse Server (analytic DBMS for big data)
After=network.target[Service]
Type=simple
User=clickhouse
Group=clickhouse
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
ExecStop=/usr/bin/clickhouse-server --stop
Restart=always
LimitNOFILE=65536
StandardOutput=journal
StandardError=journal[Install]
WantedBy=multi-user.target
EOFsudo chmod 644 "$SERVICE_FILE"
echo "✅ systemd 服务文件已创建"# 7. 重载 systemd
sudo systemctl daemon-reload
echo "🔄 systemd 配置已重载"# 8. 启用远程访问
if [ "$ENABLE_REMOTE" = "yes" ]; thenecho "🌐 配置远程访问..."CONFIG="/etc/clickhouse-server/config.xml"if [ -f "$CONFIG" ]; thensudo sed -i '/<listen_host>/d' "$CONFIG"sudo sed -i "/<\/yandex>/i <listen_host>$LISTEN_HOST</listen_host>" "$CONFIG"echo "✅ 已启用远程访问"elseecho "❌ 配置文件不存在: $CONFIG"exit 1fi
fi# 9. 设置密码
if [ "$SET_PASSWORD" = "yes" ]; thenecho "🔐 设置默认用户密码..."PASSWORD_DIR="/etc/clickhouse-server/users.d"sudo mkdir -p "$PASSWORD_DIR"cat << EOF | sudo tee "$PASSWORD_DIR/password.xml" > /dev/null
<yandex><users><default><password>$CLICKHOUSE_PASSWORD</password></default></users>
</yandex>
EOFecho "✅ 密码已设置"
fi# 10. 启动服务(通过 systemd)
echo "▶️ 启动 ClickHouse 服务..."
sudo systemctl start clickhouse-server# 等待启动
sleep 10# 11. 检查状态
if sudo systemctl is-active clickhouse-server >/dev/null 2>&1; thenecho "🎉🎉🎉 ClickHouse 安装成功!🎉🎉🎉"echo ""echo "📌 服务管理:"echo " • 状态: sudo systemctl status clickhouse-server"echo " • 启动: sudo systemctl start clickhouse-server"echo " • 重启: sudo systemctl restart clickhouse-server"echo " • 开机自启: sudo systemctl enable clickhouse-server"echo ""echo "📌 连接方式:"echo " • CLI: clickhouse-client --host localhost --password '$CLICKHOUSE_PASSWORD'"echo " • HTTP: http://$IP:8123?query=SELECT%201"echo ""echo "💡 提示:确保防火墙开放 8123 (HTTP) 和 9000 (TCP) 端口"
elseecho "❌ 服务启动失败,请运行:"echo " journalctl -u clickhouse-server --no-pager -n 50"exit 1
fi
十、常用命令速查表
类别 | 功能 | 命令 |
---|
数据库 | 查看所有数据库 | SHOW DATABASES; |
| 创建数据库 | CREATE DATABASE db_name; |
| 使用数据库 | USE db_name; |
| 删除数据库 | DROP DATABASE db_name; |
| 查看数据库建表语句 | SHOW CREATE DATABASE db_name; |
表操作 | 查看当前库所有表 | SHOW TABLES; |
| 创建表(MergeTree) | CREATE TABLE table_name (id UInt32, name String, created DateTime) ENGINE = MergeTree ORDER BY id; |
| 查看表结构 | DESCRIBE TABLE table_name; 或 DESC table_name; |
| 查看建表语句 | SHOW CREATE TABLE table_name; |
| 重命名表 | RENAME TABLE old_name TO new_name; |
| 删除表 | DROP TABLE table_name; |
| 清空表数据 | TRUNCATE TABLE table_name; |
插入数据 | 插入多行数据 | INSERT INTO table_name VALUES (1, 'Alice', '2025-09-28 10:00:00'), (2, 'Bob', '2025-09-28 10:05:00'); |
| 插入指定列 | INSERT INTO table_name (id, name) VALUES (3, 'Charlie'); |
| 从查询结果插入 | INSERT INTO dst_table SELECT * FROM src_table; |
查询数据 | 查询所有数据 | SELECT * FROM table_name; |
| 条件查询 | SELECT * FROM table_name WHERE id = 1; |
| 聚合统计 | SELECT COUNT(*), AVG(duration_ms) FROM logs; |
| 分组查询 | SELECT user_id, COUNT(*) FROM logs GROUP BY user_id; |
| 排序 | SELECT * FROM table_name ORDER BY created DESC; |
| 限制行数 | SELECT * FROM table_name LIMIT 10; |
| 去重 | SELECT DISTINCT name FROM table_name; |
| 时间范围查询 | SELECT * FROM logs WHERE timestamp >= '2025-09-28 00:00:00' AND timestamp < '2025-09-29 00:00:00'; |
系统信息 | 查看正在运行的查询 | SELECT * FROM system.processes; |
| 查看最近查询日志 | SELECT query, elapsed FROM system.query_log ORDER BY event_time DESC LIMIT 10; |
| 查看表大小(行数、压缩大小) | SELECT table, sum(rows), formatReadableSize(sum(data_compressed_bytes)) FROM system.parts GROUP BY table; |
| 查看磁盘使用 | SELECT * FROM system.disks; |
| 查看列信息 | SELECT * FROM system.columns WHERE table = 'your_table'; |
用户权限 | 创建用户(带密码) | CREATE USER IF NOT EXISTS alice IDENTIFIED WITH plaintext_password BY 'secure123'; |
| 授予权限 | GRANT SELECT ON db_name.* TO alice; |
| 查看用户权限 | SHOW GRANTS FOR alice; |
| 删除用户 | DROP USER alice; |
导入导出 | 导出为 CSV | SELECT * FROM table_name INTO OUTFILE '/path/export.csv' FORMAT CSVWithNames; |
| 从 CSV 导入 | cat data.csv | clickhouse-client --query="INSERT INTO table_name FORMAT CSVWithNames" |
| 从 TSV 导入 | clickhouse-client --query="INSERT INTO table_name FORMAT TSV" < data.tsv |
远程连接 | 命令行连接远程 | clickhouse-client --host 192.168.1.100 --user default --password 'pwd' |
| HTTP 接口查询 | curl "http://ip:8123?query=SELECT+1" |
服务管理 | 启动服务 | sudo systemctl start clickhouse-server |
| 停止服务 | sudo systemctl stop clickhouse-server |
| 重启服务 | sudo systemctl restart clickhouse-server |
| 查看状态 | sudo systemctl status clickhouse-server |
| 查看日志 | sudo journalctl -u clickhouse-server -f |
| 配置文件路径 | /etc/clickhouse-server/config.xml |
| 数据存储路径 | /var/lib/clickhouse/ |
十一、常用工具与集成
工具 | 用途 |
---|
DBeaver | 图形化管理 ClickHouse |
Grafana | 接入 ClickHouse 做可视化仪表盘 |
Python (clickhouse-connect) | Python 操作 ClickHouse |
Logstash / Fluentd | 将日志写入 ClickHouse |
十二、卸载 ClickHouse(如需)
# 停止服务
sudo systemctl stop clickhouse-server# 卸载包
sudo apt remove --purge clickhouse-server clickhouse-client -y# 删除数据目录(谨慎!)
sudo rm -rf /var/lib/clickhouse
sudo rm -rf /etc/clickhouse-server
十三、常见问题
问题 | 解决方法 |
---|
Cannot connect to localhost:9000 | 检查服务是否运行:systemctl status clickhouse-server |
内存不足导致崩溃 | 增加内存或限制查询内存:max_memory_usage |
插入数据慢 | 使用批量插入,或调整 merge_tree 设置 |
远程无法连接 | 检查 config.xml 中 listen_host 和防火墙 |
本文系统地介绍了在 Ubuntu 系统上部署和配置 ClickHouse 的完整流程,涵盖了环境准备、安装启动、远程访问、用户密码设置及日常运维命令,帮助读者快速搭建起高性能的分析型数据库环境。作为一款专为 OLAP 场景设计的列式数据库,ClickHouse 凭借其卓越的查询性能、高效的压缩能力和良好的可扩展性,在实时分析、日志处理和大数据报表等场景中展现出强大优势。通过本文的实践指导,不仅能掌握 ClickHouse 的基础操作,更能深入理解其适用场景与核心价值,为构建高效的数据分析平台奠定坚实基础。