-
创建者:
虚拟的现实,上次更新时间:9月 24, 2025 需要 1 分钟阅读时间
1. etcd 数据库:mvcc database space exceeded 错误
1.1. 问题
今晚突然出现kuboard无法访问错误,通过查看日志,出现大量以下错误:
{"level":"warn","ts":"2024-12-02T20:19:38.958+0800","caller":"clientv3/retry_interceptor.go:61","msg":"retrying of unary invoker failed","target":"endpoint://client-cb668178-4c91-4741-aacb-826006fc2308/127.0.0.1:2379","attempt":0,"error":"rpc error: code = ResourceExhausted desc = etcdserver: mvcc: database space exceeded"}
time="2024-12-02T12:19:38Z" level=error msg="Storage health check failed: create auth request: etcdserver: mvcc: database space exceeded"
通过此错误判断了下是是 etcd 的空间满了,因为 kuboard 默认也是使用 ETCD 数据的是2g,kuboard 开发者没对 ETCD 存储空间做调整,那么应该就是超过了 2G,而我也没做定时清理 kuboard 审计日志,就导致此问题出现的。
1.2. 解决
# 进入容器内部 docker exec -it kuboard /bin/sh # 查看 etcd 当前状态 ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" --write-out=table endpoint status #ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 endpoint status --write-out="json" # 获取当前revision rev=$(ETCDCTL_API=3 etcdctl--endpoints="http://127.0.0.1:2379"endpointstatus--write-out="json"|egrep-o'"revision":[0-9]*'|egrep-o'[0-9].*') # echo $rev 6078532 # 以$rev为基准,压缩历史数据: ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" compact $rev # 清理多余的碎片空间 ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" defrag #ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" --command-timeout=180s defrag # 解除报警 ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" alarm disarm
# 1.获取当前的版本 ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*' # 2压缩当前版本之前的所有记录 # etcdctl --endpoints=<ENDPOINT> compact <revision> ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 compact 6078532 # 3、清理多余的碎片空间 ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 defrag # 4.解除警告 ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 alarm disarm
1.3. 增加 etcd 数据配额
默认情况下,etcd 的存储限制为 2GB。如果你需要存储更多数据,可以增大存储限制(仅适用于 etcd v3.4+):
etcd --quota-backend-bytes=<BYTES>
例如,将配额增加到 8GB:
etcd --quota-backend-bytes=$((8*1024*1024*1024))
注意:更改此值前,需要检查系统的磁盘空间是否足够。
在 defrag 前,可以尝试延长超时时间,如加上 --command-timeout=180s 参数,以防 defrag 过程因超时而失败。
2. 参考
- 无标签
0 评论