1."etcdserver: mvcc: database space exceeded"错误

只要你使用过 etcd 或者 Kubernetes,大概率见过这个错误。它是指当前 etcd db 文件大小超过了配额,当出现此错误后,你的整个集群将不可写入,只读,对业务的影响非常大。

原因:一方面默认 db 配额仅为 2G,当你的业务数据、写入 QPS、Kubernetes 集群规模增大后,你的 etcd db 大小就可能会超过 2G。 另一方面我们知道 etcd v3 是个 MVCC 数据库,保存了 key 的历史版本,当你未配置压 缩策略的时候,随着数据不断写入,db 大小会不断增大,导致超限。 最后你要特别注意的是,如果你使用的是 etcd 3.2.10 之前的旧版本,请注意备份可能会触 发 boltdb 的一个 Bug,它会导致 db 大小不断上涨,最终达到配额限制。

解决:
首先当然是调大配额。具体多大合适呢?etcd 社区建议不超过 8G。遇到过这个错误的你
是否还记得,为什么当你把配额(quota-backend-bytes)调大后,集群依然拒绝写入呢?
原因就是我们前面提到的 NO SPACE 告警。Apply 模块在执行每个命令的时候,都会去检
查当前是否存在 NO SPACE 告警,如果有则拒绝写入。所以还需要你额外发送一个取消告
警(etcdctl alarm disarm)的命令,以消除所有告警。
其次你需要检查 etcd 的压缩(compact)配置是否开启、配置是否合理。etcd 保存了一
个 key 所有变更历史版本,如果没有一个机制去回收旧的版本,那么内存和 db 大小就会
一直膨胀,在 etcd 里面,压缩模块负责回收旧版本的工作。
最后你需要注意配额(quota-backend-bytes)的行为,默认'0'就是使用 etcd 默认的
2GB 大小,你需要根据你的业务场景适当调优。如果你填的是个小于 0 的数,就会禁用配
额功能,这可能会让你的 db 大小处于失控,导致性能下降,不建议你禁用配额。
2.如果 Raft 模块已提交的日志索引(committed index)比已应用到状态机的日志索引(applied index)超过了 5000,那么它就返回一个"etcdserver: too many requests"错误给 client。
原因:
是etcd server使用raft 的时候,基于raft告知的committed index,本身apply模块的applied index做的限速,默认写死了5000
3.它会尝试去获取请求中的鉴权信息,若使用了密码鉴权、请求中携带了 token,如果
token 无效,则返回"auth: invalid auth token"错误给 client。
4.它会检查你写入的包大小是否超过默认的 1.5MB, 如果超过了会返回"etcdserver:
request is too large"错误给给 client。
5.向 Raft 模块发起提案后,KVServer 模块会等待此 put 请求,等待写入结果通过消息通知
channel 返回或者超时。etcd 默认超时时间是 7 秒(5 秒磁盘 IO 延时 +2*1 秒竞选超时
时间),如果一个请求超时未返回结果,则可能会出现你熟悉的 etcdserver: request
timed out 错误。
etcd简单常用命令:

etcd:

journalctl -ru etcd | less  #被system托管查看日志

cd /usr/local/etcd-3.5.0/
 ./etcdctl put /tmp/hh aa  增,修改
 ./etcdctl del /tmp/aa  删
./etcdctl get --prefix ""  查询所有

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐