美文网首页
etcd集群备份与恢复

etcd集群备份与恢复

作者: Ballpenww | 来源:发表于2022-08-23 18:10 被阅读0次

参考文档:https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/recovery.md

集群恢复可以考虑如下方案:

  1. 集群转变为单节点,再提升为集群模式:
    • 出发点: 先提供服务,在恢复高可用
    • 注意点:实际操作中不建议中这种方案: 原因见【从集群数据直接启动单节点】部分
  2. 用备份数据直接恢复

方案二

注意点:

  1. 如果集群同时使用v2和v3接口,目前的方案无法同时恢复v2和v3的数据,官方提供的v2和v3都只能恢复对应接口的数据,另一份数据会丢失
  2. 所有成员使用相同的备份数据做恢复
  3. 使用etcdctl snapshot save做的快照,在使用etcdutl snapshot restore恢复会做完整性hash验证;
    • 如果直接复制db文件,则没有完整性验证功能,需使用--skip-hash-check做跳过
    • 恢复会覆盖一些快照元数据(特别是成员ID、集群ID),可以防止新成员无意中加入现有集群,成员失去以前的身份
  4. 为了从快照启动集群,恢复必须启动一个新的逻辑集群
  5. 成员加入:使用旧数据空间,新集群标识

如果帮到你,辛苦点赞鼓励下吧!

数据备份

定时任务:

#!/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进行验证会发现,恢复到了快照时的数据内容。

从集群数据直接启动单节点

可以用,但建议如此使用。因为

  1. 后期要将单节点升级集群版,在执行member add命令后,因无法获得多数节点会导致集群不可用。
  2. 做集群恢复,肯定是当前集群异常,不如多花几分钟直接构建集群版
    方法如下:
#复制:
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

  1. 如何自动化?
    • 后期在完善吧

相关文章

网友评论

      本文标题:etcd集群备份与恢复

      本文链接:https://www.haomeiwen.com/subject/humggrtx.html