K&

灾难恢复

 

etcd 被设计为能承受机器失败。etcd 集群自动从临时失败(例如,机器重启)中恢复,而且对于一个有 N 个成员的集群能容许 (N-1)/2 的持续失败。当一个成员持续失败时,不管是因为硬件失败或者磁盘损坏,它丢失到集群的访问。如果集群持续丢失超过 (N-1)/2 的成员,则它只能悲惨的失败,无可救药的失去仲裁。一旦仲裁丢失,集群无法达到一致而因此无法继续接收更新。

为了从灾难失败中恢复,etcd v3 提供快照和修复工具来重建集群而不丢失 v3 键数据。要恢复 v2 的键,参考v2 管理指南.

 

快照键空间

 

恢复集群首先需要来自 etcd 成员的键空间的快照。快速可以是用 etcdctl snapshot save 命令从活动成员获取,或者是从 etcd 数据目录复制 member/snap/db 文件. 例如,下列命令快照在 $ENDPOINT 上服务的键空间到文件 snapshot.db:

 

这个只能每台设备去备份,不能ep所有的成员(默认备份的文件在当前路径下)

 

etcdctl --endpoints=https://172.21.130.169:2379 snapshot save `date +%F`.db

 

 

etcdctl --endpoints $ENDPOINT snapshot save snapshot.db

 

恢复集群

 

为了恢复集群需要的只是一个简单的快照 “db” 文件。使用 etcdctl snapshot restore 的集群,恢复创建新的 etcd 数据目录(即使数据文件不在了但是如果文件夹还在,那么在回滚的时候,就会因为文件夹的存在而报错。这就是新建数据目录的意思。);所有成员应该使用相同的快照恢复恢复覆盖某些快照元数据(特别是,成员ID和集群ID);成员丢失它之前的标识。这个元数据覆盖防止新的成员不经意间加入已有的集群。因此为了从快照启动集群,恢复必须启动一个新的逻辑集群。(最后一句话的意思就是用备份的快照数据按照etcdctl指定新的配置参数,重新建立集群,不过数据是以前的数据。)

 

 

{"level":"info","ts":1621503919.9224617,"caller":"snapshot/v3_snapshot.go:309","msg":"restored snapshot","path":"2021-05-20.db","wal-dir":"/var/local/etcd/data/member/wal","data-dir":"/var/local/etcd/data","snap-dir":"/var/local/etcd/data/member/snap"}

 

 

 

 

在恢复时快照完整性的检验是可选的。如果快照是通过 etcdctl snapshot save 得到的,它将有一个被 etcdctl snapshot restore 检查过的完整性hash。如果快照是从数据目录复制而来,没有完整性hash,因此它只能通过使用 --skip-hash-check 来恢复。

恢复初始化新集群的新成员,带有新的集群配置,使用 etcd 的集群配置标记,但是保存 etcd 键空间的内容。继续上面的例子,下面为一个3成员的集群创建新的 etcd 数据目录(m1.etcdm2.etcdm3.etcd):

 

恢复过程

 

先把之前的数据目录删除不然会因为“恢复创建新的 etcd 数据目录”报错,原因上面说了,错误也代码摘出做了标注可以简单看看。因为是用现有的数据所以记得把状态改成existing

 

etcdctl snapshot restore 2021-05-20.db --data-dir="/var/local/etcd/data"

 

 

$ etcdctl snapshot restore snapshot.db \
--name m1 \
--initial-cluster m1=http:/host1:2380,m2=http://host2:2380,m3=http://host3:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-advertise-peer-urls http://host1:2380

$ etcdctl snapshot restore snapshot.db \ --name m2 \ --initial-cluster m1=http:/host1:2380,m2=http://host2:2380,m3=http://host3:2380 \ --initial-cluster-token etcd-cluster-1 \ --initial-advertise-peer-urls http://host2:2380

$ etcdctl snapshot restore snapshot.db \ --name m3 \ --initial-cluster m1=http:/host1:2380,m2=http://host2:2380,m3=http://host3:2380 \ --initial-cluster-token etcd-cluster-1 \ --initial-advertise-peer-urls http://host3:2380

 

下一步, 用新的数据目录启动 etcd :

 

$ etcd \
--name m1 \
--listen-client-urls http://host1:2379 \
--advertise-client-urls http://host1:2379 \
--listen-peer-urls http://host1:2380 &


$ etcd \
--name m2 \
--listen-client-urls http://host2:2379 \
--advertise-client-urls http://host2:2379 \
--listen-peer-urls http://host2:2380 &


$ etcd \
--name m3 \
--listen-client-urls http://host3:2379 \
--advertise-client-urls http://host3:2379 \
--listen-peer-urls http://host3:2380 &

 

现在恢复的集群可以使用并提供来自快照的键空间服务.

posted on 2021-05-11 18:11  K&  阅读(397)  评论(0编辑  收藏  举报