备份etcd

1.备份

创建备份目录
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:指定 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备份文件。

2.恢复

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

systemctl stop etcd
#在恢复 etcd 集群时,只需要停止受影响节点,而不需要停止整个集群的所有节点。
#如果你恢复的是 etcd01 节点,则只需要停止 etcd01 节点的 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

3. 其他事项

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

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

4.备份脚本

[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