參考文檔:https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/recovery.md
集群恢復(fù)可以考慮如下方案:
- 集群轉(zhuǎn)變?yōu)閱喂?jié)點(diǎn)缕坎,再提升為集群模式:
- 出發(fā)點(diǎn): 先提供服務(wù),在恢復(fù)高可用
- 注意點(diǎn):實(shí)際操作中不建議中這種方案: 原因見【從集群數(shù)據(jù)直接啟動(dòng)單節(jié)點(diǎn)】部分
- 用備份數(shù)據(jù)直接恢復(fù)
方案二
注意點(diǎn):
如果集群同時(shí)使用v2和v3接口芦倒,目前的方案無法同時(shí)恢復(fù)v2和v3的數(shù)據(jù)娩梨,官方提供的v2和v3都只能恢復(fù)對(duì)應(yīng)接口的數(shù)據(jù)扳躬,另一份數(shù)據(jù)會(huì)丟失
- 所有成員使用相同的備份數(shù)據(jù)做恢復(fù)
- 使用etcdctl snapshot save做的快照,在使用etcdutl snapshot restore恢復(fù)會(huì)做完整性hash驗(yàn)證;
- 如果直接復(fù)制db文件纺非,則沒有完整性驗(yàn)證功能语盈,需使用--skip-hash-check做跳過
- 恢復(fù)會(huì)覆蓋一些快照元數(shù)據(jù)(特別是成員ID舱馅、集群ID),可以防止新成員無意中加入現(xiàn)有集群刀荒,成員失去以前的身份
- 為了從快照啟動(dòng)集群代嗤,恢復(fù)必須啟動(dòng)一個(gè)新的邏輯集群
- 成員加入:使用舊數(shù)據(jù)空間,新集群標(biāo)識(shí)
如果幫到你缠借,辛苦點(diǎn)贊鼓勵(lì)下吧干毅!
數(shù)據(jù)備份
定時(shí)任務(wù):
#!/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
集群恢復(fù)
要恢復(fù)集群泼返,需要一個(gè)snapshot的db文件硝逢,用“etcdctl snapshot restore $dbfile”恢復(fù)時(shí)會(huì)創(chuàng)建一個(gè)新的etcd data目錄,所有節(jié)點(diǎn)應(yīng)該用一個(gè)db文件恢復(fù)∏耄恢復(fù)操作會(huì)重寫snapshot元數(shù)據(jù)(如 member ID 和 cluster ID)叫乌,節(jié)點(diǎn)會(huì)丟失之前的身份信息;此元數(shù)據(jù)覆蓋可防止新成員無意中加入現(xiàn)有集群徽缚。因此综芥,為了從快照啟動(dòng)集群,必須啟動(dòng)新的集群猎拨。
備份文件驗(yàn)證完整性
- 如果dbfile來自etcdctl snapshot save膀藐,在還原時(shí)etcdctl snapshot restore會(huì)對(duì)文件做完整性校驗(yàn);
- 如果是從數(shù)據(jù)目錄復(fù)制過來的红省,可以使用--skip-hash-check 跳過數(shù)據(jù)校驗(yàn)额各。
使用dbfile創(chuàng)建獨(dú)立的數(shù)據(jù)目錄和集群信息,下面這條命令最好在之前數(shù)據(jù)目錄同級(jí)執(zhí)行吧恃,這樣生成的m1.etcd數(shù)據(jù)目錄虾啦,就不存在etcd用戶寫入權(quán)限問題了
第一場(chǎng)景:使用snapshot save
# 3.5版本廢棄了etcdctl snapshot restore 命令,只能使用etcdutl
# 而3.3版本使用etcdctl
# 以下這個(gè)命令中要體會(huì) "注意點(diǎn)"
etcdctl snapshot restore 20191224-1.db \ # "注意點(diǎn)1.使用同一個(gè)snapshot備份文件"
--name m1 \ # 新節(jié)點(diǎn)名 "注意點(diǎn)3.覆蓋節(jié)點(diǎn)ID"
--initial-advertise-peer-urls "https://ip1:3380" \
--initial-cluster-token etcd-test-new \ # 新集群信息 "注意點(diǎn)4.覆蓋集群ID"
--initial-cluster "m1=https://ip1:2380,m2=https://ip2:2380,m3=https://ip3:2380" \
--data-dir=./m1.etcd
第二場(chǎng)景:如果沒有進(jìn)行備份痕寓,或感覺備份數(shù)據(jù)較舊傲醉,可以直接從當(dāng)前數(shù)據(jù)目錄復(fù)制db文件,然后做restore呻率,如下
- 遵守
注意點(diǎn)2
的要求
#復(fù)制:
cp data.etcd1/member/snap/db useToNew.db
# 恢復(fù)
etcdctl snapshot restore useToNew.db \ # "注意點(diǎn)1.使用同一個(gè)snapshot備份文件"
--name m1 \ # 新節(jié)點(diǎn)名 "注意點(diǎn)3.覆蓋節(jié)點(diǎn)ID"
--initial-advertise-peer-urls "https://ip1:2380" \
--initial-cluster-token etcd-test-new \ # 新集群信息 "注意點(diǎn)4.覆蓋集群ID"
--initial-cluster "m1=https://ip1:2380,m2=https://ip2:2380,m3=https://ip3:2380" \
--data-dir=./m1.etcd \
--skip-hash-check # 只在使用從歷史etcd數(shù)據(jù)目錄復(fù)制db文件時(shí)使用
對(duì)3個(gè)節(jié)點(diǎn)一次執(zhí)行上述命令硬毕,注意修改節(jié)點(diǎn)名。
處理完后礼仗,將原有的etcd.conf文件備份吐咳,然后修改對(duì)應(yīng)的數(shù)據(jù)目錄、節(jié)點(diǎn)名和集群名元践, 如下
ETCD_DATA_DIR="/etc/etcd/m1.etcd" #修改為用dbfile生產(chǎn)的目錄
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
對(duì)key進(jìn)行驗(yàn)證會(huì)發(fā)現(xiàn)韭脊,恢復(fù)到了快照時(shí)的數(shù)據(jù)內(nèi)容。
從集群數(shù)據(jù)直接啟動(dòng)單節(jié)點(diǎn)
可以用单旁,但建議如此使用沪羔。因?yàn)?/p>
- 后期要將單節(jié)點(diǎn)升級(jí)集群版,在執(zhí)行member add命令后象浑,因無法獲得多數(shù)節(jié)點(diǎn)會(huì)導(dǎo)致集群不可用蔫饰。
- 做集群恢復(fù),肯定是當(dāng)前集群異常融柬,不如多花幾分鐘直接構(gòu)建集群版
方法如下:
#復(fù)制:
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 # 啟動(dòng)命令
# 啟動(dòng)命令死嗦,放在腳本中
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' &
驗(yàn)證
# 可以正常使用
? 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版本的恢復(fù)就不單說,看官文吧粒氧。 但只能一側(cè)數(shù)據(jù):
- 恢復(fù)v2數(shù)據(jù),v3丟失节腐;
- 使用v3恢復(fù)外盯,v2丟失
TODO
- 如何自動(dòng)化摘盆?
- 后期在完善吧