etcd 2g 引发的问题

etcd使用中注意的问题/etcd磁盘清理

Posted by Xiaolei.liang on August 24, 2019 本文总阅读量

前言

在k8s跑了一段时间后,发现不可用,查找问题发现是etcd 2g满了,不可写问题导致。需要压缩历史版本。

实际上解决不可写有三种方法,一是更改2g限制;二是压缩历史版本;三是设置自动压缩。

但是,这个2g是为了在保留性能的同时,etcd的最大存储,不能随意设置,是个问题。由此,查看了相关etcd使用文档,记录下,方便以后查看补充。

etcd使用中注意问题

  1. --auto-compaction-retention

    由于etcd存储多版本数据,随着写入主键增加,历史版本增加,需要定时清理,默认的历史数据是不做清理的,在数据到达2g的时候,就无法继续写入数据,必须手动清理压缩数据才能继续写入。

    --auto-compaction-retention=1表示每1小时进行一次数据压缩。

    根据业务需求,在上生产环境之前就提前确定,历史数据多长时间压缩一次,笔者参考文档中,默认一小时压缩一次数据。这样可以极大的保证集群稳定,减少内存和磁盘占用。

  2. --max-request-bytes

    etcd Raft消息最大字节数,默认值是1.5M,但是,很多业务场景发现同步数据的时候1.5M完全没法满足要求,提前确定初始值很重要。

    笔者参考文档中把该值修改为默认32M,但是官方推荐的是10M,大家可以根据业务情况自己调整。

  3. ``–quota-backend-bytes etcd db数据的大小,默认是2G,当数据达到2G的时候就不允许写入,必须对历史数据进行压缩才能继续写入;参加1里面所述,在启动etcd之前需要确定该值。官方推荐是8G。

手动执行etcd磁盘清理

  1. 显示etcd空间配额:ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt endpoint status --write-out="table"
  2. 查看告警:ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt alarm list
  3. 获取当前etcd数据的修订版本(revision):
     $ rev=$(ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key  --cacert=/x/x.crt endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')
     $ echo $rev
    
  4. 整合压缩旧版本数据: ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt compact $rev

  5. 执行碎片整理: ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt defrag
  6. 解除告警: ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt alarm disarm
  7. 查看配额: ETCDCTL_API=3 etcdctl --endpoints=https://x.x.x.x:2379 --cert=/x/x.pem --key=/x/x.key --cacert=/x/x.crt endpoint status --write-out="table"

参考

etcd使用中注意的问题

etcd集群备份和数据恢复

etcd磁盘清理步骤