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 审计日志,就导致此问题出现的。

该错误表明您的 etcd 数据库已经达到存储空间限制(etcdserver: mvcc: database space exceeded)。这通常是由于 etcd 数据库存储容量已满或写入操作导致的。 

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. 参考

  • 无标签
写评论...