Ubuntu 部署 ClickHouse:高性能分析型数据库(附shell脚本一键部署↓)

ClickHouse 是一个开源的列式数据库管理系统(Columnar DBMS),专为在线分析处理(OLAP)设计,具备高性能、可扩展性和实时数据分析能力,适用于大规模数据集的快速查询场景。

核心特性

  1. 列式存储与向量化查询
    • 数据按列存储而非行,减少查询时读取的无关数据量,提升聚合操作效率。
    • 向量化执行引擎(SIMD 指令优化)加速批量数据处理,单节点吞吐量可达每秒数百万行。
  2. 实时分析与高吞吐
    • 支持近实时数据插入和查询,适用于实时监控、日志分析等场景。
    • 示例:Yandex 曾实现每秒处理数百万条搜索日志的查询性能。
  3. SQL 兼容性与生态集成
    • 支持标准 SQL 语法,兼容主流 BI 工具(如 Tableau、Power BI)。
    • 提供外部表函数,可直接查询 PostgreSQL、MySQL、MongoDB 等系统数据,或读取 S3、GCS 等对象存储。
  4. 分布式架构与扩展性
    • 支持多节点集群部署,数据分片(Sharding)和复制(Replication)实现水平扩展。
    • 可处理 PB 级数据,高并发场景下保持低延迟。
  5. 高压缩率与存储优化
    • 使用 LZ4、ZSTD 等算法压缩数据,减少存储空间占用(通常压缩比达 5-10 倍)。
    • 支持 Parquet、Avro 等开放文件格式,降低跨系统数据交换成本。

技术优势

  • 性能卓越:列式存储+向量化执行+并行计算,复杂查询响应时间亚秒级。
  • 灵活数据模型:支持动态表结构修改、嵌套数据类型,适应多变分析需求。
  • 开源生态:Apache 2.0 许可证,社区活跃,持续迭代新功能(如 MaterializeMySQL 引擎实现 MySQL 数据实时同步)。

典型应用场景

  1. 实时日志分析
    • 案例:网站访问日志、应用日志实时写入 ClickHouse,支持秒级查询用户行为模式。
  2. 用户行为分析(UBA)
    • 案例:电商、游戏行业构建用户特征大宽表,快速分析点击、浏览、购买等行为,支撑精准营销。
  3. 企业经营分析
    • 案例:处理数亿条业务数据,支持数百维度查询,辅助商业决策(如收入、用户数趋势分析)。
  4. 物联网(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; then
    echo "❌ 下载失败"
    exit 1
fi

# 3. 安装
echo "🛠️ 安装中..."
if ! sudo ./clickhouse install; then
    echo "❌ 安装失败"
    exit 1
fi

echo "✅ 安装完成"

# 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
EOF

sudo chmod 644 "$SERVICE_FILE"
echo "✅ systemd 服务文件已创建"

# 7. 重载 systemd
sudo systemctl daemon-reload
echo "🔄 systemd 配置已重载"

# 8. 启用远程访问
if [ "$ENABLE_REMOTE" = "yes" ]; then
    echo "🌐 配置远程访问..."
    CONFIG="/etc/clickhouse-server/config.xml"
    if [ -f "$CONFIG" ]; then
        sudo sed -i '/<listen_host>/d' "$CONFIG"
        sudo sed -i "/<\/yandex>/i <listen_host>$LISTEN_HOST</listen_host>" "$CONFIG"
        echo "✅ 已启用远程访问"
    else
        echo "❌ 配置文件不存在: $CONFIG"
        exit 1
    fi
fi

# 9. 设置密码
if [ "$SET_PASSWORD" = "yes" ]; then
    echo "🔐 设置默认用户密码..."
    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>
EOF
    echo "✅ 密码已设置"
fi

# 10. 启动服务(通过 systemd)
echo "▶️ 启动 ClickHouse 服务..."
sudo systemctl start clickhouse-server

# 等待启动
sleep 10

# 11. 检查状态
if sudo systemctl is-active clickhouse-server >/dev/null 2>&1; then
    echo "🎉🎉🎉 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) 端口"
else
    echo "❌ 服务启动失败,请运行:"
    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
从 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.xmllisten_host 和防火墙

本文系统地介绍了在 Ubuntu 系统上部署和配置 ClickHouse 的完整流程,涵盖了环境准备、安装启动、远程访问、用户密码设置及日常运维命令,帮助读者快速搭建起高性能的分析型数据库环境。作为一款专为 OLAP 场景设计的列式数据库,ClickHouse 凭借其卓越的查询性能、高效的压缩能力和良好的可扩展性,在实时分析、日志处理和大数据报表等场景中展现出强大优势。通过本文的实践指导,不仅能掌握 ClickHouse 的基础操作,更能深入理解其适用场景与核心价值,为构建高效的数据分析平台奠定坚实基础。

相关推荐
189228048613 小时前
NX482NX486美光固态闪存NX507NX508
大数据·网络·数据库·人工智能·性能优化
有一个好名字4 小时前
从 3.6 亿订单表到毫秒级查询:分库分表指南
数据库·oracle
奥尔特星云大使6 小时前
MySQL 备份基础(一)
数据库·sql·mysql·备份·mysql备份
努力学习的小廉7 小时前
初识MYSQL —— 库和表的操作
数据库·mysql·oracle
浔川python社8 小时前
网络爬虫技术规范与应用指南系列(xc—1)
数据库·爬虫
代码不停8 小时前
计算机工作原理(简单介绍)
数据库·redis·缓存
偷心伊普西隆8 小时前
Python Access:删除数据库中指定的表和查询
数据库·python
小蒜学长9 小时前
springboot基于BS的小区家政服务预约平台(代码+数据库+LW)
java·数据库·spring boot·后端
zhangfeng113311 小时前
生物信息 R语言和 cytoscape 相互沟通的组件RCy3,构建cytoscape网络表 节点类型表 链接边的表,并推送到cytoscape
数据库·r语言·生物信息