跳到主要内容

ClickHouse 启动加载 Join 表内存超限

1.故障现象​

ClickHouse 启动过程中进程直接退出,容器反复重启。kubectl -n ones logs -p clickhouse-statefulset-0 日志如下:

Cannot attach table `default`.`user_join` from metadata file
/var/lib/clickhouse/metadata/default/user_join.sql from query
ATTACH TABLE default.user_join UUID '7851501b-3361-452e-a96b-0a764f998549'
(`uuid` String, `name` String) ENGINE = Join(Any, Left, uuid)
SETTINGS join_any_take_last_row = 1

Code: 241. DB::Exception: Memory limit (total) exceeded: would use 10.80 GiB
(attempt to allocate chunk of 4200601 bytes), maximum: 10.80 GiB

Application: shutting down
BaseDaemon: Received signal -2

2.故障根因​

default.user_join 是 Join 引擎表,Join 引擎的数据必须常驻内存,因此启动时要把落盘的持久化数据整表加载进内存。

但是启动时报错Memory limit (total) exceeded,说明clickhouse默认分配内存不足。

3.解决方案​

提供clickhouse内存上限并重启进程。

#进入操作容器
ones-ai-k8s.sh

#编辑文件添加解析
vim config/private.yaml

#在文件最后添加如下内容,如果已有同名配置则修改,
clickhouseMemoryLimit: 20Gi
clickhouseMaxServerMemoryUsage: "21474836480"

#clickhouseMemoryLimit 是容器内存 limit、默认6Gi,可逐步调高,必须确保宿主机或节点上有可分配内存;
#clickhouseMaxServerMemoryUsage 是 ClickHouse 自身的总内存预算,需与clickhouseMemoryLimit保持一致,单位是字节。

#保存后执行
make setup-ones

#再手工重启clickhouse
kubectl -n ones delete pod clickhouse-statefulset-0

#观察启动日志是否正常
kubectl -n ones logs -f clickhouse-statefulset-0