概述
你处理过大量日志数据吗?普通 MySQL 查几千万条记录,慢到让人怀疑人生。ClickHouse 就是为这种场景生的——列式存储,查询速度比 MySQL 快几十倍,写入也不拖后腿。
很多人不知道的是,ClickHouse 还特别适合存 AI 的 embedding 向量。配合 ONNX 算余弦相似度,比 pgvector 还快。今天用 Docker 一键把 ClickHouse 跑起来。
准备工作
- 一台 VPS(1 核 CPU、2 GB 内存即可,推荐 2核4G)
- 已安装 Docker(没装的话跑
curl -fsSL https://get.docker.com | sudo sh) - sudo 权限
步骤
第一步:创建项目目录
mkdir -p ~/clickhouse && cd ~/clickhouse
第二步:写 docker-compose.yml
version: '3.8'
services:
clickhouse:
image: clickhouse/clickhouse-server:24.8
container_name: clickhouse
restart: unless-stopped
environment:
CLICKHOUSE_DB: ai_data
CLICKHOUSE_USER: default
CLICKHOUSE_PASSWORD: ck2024pass!
volumes:
- ch_data:/var/lib/clickhouse
- ch_logs:/var/log/clickhouse-server
ports:
- "8123:8123"
- "9000:9000"
volumes:
ch_data:
ch_logs:
把 CLICKHOUSE_PASSWORD 改成你自己的强密码。
第三步:启动服务
docker compose up -d
启动后等几秒,检查容器状态:
docker compose ps
看到 clickhouse 状态是 healthy 就说明跑起来了。
第四步:连接测试
用 HTTP 方式连一下:
curl -u default:ck2024pass! "http://localhost:8123/?format=JSON" --data "SELECT 1"
返回 {"data":[[1]],"meta":[{"name":"1","type":"UInt8"}],"rows":1} 就对了。
也可以用客户端连:
docker exec -it clickhouse clickhouse-client -s
进入后跑一句测试:
SELECT 1;
第五步:建一张测试表看看速度
CREATE DATABASE ai_data;
CREATE TABLE ai_embeddings (
id UInt64,
created_at DateTime DEFAULT now(),
model_id String,
embedding Float32 array(1536),
content_text String,
metadata JSON
) ENGINE = MergeTree()
ORDER BY (model_id, created_at)
SETTINGS index_granularity = 8192;
插入 100 万条随机向量测试性能:
INSERT INTO ai_embeddings
SELECT
number as id,
now() - INTERVAL (number % 86400) SECOND as created_at,
['text-embedding-3-small', 'bge-m3'][toInt64(number) % 2 + 1] as model_id,
arrayMap(x -> rand() / 2147483647.0, range(1536)) as embedding,
'这是第' || toString(number) || '条测试数据' as content_text,
'{"source":"test","score":' || toString(rand() % 100) || '}' as metadata
FROM numbers(1000000);
查一下速度:
SELECT model_id, count() as cnt
FROM ai_embeddings
WHERE created_at > now() - INTERVAL 1 HOUR
GROUP BY model_id
ORDER BY cnt DESC;
几百万数据毫秒级返回,这就是 ClickHouse 的威力。
第六步:配置远程访问(可选)
ClickHouse 默认只监听本地。远程访问需要改配置:
docker exec -it clickhouse sed -i 's|<listen_host>::</listen_host>|<listen_host>0.0.0.0</listen_host>|' /etc/clickhouse-server/users.xml
docker exec -it clickhouse sed -i 's|<listen_host>::</listen_host>|<listen_host>0.0.0.0</listen_host>|' /etc/clickhouse-server/config.xml
docker compose restart clickhouse
确认防火墙开了 8123 和 9000 端口。
验证
三种方式验证是否成功:
# 1. HTTP 接口测试
curl -u default:ck2024pass! "http://localhost:8123/"
# 返回 OK
# 2. 容器健康检查
docker inspect --format='{{.State.Health.Status}}' clickhouse
# 返回 healthy
# 3. 查询数据量
docker exec -it clickhouse clickhouse-client -s --query "SELECT count() FROM ai_data.ai_embeddings"
# 返回 1000000
常见问题
Q: 磁盘空间不够怎么办?
ClickHouse 数据默认存在 /var/lib/clickhouse,也就是 Docker volume。想换到其他盘:
# 先停容器
docker compose down
# 修改 compose 文件,把 volume 路径改成大磁盘位置
# 例如:
# volumes:
# - /data/clickhouse:/var/lib/clickhouse
Q: 内存占用太大,VPS 只有 1G 怎么办?
修改配置限制内存:
docker exec -it clickhouse mkdir -p /etc/clickhouse-server/conf.d
cat <<'EOF' | docker exec -i clickhouse tee /etc/clickhouse-server/conf.d/max_memory_usage.xml
<clickhouse>
<profiles>
<default>
<max_memory_usage>500000000</max_memory_usage>
</default>
</profiles>
</clickhouse>
EOF
docker compose restart clickhouse
上面把单查询最大内存限制在 500MB,按你 VPS 的内存调整数字。
Q: 密码忘了怎么办?
# 进入容器
docker exec -it clickhouse clickhouse-client -s
# 修改密码(需要先进入容器)
docker exec -it clickhouse bash -c "clickhouse-client -s --query 'ALTER USER default IDENTIFIED BY '\''newpassword'\'''"
Q: 怎么备份数据?
# 备份
docker exec clickhouse clickhouse-client --query "BACKUP DATABASE ai_data TO Disk('backups', 'backup_$(date +%Y%m%d)')"
# 恢复
docker exec clickhouse clickhouse-client --query "RESTORE DATABASE ai_data FROM Disk('backups', 'backup_20260811')"
Q: 和 PostgreSQL 比,该用哪个?
- MySQL 兼容、事务多 → PostgreSQL
- 日志分析、时序数据、海量向量 → ClickHouse
- 两者不冲突,很多生产环境同时用:PG 存业务数据,ClickHouse 做分析
小结
一行 docker-compose 搞定 ClickHouse,2G 内存就能跑。建表、插数据、查几百万行毫秒级返回,做 AI 向量存储或日志分析都够用。
你的 VPS 上打算用 ClickHouse 干什么?