参考文档:https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/recovery.md
集群恢复可以考虑如下方案:
- 集群转变为单节点,再提升为集群模式:
- 出发点: 先提供服务,在恢复高可用
- 注意点:实际操作中不建议中这种方案: 原因见【从集群数据直接启动单节点】部分
- 用备份数据直接恢复
方案二
注意点:
如果集群同时使用v2和v3接口,目前的方案无法同时恢复v2和v3的数据,官方提供的v2和v3都只能恢复对应接口的数据,另一份数据会丢失
- 所有成员使用相同的备份数据做恢复
- 使用etcdctl snapshot save做的快照,在使用etcdutl snapshot restore恢复会做完整性hash验证;
- 如果直接复制db文件,则没有完整性验证功能,需使用--skip-hash-check做跳过
- 恢复会覆盖一些快照元数据(特别是成员ID、集群ID),可以防止新成员无意中加入现有集群,成员失去以前的身份
- 为了从快照启动集群,恢复必须启动一个新的逻辑集群
- 成员加入:使用旧数据空间,新集群标识
如果帮到你,辛苦点赞鼓励下吧!
数据备份
定时任务:
#!/bin/bash
export ETCDCTL_API=3
CLUSTER="etcd-new"
ENDPOINT="https://IP:2379"
# 说明 可以不用指定ENDPOINT,直接访问本地etcd,这样脚本更通用
[ -d /path/etcd_dbfile.d/`date +%Y%m` ] || mkdir -p /path/etcd_dbfile.d/`date +%Y%m`
cd /data/etcd_dbfile.d/`date +%Y%m`
etcdctl \
--endpoints=$ENDPOINT \
snapshot save ${CLUSTER}_`date +%F`.db
添加到crontab
$ crontab -l
# backup_etcd
0 0 * * * sh /data/etcd_dbfile.d/etcd_snapshot.sh > /dev/null 2>&1
集群恢复
要恢复集群,需要一个snapshot的db文件,用“etcdctl snapshot restore $dbfile”恢复时会创建一个新的etcd data目录,所有节点应该用一个db文件恢复。恢复操作会重写snapshot元数据(如 member ID 和 cluster ID),节点会丢失之前的身份信息;此元数据覆盖可防止新成员无意中加入现有集群。因此,为了从快照启动集群,必须启动新的集群。
备份文件验证完整性
- 如果dbfile来自etcdctl snapshot save,在还原时etcdctl snapshot restore会对文件做完整性校验;
- 如果是从数据目录复制过来的,可以使用--skip-hash-check 跳过数据校验。
使用dbfile创建独立的数据目录和集群信息,下面这条命令最好在之前数据目录同级执行,这样生成的m1.etcd数据目录,就不存在etcd用户写入权限问题了
第一场景:使用snapshot save
# 3.5版本废弃了etcdctl snapshot restore 命令,只能使用etcdutl
# 而3.3版本使用etcdctl
# 以下这个命令中要体会 "注意点"
etcdctl snapshot restore 20191224-1.db \ # "注意点1.使用同一个snapshot备份文件"
--name m1 \ # 新节点名 "注意点3.覆盖节点ID"
--initial-advertise-peer-urls "https://ip1:3380" \
--initial-cluster-token etcd-test-new \ # 新集群信息 "注意点4.覆盖集群ID"
--initial-cluster "m1=https://ip1:2380,m2=https://ip2:2380,m3=https://ip3:2380" \
--data-dir=./m1.etcd
第二场景:如果没有进行备份,或感觉备份数据较旧,可以直接从当前数据目录复制db文件,然后做restore,如下
- 遵守
注意点2
的要求
#复制:
cp data.etcd1/member/snap/db useToNew.db
# 恢复
etcdctl snapshot restore useToNew.db \ # "注意点1.使用同一个snapshot备份文件"
--name m1 \ # 新节点名 "注意点3.覆盖节点ID"
--initial-advertise-peer-urls "https://ip1:2380" \
--initial-cluster-token etcd-test-new \ # 新集群信息 "注意点4.覆盖集群ID"
--initial-cluster "m1=https://ip1:2380,m2=https://ip2:2380,m3=https://ip3:2380" \
--data-dir=./m1.etcd \
--skip-hash-check # 只在使用从历史etcd数据目录复制db文件时使用
对3个节点一次执行上述命令,注意修改节点名。
处理完后,将原有的etcd.conf文件备份,然后修改对应的数据目录、节点名和集群名, 如下
ETCD_DATA_DIR="/etc/etcd/m1.etcd" #修改为用dbfile生产的目录
ETCD_NAME="m1" #改为上面定义的name
ETCD_INITIAL_CLUSTER_TOKEN="etcd-test-new" #改为上面定义的集群名
ETCD_INITIAL_CLUSTER="m1=https://ip1:2380,m2=https://ip2:2380,m3=https://ip3:2380" #更新集群信息
#ETCD_INITIAL_CLUSTER="etcd-1=https://ip1:2380,etcd-2=https://ip2:2380,etcd-3=https://ip3:2380"
ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://ip1:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://ip1:2379"
ETCD_INITIAL_CLUSTER_STATE="new"
重启集群
systemctl restart etcd
观察集群信息:
$ etcdctl member list -w table
$ etcdctl endpoint status -w table
对key进行验证会发现,恢复到了快照时的数据内容。
从集群数据直接启动单节点
可以用,但建议如此使用。因为
- 后期要将单节点升级集群版,在执行member add命令后,因无法获得多数节点会导致集群不可用。
- 做集群恢复,肯定是当前集群异常,不如多花几分钟直接构建集群版
方法如下:
#复制:
cp data.etcd1/member/snap/db useToNew.db
#灰度
etcdutl snapshot restore useToNew.db \
> --name onlyone \
> --initial-advertise-peer-urls="http://localhost:23801" \
> --data-dir=./onlyone.etcd \
> --initial-cluster="onlyone=http://localhost:23801" \
> --initial-cluster-token="etcd-onlyone" \
> --skip-hash-check # 启动命令
# 启动命令,放在脚本中
TOKEN=etcd-onlyone
CLUSTER_STATE=new
NAME_1=onlyone
THIS_IP=127.0.0.1
CLUSTER=${NAME_1}=http://${THIS_IP}:23801
/usr/local/opt/etcd/bin/etcd \
--data-dir=onlyone.etcd \
--name ${NAME_1} \
--listen-peer-urls http://${THIS_IP}:23801 \
--advertise-client-urls http://${THIS_IP}:23791 \
--listen-client-urls http://${THIS_IP}:23791 \
--logger 'zap' \
--log-outputs ./onlyone.log \
--enable-log-rotation \
--metrics extensive \
--auto-compaction-mode 'periodic' \
--auto-compaction-retention '72h' &
验证
# 可以正常使用
➜ etcd-cluster etcdctl --endpoints=http://:23791 get a1000
a1000
1000
➜ etcd-cluster etcdctl --endpoints=http://:23791 put aa 100
OK
➜ etcd-cluster etcdctl --endpoints=http://:23791 get aa
aa
100
v2版本的恢复就不单说,看官文吧。 但只能一侧数据:
- 恢复v2数据,v3丢失;
- 使用v3恢复,v2丢失
TODO
- 如何自动化?
- 后期在完善吧
网友评论