etcd集群恢复、单节点恢复操作手册

在这里插入图片描述

一、集群备份

备份方式:Jenkins触发每小时的定时任务,通过调取ansible的playbook进行etcd集群的数据备份和上传,默认只备份集群中的非leader成员,避免leader成员压力过大。将备份数据上传到对应的公有云对象存储,分别上传到两个不同的对象存储的目录下,以适配不同目录下的不同生命周期规则,a目录每小时上传,生命周期为保留近3天的每小时的数据备份;b目录为只有当时间为0点、12点才进行上传,生命周期为保留近15天的数据备份,每天有2次备份。

备份命令:

/usr/local/bin/etcdctl --endpoints {{ ansible_default_ipv4.address }}:2379 snapshot save {{ local_tar_dir }}{{ dump_name }}
#ansible_default_ipv4.address:本机的IP地址
#local_tar_dir:本地的保存路径
#dump_name:备份名字

二、整个集群还原

前言

​ 生产环境中,经常遇到etcd集群出现单节点故障或者集群故障。针对这两种情况,进行故障修复。以下为介绍etcd的集群全部节点故障时,故障应急的恢复手册

1、从公有云下载备份文件

#obs华为云
sudo /usr/local/bin/obsutil ls obs://jws2-live-cn-backup-01/db-etcd/2024-03-28/05/ -s | grep "_master"
sudo /usr/local/bin/obsutil cp {{ first_tarball }} /tmp/snapshot.db#gcp谷歌云
/bin/gsutil ls gs://{{cloud_backup_bucket}}/db-etcd/{{now_date}}/{{now_hour}}/
/bin/gsutil  cp  {{ backup_file.stdout }}   /tmp/snapshot.db

2、备份当前etcd集群

执行jenkins任务,或者手动执行命令

/usr/local/bin/etcdctl --endpoints {{ ansible_default_ipv4.address }}:2379 snapshot save {{ local_tar_dir }}{{ dump_name }}
#{{ local_tar_dir }}{{ dump_name }}:备份保存的目标目录和文件名

3、停止etcd集群

sudo systemctl stop etcd

4、移除原有目录

#移除原有目录
sudo mv /opt/etcd/etcd-data /opt/etcd/etcd-data_bak
#创建新目录
sudo mkdir /opt/etcd/etcd-data

5、还原etcd数据库(三节点)

建议使用etcdutl命令

先将etcdutl命令移动

sudo cp /opt/etcd/etcd-data/etcd-v3.5.0-linux-amd64/etcdutl /usr/local/bin/etcdutl

每台机器上都需要进行还原,从快照恢复时,您可以直接将新成员信息提供到数据存储中

$ etcdutl 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 \--data-dir=/opt/etcd/etcd-data$ etcdutl 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 \--data-dir=/opt/etcd/etcd-data$ etcdutl 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 \--data-dir=/opt/etcd/etcd-data

启动etcd集群

sudo  systemctl start etcd

6、检查新集群

检查每个etcd的数据大小和成员信息

sudo etcdctl --endpoints=http://192.168.1.5:2380,http://192.168.0.142:2380,http://192.168.1.175:2380,http://192.168.1.99:2380,http://192.168.0.70:2380 endpoint status -w tablesudo etcdctl member list

检查日志是否有异常

7、集群还原注意事项

etcd集群还原有一些坑,应当慎重执行还原操作!

当使用备份进行整个集群的还原时,集群间的数据不会自动同步,必须每台都要进行还原,切记!一定要使用同一份备份数据进行所有节点的还原。

第一次进行测试时,共有三节点,只将节点1进行了还原,2、3节点没有进行还原,2、3节点也没有数据,但是集群依然可以启动,并且2、3节点上也没有数据,集群的运行状态正常,还可以正常对外提供服务,很是诡异。

去集群get某个key,只会有三分之一的概率会获取到。也是说raft协议在这时并不会生效,这时候在写入key,集群间同步正常,可以正常获取到这个key。

因为我们在还原集群的时候指定了新的元数据,还原后的集群可以认为是一个新的集群,通过上述的情况可知,即便是集群的三个节点恢复了不同的数据,集群也不会进行数据校验,当集群运行后,raft协议才会生效,raft只会同步“新”集群后写入的数据。

三、集群单节点故障处理

前言

​ 生产环境中,经常遇到etcd集群出现单节点故障或者集群故障。针对这两种情况,进行故障修复。本文介绍etcd的单节点故障时,故障应急的恢复手册

1、恢复流程

由于etcd的raft协议,整个集群能够容忍的故障节点数为(n-1)/ 2,因此在单个节点故障时,单个集群的仍然可用,不会影响业务的读写。

整体的恢复流程如下

集群member rmove异常节点–>异常节点删除脏数据–>集群member add节点–>集群完成数据同步并恢复

2、详细恢复步骤
(1)查看集群状态

通过member remove命令删除异常节点,此时整个集群只有2个节点,不会触发master重新选主,集群正常运行。

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)删除异常节点
MEMBER_ID=278c654c9a6dfd3b
etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379,${HOST_3}:2379 \member remove ${MEMBER_ID}
(2)删除异常节点数据
#移除原有目录
sudo mv /opt/etcd/etcd-data /opt/etcd/etcd-data_bak
#创建新目录
sudo mkdir /opt/etcd/etcd-data
(3)集群中重新添加节点

通过如下命令,将异常节点添加到集群中,等对应的节点启动后,就会自动完成集群数据同步和选主

export ETCDCTL_API=3
NAME_1=etcd-node-1
NAME_2=etcd-node-2
NAME_3=etcd-node-3
HOST_1=10.240.0.13
HOST_2=10.240.0.14
HOST_3=10.240.0.16 # 故障成员
etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379 \member add ${NAME_3} \--peer-urls=http://${HOST_3}:2380
(4)启动节点

注意:

由于etcd的数据已经被删除,因此当前节点重启时,从其他的节点获取数据,因此需要调整参数–initial-cluster-state,从new改成existing

TOKEN=my-etcd-token-1
CLUSTER_STATE=existing
NAME_1=etcd-node-1
NAME_2=etcd-node-2
NAME_3=etcd-node-3
HOST_1=10.240.0.13
HOST_2=10.240.0.14
HOST_3=10.240.0.16 # 故障成员
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
etcd --data-dir=data.etcd --name ${THIS_NAME} \--initial-advertise-peer-urls http://${THIS_IP}:2380 \--listen-peer-urls http://${THIS_IP}:2380 \--advertise-client-urls http://${THIS_IP}:2379 \--listen-client-urls http://${THIS_IP}:2379 \--initial-cluster ${CLUSTER} \--initial-cluster-state existing \--initial-cluster-token ${TOKEN}
(5)等待集群数据完成同步并恢复
export ETCDCTL_API=3
export ETCD_ENDPOINTS=10.240.0.13:2379,10.240.0.14:2379,10.240.0.16:2379
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table member list
etcdctl --endpoints=$ETCD_ENDPOINTS --write-out=table endpoint status

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024初会押题来了!经济法和实务,内部资料,赶快做一做!

初级会计考试考前冲刺策略 1. 核心知识点掌握 考前冲刺首先需要对核心知识点进行梳理和重点复习。《初级会计实务》和《经济法基础》是考试的两个主要科目,考生需要确保对其中的高频考点有深刻的理解。 2. 高效记忆技巧 对于容易遗忘的知识点,可以采用…

Bootloader+升级方案

随着设备的功能越来越强大,系统也越来越复杂,产品升级也成为了开发过程不可或缺的一道程序。在工程应用中,如何在不更改硬件的前提下通过软件的方式实现产品升级。通过Bootloader来实现固件的升级是一种极好的方式,Bootloader是单…

Springboot HelloWorld

新建一个maven工程 引入依赖项 <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version><…

ST表(静态RMQ问题)

static Range Max/Min Query ST表 利用的是动态规划的思想 状态&#xff1a; //st[i][j]-->区间长度为1<<j&#xff0c;在区间[i,i1<<j-1]上的最值 状态转移方程&#xff1a; st[i][j]max(st[i][j-1],st[i(1<<j-1)][j-1]);#include <iostream> #inc…

vue3延迟加载(异步组件​)defineAsyncComponent

最简单用法 Index.vue: <script setup> import { onMounted, defineAsyncComponent } from vue import ./index.cssconst Child defineAsyncComponent(() > import(./Child.vue))onMounted(() > {}) </script><template><div class"m-home-w…

C/C++:Windows中的静态链接库

静态链接库 静态链接库是在编译时将库的代码和数据复制到可执行文件中&#xff1b;这意味着最终的可执行文件包含了程序所需的所有函数和数据&#xff0c;因此它在运行时是完全独立的。 静态链接库工作原理&#xff1a; 开发人员创建一个或多个静态链接库&#xff0c;其中包含…

vue3.0(八) 监听器(watch),高级监听器(watchEffect)

文章目录 watch1 watch的用法2 watch的高级用法3 watch性能优化 watchEffect1 停止监听2 侦听多个状态3 懒执行 watch和watchEffect的区别watch和computed的区别 watch watch特性进行了一些改变和优化。与computed不同&#xff0c;watch通常用于监听数据的变化&#xff0c;并执…

【数据结构】详解栈且实现

一.栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…

《Mybatis》系列文章目录

什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

动手学深度学习18 预测房价竞赛总结

动手学深度学习18 预测房价竞赛总结 李沐老师代码AutoGluonh2o集成学习automlQA 视频&#xff1a; https://www.bilibili.com/video/BV15Q4y1o7vc/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 代码&#xff1a; https://www.bilibili.com/video/BV1rh411m7Hb/?vd_sourceeb04…

【强训笔记】day21

NO.1 思路&#xff1a;第一个位置放最小的&#xff0c;其次放最大的&#xff0c;依次类推。 代码实现&#xff1a; #include<iostream>using namespace std; int n;int main() {cin>>n;int left1,rightn;while(left<right){cout<<left<<" &…

华中科大:感谢大家,我的春招之旅结束了

今天在论坛上看到一个帖子&#xff0c;一位华中科大的同学&#xff0c;因为家中父亲突然病倒&#xff0c;发求助帖&#xff1a; 请问大家&#xff0c;春招走哪个方向能最快找到工作&#xff1f;还是说继续读研呢&#xff0c;但是家里急需钱…… 当时这个帖子直接热榜第一&…