etcd 是一款開(kāi)源的分布式一致性鍵值存儲(chǔ),由 CoreOS 公司進(jìn)行維護(hù),詳細(xì)的介紹請(qǐng)參考官方文檔。
etcd 目前最新的版本的 v3.1.1,但它的 API 又有 v3 和 v2 之分,社區(qū)通常所說(shuō)的 v3 與 v2 都是指 API 的版本號(hào)。從 etcd 2.3 版本開(kāi)始推出了一個(gè)實(shí)驗(yàn)性的全新 v3 版本 API 的實(shí)現(xiàn),v2 與 v3 API 使用了不同的存儲(chǔ)引擎,所以客戶端命令也完全不同。
# etcdctl --version
etcdctl version: 3.0.4
API version: 2
官方指出 etcd v2 和 v3 的數(shù)據(jù)不能混合存放,support backup of v2 and v3 stores 。
特別提醒:若使用 v3 備份數(shù)據(jù)時(shí)存在 v2 的數(shù)據(jù)則不影響恢復(fù)
若使用 v2 備份數(shù)據(jù)時(shí)存在 v3 的數(shù)據(jù)則恢復(fù)失敗
對(duì)于 API 2 備份與恢復(fù)方法
etcd的數(shù)據(jù)默認(rèn)會(huì)存放在我們的命令工作目錄中,我們發(fā)現(xiàn)數(shù)據(jù)所在的目錄,會(huì)被分為兩個(gè)文件夾中:
snap: 存放快照數(shù)據(jù),etcd防止WAL文件過(guò)多而設(shè)置的快照,存儲(chǔ)etcd數(shù)據(jù)狀態(tài)。
wal: 存放預(yù)寫式日志,最大的作用是記錄了整個(gè)數(shù)據(jù)變化的全部歷程。在etcd中,所有數(shù)據(jù)的修改在提交前,都要先寫入到WAL中。
# etcdctl backup --data-dir /home/etcd/ --backup-dir /home/etcd_backup
# etcd -data-dir=/home/etcd_backup/ -force-new-cluster
恢復(fù)時(shí)會(huì)覆蓋 snapshot 的元數(shù)據(jù)(member ID 和 cluster ID),所以需要啟動(dòng)一個(gè)新的集群。
對(duì)于 API 3 備份與恢復(fù)方法
在使用 API 3 時(shí)需要使用環(huán)境變量 ETCDCTL_API 明確指定。
在命令行設(shè)置:
# export ETCDCTL_API=3
備份數(shù)據(jù):
# etcdctl --endpoints localhost:2379 snapshot save snapshot.db
恢復(fù):
# etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data
恢復(fù)后的文件需要修改權(quán)限為 etcd:etcd
--name:重新指定一個(gè)數(shù)據(jù)目錄,可以不指定,默認(rèn)為 default.etcd
--data-dir:指定數(shù)據(jù)目錄
建議使用時(shí)不指定 name 但指定 data-dir,并將 data-dir 對(duì)應(yīng)于 etcd 服務(wù)中配置的 data-dir
etcd 集群都是至少 3 臺(tái)機(jī)器,官方也說(shuō)明了集群容錯(cuò)為 (N-1)/2,所以備份數(shù)據(jù)一般都是用不到,但是鑒上次 gitlab 出現(xiàn)的問(wèn)題,對(duì)于備份數(shù)據(jù)也要非常重視。