etcd集群備份與恢復(fù)

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

集群恢復(fù)可以考慮如下方案:

  1. 集群轉(zhuǎn)變?yōu)閱喂?jié)點(diǎn)缕坎,再提升為集群模式:
    • 出發(fā)點(diǎn): 先提供服務(wù),在恢復(fù)高可用
    • 注意點(diǎn):實(shí)際操作中不建議中這種方案: 原因見【從集群數(shù)據(jù)直接啟動(dòng)單節(jié)點(diǎn)】部分
  2. 用備份數(shù)據(jù)直接恢復(fù)

方案二

注意點(diǎn):

  1. 如果集群同時(shí)使用v2和v3接口芦倒,目前的方案無法同時(shí)恢復(fù)v2和v3的數(shù)據(jù)娩梨,官方提供的v2和v3都只能恢復(fù)對(duì)應(yīng)接口的數(shù)據(jù)扳躬,另一份數(shù)據(jù)會(huì)丟失
  2. 所有成員使用相同的備份數(shù)據(jù)做恢復(fù)
  3. 使用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)有集群刀荒,成員失去以前的身份
  4. 為了從快照啟動(dòng)集群代嗤,恢復(fù)必須啟動(dòng)一個(gè)新的邏輯集群
  5. 成員加入:使用舊數(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>

  1. 后期要將單節(jié)點(diǎn)升級(jí)集群版,在執(zhí)行member add命令后象浑,因無法獲得多數(shù)節(jié)點(diǎn)會(huì)導(dǎo)致集群不可用蔫饰。
  2. 做集群恢復(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

  1. 如何自動(dòng)化摘盆?
    • 后期在完善吧
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饱苟,隨后出現(xiàn)的幾起案子孩擂,更是在濱河造成了極大的恐慌,老刑警劉巖箱熬,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类垦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡城须,警方通過查閱死者的電腦和手機(jī)蚤认,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糕伐,“玉大人砰琢,你說我怎么就攤上這事×记疲” “怎么了陪汽?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)褥蚯。 經(jīng)常有香客問我挚冤,道長(zhǎng),這世上最難降的妖魔是什么赞庶? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任你辣,我火速辦了婚禮,結(jié)果婚禮上尘执,老公的妹妹穿的比我還像新娘舍哄。我一直安慰自己,他們只是感情好誊锭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布表悬。 她就那樣靜靜地躺著,像睡著了一般丧靡。 火紅的嫁衣襯著肌膚如雪蟆沫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天温治,我揣著相機(jī)與錄音饭庞,去河邊找鬼。 笑死熬荆,一個(gè)胖子當(dāng)著我的面吹牛舟山,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼累盗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寒矿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起若债,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤符相,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蠢琳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啊终,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年傲须,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓝牲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躏碳,死狀恐怖搞旭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菇绵,我是刑警寧澤肄渗,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站咬最,受9級(jí)特大地震影響翎嫡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜永乌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一惑申、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翅雏,春花似錦圈驼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄抹,卻和暖如春靴迫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楼誓。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工玉锌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疟羹。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓主守,卻偏偏與公主長(zhǎng)得像禀倔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丸逸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容