ETCD存储满了如何处理?
一、前言
当运行 ETCD 日志报 Erro: mvcc database space exceeded
时,或者查看健康状态显示 failed to commit proposal: Active Alarm(s): NOSPACE
说明ETCD存储不足了(默认ETCD存储是2G),配额会触发告警,然后 Etcd 系统将进入操作受限的维护模式。
通过下面命令可以查看ETCD存储使用情况
$ etcdctl --endpoints="http://127.0.0.1:2379" --write-out=table endpoint status
二、临时解决方案
PS: 压缩前做好快照备份,注意,快照备份文件不要放在etcd 目录内
etcdctl snapshot save backup.db
通过 ETCD 数据压缩来临时解决问题,具体如下操作
# 获取当前版本
$ rev=$(ETCDCTL_API=3 etcdctl --endpoints=http://127.0.0.1:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')
# 压缩所有旧版本
$ 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 alarm disarm
# 再次查看ETCD存储使用情况
$ ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" --write-out=table endpoint status
三、最终解决方案
在 ETCD 启动命令中添加下面两个参数:
# 表示每隔一个小时自动压缩一次
--auto-compaction-retention=1
# 磁盘空间调整为 8G,官方建议最大 8G(单位是字节)
--quota-backend-bytes=8388608000
启动文件
# cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd
After=network.target
[Service]
Type=notify
ExecStart=/usr/bin/etcd --config-file=/usr/local/etcd/conf.yml --quota-backend-bytes=8388608000 --auto-compaction-mode=revision --auto-compaction-retention=1000
[Install]
WantedBy=multi-user.target
可以添加计划任务,定时清理碎片
0 23 * * * /usr/bin/etcdctl --endpoints=http://127.0.0.1:2379 defrag --command-timeout=30s > /dev/null 2>&1 &