ETCD集群故障应急恢复-从snapshot恢复

系列文章目录



前言

如果整个etcd集群的所有节点宕机,并且通过常规节点重启,无法完成选主,集群无法恢复。本文针对这种情况进行集群恢复指导。如果本地的数据已经损坏,只能通过历史的snapshot进行恢复(前提是保存有snapshot数据)


一、总体恢复流程

整体的恢复流程如下

选择一个snapshot数据
选择一个节点并进行数据恢复
使用强启动的方式启动一个单节点集群
逐一将其他节点添加到集群中
集群完成数据同步并恢复

二、集群故障恢复

2.1 环境信息

使用本地的vmstation创建3个虚拟机,信息如下

节点名称节点IP节点配置操作系统Etcd版本Docker版本
etcd1192.168.82.1281c1g 20gCentOS7.4v3.513.1
etcd2192.168.82.1291c1g 20gCentOS7.4v3.513.1
etcd3192.168.82.1301c1g 20gCentOS7.4v3.513.1

模拟数据,并查看数据情况

export ETCDCTL_API=3
ETCD_ENDPOINTS=192.168.92.128:2379,192.168.92.129:2379,192.168.92.130:2379
for i in {1..100};do etcdctl --endpoints=$ETCD_ENDPOINTS put "/foo-$i" "hello";done
etcdctl --endpoints=$ETCD_ENDPOINTS  get / --prefix --keys-only|wc -l

进行snapshot备份

export ETCDCTL_API=3
ETCD_ENDPOINTS=192.168.92.128:2379
etcdctl --endpoints=$ETCD_ENDPOINTS  snapshot save snapshot.db

备份文件为snapshot.db

2.2 选择一个节点恢复备份数据

2.2.1 从snapshot数据恢复

mv /data/etcd /data/etcd.bak
export ETCDCTL_API=3
ETCD_ENDPOINTS=192.168.92.128:2379
etcdctl --endpoints=$ETCD_ENDPOINTS  snapshot restore snapshot.db --name=etcd1 --initial-cluster etcd1=http://192.168.92.128:2380 --initial-advertise-peer-urls http://192.168.92.128:2380 --data-dir=/data/etcd

在这里插入图片描述

2.2.2 etcd1节点需要调整启动参数,启动脚本如下

[root@host-1 /]# cat start_etcd_with_force_new_cluster.sh 
#! /bin/sh

name="etcd1"
host="192.168.92.128"
cluster="etcd1=http://192.168.92.128:2380"

docker run -d --privileged=true  -p 2379:2379  -p 2380:2380 -v /data/etcd:/data/etcd   --name $name --net=host  quay.io/coreos/etcd:v3.5.0   /usr/local/bin/etcd --name $name   --data-dir /data/etcd   --listen-client-urls http://$host:2379  --advertise-client-urls http://$host:2379 --listen-peer-urls http://$host:2380   --initial-advertise-peer-urls http://$host:2380   --initial-cluster $cluster  --initial-cluster-token tkn   --initial-cluster-state new --force-new-cluster  --log-level info   --logger zap   --log-outputs stderr

关键参数如下

  • –data-dir /data/etcd,需要从当前保存的数据目录加载
  • –force-new-cluster,强制启动集群
  • –initial-cluster-state new,启动一个新集群,跟–force-new-cluster配合使用
  • –initial-cluster $cluster,只配置本节点,形成一个单节点集群

2.2.3 查看数据是否一致

export ETCDCTL_API=3
ETCD_ENDPOINTS=192.168.92.128:2379
etcdctl --endpoints=$ETCD_ENDPOINTS  get / --prefix --keys-only|wc -l

在这里插入图片描述
2.2.4 验证集群是否启动

export ETCDCTL_API=3
export ETCD_ENDPOINTS=192.168.92.128:2379
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table member list
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table endpoint status

在这里插入图片描述

2.2 添加第二个节点

2.2.1 添加第2个节点到集群中

export ETCDCTL_API=3
export ETCD_ENDPOINTS=192.168.92.128:2379
etcdctl --endpoints=$ETCD_ENDPOINTS member add etcd2 --peer-urls=http://192.168.92.129:2380

在这里插入图片描述
此时由于整体集群是2个节点,第2个节点没有启动,因此不符合raft协议,第1个节点会宕机,需要尽快将第2个节点启动,整体集群才能恢复正常。

2.2.2 删除第2个节点的数据

mv /data/etcd /data/etcd.bak
mkdir -p /data/etcd/

备份数据(以防万一),并创建一个空的数据目录,启动时加入到集群中,并同步数据

2.2.2 启动第2个节点
第2个节点的启动脚本如下

[root@host-2 /]# cat start_etcd.sh 
#! /bin/sh

name="etcd2"
host="192.168.92.129"
cluster="etcd1=http://192.168.92.128:2380,etcd2=http://192.168.92.129:2380"

docker run -d --privileged=true  -p 2379:2379  -p 2380:2380 -v /data/etcd:/data/etcd   --name $name --net=host  quay.io/coreos/etcd:v3.5.0   /usr/local/bin/etcd --name $name   --data-dir /data/etcd   --listen-client-urls http://$host:2379  --advertise-client-urls http://$host:2379 --listen-peer-urls http://$host:2380   --initial-advertise-peer-urls http://$host:2380   --initial-cluster $cluster  --initial-cluster-token tkn   --initial-cluster-state existing   --log-level info   --logger zap   --log-outputs stderr

关键参数如下

  • –data-dir /data/etcd,需要从当前保存的数据目录加载
  • –initial-cluster-state existing,加入已有集群
  • –initial-cluster $cluster,只配置2个节点,形成一个2节点集群

2.2.3 查看集群状态

export ETCDCTL_API=3
export ETCD_ENDPOINTS=192.168.92.128:2379,192.168.92.129:2379
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table member list
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table endpoint status
etcdctl --endpoints=$ETCD_ENDPOINTS  get / --prefix --keys-only|wc -l

在这里插入图片描述

说明
1、etcd的raft协议进行选主时,会考虑数据的offset,offset越大,倾向于获取选主的选票,因此在这种情况下,会选择etcd1作为主

2.3 添加第三个节点

2.2.1 添加第3个节点到集群中

export ETCDCTL_API=3
export ETCD_ENDPOINTS=192.168.92.128:2379
etcdctl --endpoints=$ETCD_ENDPOINTS member add etcd3 --peer-urls=http://192.168.92.130:2380

在这里插入图片描述

此时由于整体集群是3个节点,已经有2个节点正常,因此添加第3个节点并不会影响当前的选主情况。

2.2.2 删除第3个节点的数据

mv /data/etcd /data/etcd.bak
mkdir -p /data/etcd/

备份数据(以防万一),并创建一个空的数据目录,启动时加入到集群中,并同步数据

2.2.2 启动第3个节点
第2个节点的启动脚本如下

[root@host-2 /]# cat start_etcd.sh 
#! /bin/sh

name="etcd3"
host="192.168.92.130"
cluster="etcd1=http://192.168.92.128:2380,etcd2=http://192.168.92.129:2380,etcd3=http://192.168.92.130:2380"

docker run -d --privileged=true  -p 2379:2379  -p 2380:2380 -v /data/etcd:/data/etcd   --name $name --net=host  quay.io/coreos/etcd:v3.5.0   /usr/local/bin/etcd --name $name   --data-dir /data/etcd   --listen-client-urls http://$host:2379  --advertise-client-urls http://$host:2379 --listen-peer-urls http://$host:2380   --initial-advertise-peer-urls http://$host:2380   --initial-cluster $cluster  --initial-cluster-token tkn   --initial-cluster-state existing   --log-level info   --logger zap   --log-outputs stderr

关键参数如下

  • –data-dir /data/etcd,需要从当前保存的数据目录加载
  • –initial-cluster-state existing,加入已有集群
  • –initial-cluster $cluster,配置3个节点,形成一个3节点集群

2.2.3 查看集群状态

export ETCDCTL_API=3
export ETCD_ENDPOINTS=192.168.92.128:2379,192.168.92.129:2379,192.168.92.130:2379
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table member list
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table endpoint status

在这里插入图片描述

2.4 调整第1个节点的启动参数

第1个节点的启动参数按照如下方式调整,否则每次第1个节点重启后,会重新创建一个集群,明显是不合适的。

[root@host-2 /]# cat start_etcd.sh 
#! /bin/sh

name="etcd1"
host="192.168.92.128"
cluster="etcd1=http://192.168.92.128:2380,etcd2=http://192.168.92.129:2380,etcd3=http://192.168.92.130:2380"

docker run -d --privileged=true  -p 2379:2379  -p 2380:2380 -v /data/etcd:/data/etcd   --name $name --net=host  quay.io/coreos/etcd:v3.5.0   /usr/local/bin/etcd --name $name   --data-dir /data/etcd   --listen-client-urls http://$host:2379  --advertise-client-urls http://$host:2379 --listen-peer-urls http://$host:2380   --initial-advertise-peer-urls http://$host:2380   --initial-cluster $cluster  --initial-cluster-token tkn   --initial-cluster-state existing   --log-level info   --logger zap   --log-outputs stderr

并重启etcd1节点


总结

snapshot是备份的数据,也是最终的数据手段。 由于snapshot的备份一般是周期性的,会有一定的数据丢失。因此最好的选择,应当优先从现有的数据恢复

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的 Etcd 集群已经崩溃或不可用,您可以使用备份的数据将其恢复到另一个 Etcd 集群。以下是恢复过程的步骤: 1. 确保您有可用的 Etcd 数据备份。在备份数据之前,请确保 Etcd 集群处于正常运行状态。 2. 创建一个新的 Etcd 集群。您可以使用相同的版本和配置选项,也可以使用不同的版本和配置选项。确保新的集群至少有与原始集群相同数量的成员。 3. 将备份数据复制到新集群中的至少一个成员节点上。 4. 使用 Etcdctl 工具将备份数据从成员节点恢复到新集群。您可以使用以下命令: ``` etcdctl snapshot restore backup.db \ --initial-cluster new-node-1=https://10.0.1.10:2380,new-node-2=https://10.0.1.11:2380,new-node-3=https://10.0.1.12:2380 \ --initial-cluster-token etcd-cluster-1 \ --initial-advertise-peer-urls https://10.0.1.10:2380 \ --name new-node-1 ``` 这里的 `backup.db` 是备份数据的文件名,`new-node-1` 是新集群中的节点名称,`https://10.0.1.10:2380` 是新集群中的节点 URL。 5. 启动新集群中的所有成员节点,并确保它们已经成功加入了集群。您可以使用以下命令检查成员节点状态: ``` etcdctl --endpoints=https://10.0.1.10:2379,https://10.0.1.11:2379,https://10.0.1.12:2379 member list ``` 如果所有成员节点都成功加入了集群,则可以开始使用新集群。 请注意,恢复过程可能需要一些时间,具体取决于备份数据的大小和集群的规模。因此,请确保备份数据是最新的,并且在恢复过程中保持耐心。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值