备份

创建备份目录

mkdir -p /data/etcd_backup/backup

备份etcd数据

ETCDCTL_API=3 etcdctl snapshot save /data/etcd_backup/backup/snap-etcd-backup-$(date +%F-%H-%M-%S).db \
  --endpoints=https://192.168.1.64:2379 \
  --cert=/data/etcd/ssl/etcd.pem \
  --key=/data/etcd/ssl/etcd-key.pem \
  --cacert=/data/etcd/ssl/etcd-ca.pem

解释:

• --endpoints=[https://192.168.1.64:2379](https://192.168.1.64:2379):指定 etcd 服务的地址
​
• --cert:客户端证书 etcd.pem。
​
• --key:客户端证书的私钥 etcd-key.pem。
​
• --cacert:CA 证书 etcd-ca.pem,用于验证对等方的身份。

注: 会生成一个路径为"/data/etcd_backup/backup/snap-etcd-backup-2021-11-12-15-09-38.db" 的etcd备份文件。

恢复

在恢复时,首先需要停止 etcd 服务,然后使用备份文件来恢复数据。

停止etcd

systemctl stop etcd
#在恢复 etcd 集群时,只需要停止受影响节点,而不需要停止整个集群的所有节点。
#如果你恢复的是 etcd01 节点,则只需要停止 etcd01 节点的 etcd 服务。

恢复etcd

ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup/backup/snap-etcd-backup-2025-01-18-09-06-01.db \
  --data-dir /var/lib/etcd \
  --name etcd01 \
  --initial-cluster etcd01=https://192.168.1.64:2380 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster-state existing \
  --cert=/data/etcd/ssl/etcd.pem \
  --key=/data/etcd/ssl/etcd-key.pem \
  --cacert=/data/etcd/ssl/etcd-ca.pem

解释:

• /path/to/backup.db:你的备份文件路径。
​
• /var/lib/etcd:恢复后数据存储的目录(根据你的配置调整)。
​
• --name:指定当前节点的名称。
​
• --initial-cluster:指定集群的成员及其通信地址,etcd01 可以替换为你的实际节点名称和地址。
​
• --initial-cluster-token:集群的唯一标识符。
​
• --initial-cluster-state:恢复时使用 existing,表示该集群是一个已存在的集群。

确保恢复后,重启etcd服务

# 启动 etcd 服务
systemctl start etcd

其他事项

• 在恢复之前,确保当前集群的 etcd 服务已停止,以避免数据损坏。

• 定期备份可以帮助你防止因硬件故障或其他问题丢失重要数据。

备份脚本

[root@etcd01 backup]# vim /data/etcd_backup/etcd_backup.sh 
#!/bin/bash
​
mkdir -p /data/etcd_backup/backup
BACKUP_FILE="/data/etcd_backup/snap-etcd-backup-$(date +%F-%H-%M-%S).db"
LOG_FILE="/data/etcd_backup/backup.log"
​
echo "$(date +'%F %T') - Starting backup" >> $LOG_FILE
​
ETCDCTL_API=3 etcdctl snapshot save $BACKUP_FILE \
  --endpoints=https://192.168.1.64:2379 \
  --cert=/data/etcd/ssl/etcd.pem \
  --key=/data/etcd/ssl/etcd-key.pem \
  --cacert=/data/etcd/ssl/etcd-ca.pem \
  >> $LOG_FILE 2>&1
​
if [ $? -eq 0 ]; then
  echo "$(date +'%F %T') - Backup successful: $BACKUP_FILE" >> $LOG_FILE
else
  echo "$(date +'%F %T') - Backup failed" >> $LOG_FILE
fi

每天定时备份

[root@etcd01 backup]# crontab -e
0 2 * * * /data/etcd_backup/etcd_backup.sh