维护

    所有 etcd 的维护是指管理被 etcd 键空间消耗的存储资源。通过存储空间的配额来控制键空间大小;如果 etcd 成员运行空间不足,将触发集群级警告,这将使得系统进入有限操作的维护模式。为了避免没有空间来写入键空间, etcd 键空间历史必须被压缩。存储空间自身可能通过碎片整理 etcd 成员来回收。最后,etcd 成员状态的定期快照备份使得恢复任何非故意的逻辑数据丢失或者操作错误导致的损坏变成可能。

    因为 etcd 保持它的键空间的确切历史,这个历史应该定期压缩来避免性能下降和最终的存储空间枯竭。压缩键空间历史删除所有关于被废弃的在给定键空间修订版本之前的键的信息。这些key使用的空间随机变得可用来继续写入键空间。

    键空间可以使用 的时间窗口历史保持策略自动压缩,或者使用 etcdctl 手工压缩。 etcdctl 方法在压缩过程上提供细粒度的控制,反之自动压缩适合仅仅需要一定时间长度的键历史的应用。

    etcd 可以使用带有小时时间单位的 --auto-compaction 选项来设置为自动压缩键空间:

    1. # 压缩到修订版本3
    2. $ etcdctl compact 3

    在压缩修订版本之前的修订版本变得无法访问:

    在压缩键空间之后,后端数据库可能出现内部。内部碎片是指可以被后端使用但是依然消耗存储空间的空间。反碎片化过程释放这个存储空间到文件系统。反碎片化在每个成员上发起,因此集群范围的延迟尖峰(latency spike)可能可以避免。

    通过留下间隔在后端数据库,压缩旧有修订版本会内部碎片化 etcd 。碎片化的空间可以被 etcd 使用,但是对于主机文件系统不可用。

    为了反碎片化 etcd 成员, 使用 etcdctl defrag 命令:

    1. $ etcdctl defrag
    2. Finished defragmenting etcd member[127.0.0.1:2379]

    默认,etcd 设置适合大多数应用的保守的空间配额,但是它可以在命令行中设置,单位为字节:

    空间配额可以用循环触发:

    1. $ while [ 1 ]; do dd if=/dev/urandom bs=1024 count=1024 | etcdctl put key || break; done
    2. ...
    3. Error: rpc error: code = 8 desc = etcdserver: mvcc: database space exceeded
    4. # 确认配额空间被超过
    5. $ etcdctl --write-out=table endpoint status
    6. +----------------+------------------+-----------+---------+-----------+-----------+------------+
    7. | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
    8. +----------------+------------------+-----------+---------+-----------+-----------+------------+
    9. # 确认警告已发起
    10. $ etcdctl alarm list
    11. memberID:13803658152347727308 alarm:NOSPACE

    删除多读的键空间将把集群带回配额限制,因此警告能被接触:

    在正规基础上执行 etcd 集群快照可以作为 etc 键空间的持久备份。通过获取 etcd 成员的候选数据库的定期快照,etcd 集群可以被恢复到某个有已知良好状态的时间点。

    1. $ etcdctl snapshot save backup.db
    2. $ etcdctl --write-out=table snapshot status backup.db
    3. +----------+----------+------------+------------+
    4. | HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
    5. +----------+----------+------------+------------+