etcd集群备份与恢复

参考文档: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. 如何自动化?
    • 后期在完善吧
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容