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