etcd 碎片整理

基础信息

etcd Version: 3.5.1
OS: Linux 4.18.0-348.el8.x86_64 x86_64
运行方式:系统进程方式运行
集群数量: 3
问题:etcd 集群状态正常,RAFT TREM 正常,RAFT INDEX 正常,没有报错,但是集群中有一个 slave 节点 DB SIZE 过大。

解决方案

etcd 3.5.1 不支持完全离线的 data-dir defrag,defrag 操作必须依赖可用 etcd endpoint;通过在异常 follower 上以临时单节点模式启动 etcd,对本地 data-dir 执行 defrag,随后恢复加入原集群,可安全修复 bbolt 碎片导致的 DB Size

# 1. 停止异常 follower 节点的 etcd 服务
systemctl stop etcd

# 2. 备份异常 follower 节点的 data-dir
cp -a /var/lib/etcd /var/lib/etcd.bak.$(date +%F_%H%M)

# 3. 用临时单节点模式启动 etcd,指定本地 data-dir
etcd \
  --data-dir=/var/lib/etcd \
  --name=etcd-103-tmp \
  --listen-client-urls=https://127.0.0.1:2379 \
  --advertise-client-urls=https://127.0.0.1:2379 \
  --listen-peer-urls=https://127.0.0.1:2380 \
  --initial-cluster=etcd-103-tmp=https://127.0.0.1:2380 \
  --initial-cluster-state=new \
  --cert-file=/etc/etcd/pki/etcd.pem \
  --key-file=/etc/etcd/pki/etcd-key.pem \
  --trusted-ca-file=/etc/etcd/pki/ca.pem \
  --peer-cert-file=/etc/etcd/pki/etcd.pem \
  --peer-key-file=/etc/etcd/pki/etcd-key.pem \
  --peer-trusted-ca-file=/etc/etcd/pki/ca.pem

# 4. 执行 defrag 操作
ETCDCTL_API=3 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cert=/etc/etcd/pki/etcd.pem \
  --key=/etc/etcd/pki/etcd-key.pem \
  --cacert=/etc/etcd/pki/ca.pem \
  defrag

# 5. 停止临时 etcd 实例
Ctrl+C  kill

# 6. 恢复原集群配置,重新启动 etcd 服务
systemctl start etcd