etcdserver: mvcc: database space exceeded
文章目录
- 一、问题原因
- 二、临时解决方案(立即恢复服务)
- 三、长期预防措施(避免再次发生)
- 四、注意事项
"etcdserver: mvcc: database space exceeded"错误表示etcd数据库空间已耗尽(默认限制2GB),需通过压缩历史版本、碎片整理和解除告警来恢复服务,同时建议配置自动压缩和扩容至8GB以预防复发。
一、问题原因
- 存储空间限制:etcd默认数据库大小限制为2GB,当达到此限制时会触发"mvcc: database space exceeded"错误。
- 历史版本累积:etcd采用多版本并发控制(MVCC)机制,若未启用自动压缩,历史版本数据会持续累积导致空间耗尽。
- 告警影响:空间耗尽后etcd进入维护模式,仅接受读取和删除操作,拒绝所有写入请求。
二、临时解决方案(立即恢复服务)
获取当前版本号
rev=$(ETCDCTL_API=3etcdctl--endpoints=https://127.0.0.1:2379\--cacert=/etc/kubernetes/pki/etcd/ca.crt\--cert=/etc/kubernetes/pki/etcd/server.crt\--key=/etc/kubernetes/pki/etcd/server.key\endpoint status-wjson|jq-r'..Status.header.revision')压缩历史版本(保留当前版本及之后数据)
ETCDCTL_API=3etcdctl--endpoints=https://127.0.0.1:2379\--cacert=/etc/kubernetes/pki/etcd/ca.crt\--cert=/etc/kubernetes/pki/etcd/server.crt\--key=/etc/kubernetes/pki/etcd/server.key\compact$rev- 注意:压缩仅清理历史版本,不会删除最新版本数据。
碎片整理(释放物理磁盘空间)
ETCDCTL_API=3etcdctl--endpoints=https://127.0.0.1:2379\--cacert=/etc/kubernetes/pki/etcd/ca.crt\--cert=/etc/kubernetes/pki/etcd/server.crt\--key=/etc/kubernetes/pki/etcd/server.key\defrag- 建议:若整理耗时较长,可添加
--command-timeout=300s参数延长超时时间。
- 建议:若整理耗时较长,可添加
defrag 操作的目的是物理上释放被标记为“删除”的空间。因为即使 compact 删除了历史数据,etcd 的存储文件依然会保留被删除的数据(类似文件系统中的删除文件),而这些空间在物理存储上并未真正释放。通过 defrag 操作,可以让 etcd 重新组织数据,将这些被标记为删除的空间清理出来,从而减少 etcd 占用的磁盘空间。
解除告警(必须执行,否则仍拒绝写入)
ETCDCTL_API=3etcdctl--endpoints=https://127.0.0.1:2379\--cacert=/etc/kubernetes/pki/etcd/ca.crt\--cert=/etc/kubernetes/pki/etcd/server.crt\--key=/etc/kubernetes/pki/etcd/server.key\alarm disarm验证恢复状态
ETCDCTL_API=3etcdctl--endpoints=https://127.0.0.1:2379\--cacert=/etc/kubernetes/pki/etcd/ca.crt\--cert=/etc/kubernetes/pki/etcd/server.crt\--key=/etc/kubernetes/pki/etcd/server.key\endpoint status --write-out=table- 检查
DB SIZE是否显著降低且ERRORS字段为空。
- 检查
三、长期预防措施(避免再次发生)
配置自动压缩(推荐)
在etcd启动参数中添加:--auto-compaction-mode=periodic\--auto-compaction-retention=1h\--quota-backend-bytes=8589934592--auto-compaction-retention=1h:保留1小时历史记录(可调整为24h等)。--quota-backend-bytes=8589934592:将存储上限扩容至8GB(官方建议最大值)。
设置定时维护任务
创建cron任务定期执行压缩(示例):# 每日凌晨1点执行01* * *ETCDCTL_API=3etcdctl compact$(date+%s)&&etcdctl defrag关键路径监控
- 监控
/registry/events/和/registry/minions/等高频路径(Kubernetes中易产生大量事件)。 - 可通过
etcdctl get --prefix /registry/events/ | wc -l检查事件数量。
- 监控
ec get /registry --prefix --keys-only | grep -v ^$ | awk -F '/' '{ h[$3]++ } END {for (k in h) print h[k], k}' | sort -nr | head四、注意事项
- 备份优先:执行压缩前建议先备份数据(
etcdctl snapshot save backup.db)。 - 集群操作:在集群所有节点上依次执行压缩操作,避免数据不一致。
- 扩容限制:最大建议8GB,超过此值可能影响etcd性能稳定性。
- 压缩误区:压缩不会删除最新版本数据,仅清理历史版本,但过度压缩可能影响Watch机制的历史数据同步。
提示:对于Kubernetes环境,建议在
/etc/kubernetes/manifests/etcd.yaml中直接修改启动参数并重启etcd服务,确保配置持久化。若使用托管服务(如Kuboard),需联系云服务商调整后端存储配额。
