本文永久链接: https://www.xtplayer.cn/etcd/etcd-problem-sets/

客户端必须向 etcd leader 发送请求吗?

Raft is leader-based, leader 处理所有需要一致性的客户机请求。但客户端不需要知道哪个节点是 leader,所有发送给跟随者的一致性请求都会自动转发给 leader。不需要协商一致的请求(例如,序列化读取)可以由任何集群成员处理。

系统要求

由于 etcd 将数据写入磁盘,因此强烈建议使用 SSD 或者超高速磁盘来运行 etcd 服务。为防止性能下降或无意中存储空间耗尽,etcd 强制设置 2GB 默认存储大小配额,可以通过--quota-backend-bytes配置配额,最高可配置为 8GB。空间配额用来保障集群可靠运行,如果没有限制配额,当键空间变大之后,直到耗尽磁盘空间。当任意节点超出空间配额,那么当前 etcd 服务将进入维护状态,只接受读/删操作。只有释放了足够空间、去碎片化了后端数据库并且清理了空间配额之后,集群才能继续正常操作。

etcd 集群大小

从理论上讲,没有硬性限制。但是,一个 etcd 集群建议不超过七个节点。

Error from server: etcdserver: mvcc: database space exceeded

etcd 默认不会自动进行数据压缩,etcd 保存了 keys 的历史信息,数据频繁的改动会导致数据版本越来越多,相对应的数据库就会越来越大。etcd 数据库大小默认 2GB,当在 etcd 容器或者 Rancher ui 出现以下日志时,说明数据库空间占满,需要进行数据压缩腾出空间。

释放空间

  1. 登录 etcd 容器

    在 etcd 主机上,执行以下命令登录 etcd 容器

    docker exec -ti etcd sh
  2. 获取历史版本号:

    在 etcd 容器执行以下命令

    ver=$(etcdctl endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')
  3. 压缩旧版本

    etcdctl compact $ver
  4. 清理碎片

    etcdctl defrag

    以上 2-4 步,操作需在每个 etcd 容器中执行。

忽略 etcd 告警

通过执行etcdctl alarm list可以查看 etcd 的告警情况,如果存在告警,即使释放了 etcd 空间,etcd 也处于只读状态。

在确定以上的操作均执行完毕后,在任意一个 etcd 容器中执行以下命令忽略告警:

etcdctl alarm disarm