es master 节点数据丢失导致数据节点加入集群失败的灾难恢复

文章目录

    • @[toc]
    • 前情提要
    • 解决方案
      • 解决流程
      • 实践过程
        • 停止 es 节点
        • master 节点增加数据持久化
        • 新建 es-node-tools pod
        • 使用 elasticsearch-node 命令
        • dangling 悬空索引

前情提要

部署的架构可以看我之前的博客:k8s 使用 helm 文件部署 8.12.2 es 分角色集群,当时部署 master 角色的时候,没有给节点配置持久化,导致所有节点都下线后重新启动,data 节点无法加入集群,data 节点会有类似下面这样的报错(报错的内容非常的长,这里只截取关键的信息)

This node previously joined a cluster with UUID [n9CFoZ_yTi6zkdJcHq6ZbQ] and is now trying to join a different cluster with UUID [bGyuhfljQxyT5oEMrWH-aA]. This is forbidden and usually indicates an incorrect discovery or cluster bootstrapping configuration. Note that the cluster UUID persists across restarts and can only be changed by deleting the contents of the node's data paths [] which will also remove any data held by this node
  • 报错的原因是 master 节点和 data 节点都需要做数据持久化,因为这两个角色都会保存集群元数据,可以看官方的 Node data path settings 里面写的 Every data and master-eligible node requires access to a data directory where shards and index and cluster metadata will be stored

解决方案

  • 官方文档
    • node-tool
    • List dangling indices API
    • Import dangling index API

解决流程

  • 停止所有 es 集群的服务
    • 相关的依赖服务都要停止,比如 logstash,filebeat 这种 output 是 es 的,都需要停止
  • 给 master 节点增加 pvc ,对数据目录增加持久化功能
  • 新建一个 pod 挂载所有数据节点的 pvc
  • 使用 elasticsearch-node detach-cluster 命令清除掉集群元数据(集群的 _cluster/setting 也会被清除)
  • 使用 dangling api 还原本地磁盘的数据到 data 节点

实践过程

这里是拿自己的学习环境来模拟的,毕竟这种场景也是百分百复现的,也能完美做到数据脱敏的效果

停止 es 节点
  • data 节点一定要停了,才可以操作 elasticsearch-node detach-cluster 命令,前面提到的上下游依赖,记得都停了,避免造成数据丢失
  • 下面是我环境的内容,大家替换成自己环境的相关信息,作用是把 statefulset 的副本数改为 0,让服务实现下线的场景(直接 yaml 来 delete 和 apply 是一件非常危险的事情,但凡有 edit 的操作没更新 yaml 的,重启之后就废了)
k scale sts -n es-logs es-cluster-data --replicas=0
master 节点增加数据持久化

这一步就不细致拆解了,参考我之前的 helm 部署博客,创建好 pv 和 pvc,然后把 persistence.enabled 配置成 true,然后执行 helm upgrade xxx -f xxx 来更新 master 节点就可以了

新建 es-node-tools pod
  • 利用 es 官方镜像和 pvc 挂载来实现集群元数据的清除操作
    • 我这边是挂的 local-path 类型的 pv,并且做了节点绑定的,所以我没办法一个 pod 挂载多个 pvc
    • 如果大家的环境是共享存储的,如果做了 subPathExpr 的配置,记得下面的 yaml 里面自己增加一下,把对应的共享存储路径全部挂载到一个 pod 里面,方便操作
    • 注意 namespace 和 image 的替换
    • 如果本地数据比较大的话,建议把 limits 配置的和数据节点的一样
apiVersion: v1
kind: Pod
metadata:annotations:labels:app: es-node-toolsname: es-node-toolsnamespace: es-logs
spec:automountServiceAccountToken: truecontainers:- image: docker.elastic.co/elasticsearch:8.12.2imagePullPolicy: IfNotPresentname: elasticsearchargs: ["bash","-c","tail -f /dev/null"]resources:limits:cpu: "1"memory: 2Girequests:cpu: 100mmemory: 1GisecurityContext:capabilities:drop:- ALLrunAsNonRoot: truerunAsUser: 1000terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /usr/share/elasticsearch/data/data-0name: data0# - mountPath: /usr/share/elasticsearch/data/data-1#   name: data1# - mountPath: /usr/share/elasticsearch/data/data-2#   name: data2dnsPolicy: ClusterFirstenableServiceLinks: truerestartPolicy: AlwaysschedulerName: default-schedulersecurityContext:fsGroup: 1000runAsUser: 1000terminationGracePeriodSeconds: 120volumes:- name: data0persistentVolumeClaim:claimName: es-cluster-data-es-cluster-data-0# - name: data1#   persistentVolumeClaim:#     claimName: es-cluster-data-es-cluster-data-1# - name: data2#   persistentVolumeClaim:#     claimName: es-cluster-data-es-cluster-data-2

创建 pod

k apply -f es-node-tools.yaml

进入 pod

k exec -it -n es-logs es-node-tools bash
使用 elasticsearch-node 命令

-E path.data 指定 pvc 挂载的目录,如果是多个 pvc 都挂载到 pod 里面的不同地址的时候,这个参数就可以不用频繁的修改 pod 的挂载地址一个个处理了

elasticsearch-node detach-cluster -E path.data=/usr/share/elasticsearch/data/data-0

正常情况下,会返回下面这样的输出,输入 y 然后回车,会返回 Node was successfully detached from the cluster

------------------------------------------------------------------------WARNING: Elasticsearch MUST be stopped before running this tool.Jul 21, 2024 10:37:09 AM org.apache.lucene.store.MemorySegmentIndexInputProvider <init>
INFO: Using MemorySegmentIndexInput with Java 21; to disable start with -Dorg.apache.lucene.store.MMapDirectory.enableMemorySegments=false
------------------------------------------------------------------------You should only run this tool if you have permanently lost all of the
master-eligible nodes in this cluster and you cannot restore the cluster
from a snapshot, or you have already unsafely bootstrapped a new cluster
by running `elasticsearch-node unsafe-bootstrap` on a master-eligible
node that belonged to the same cluster as this node. This tool can cause
arbitrary data loss and its use should be your last resort.Do you want to proceed?Confirm [y/N]
  • 如果上面的命令执行,出现了 oom 的情况,可以使用下面的命令,然后再次执行 elasticsearch-node detach-cluster 命令
  • 官方默认 CLI 工具的 jvm 是 64MB,可以通过增加 jvm 来解决 oom 的问题
export CLI_JAVA_OPTS="-Xmx1g"

每一个 data 节点的数据目录,都需要执行上面的操作,都执行完成后,可以把 es-node-tools 这个 pod 下线了

k delete -f es-node-tools.yaml

启动 es 数据节点

千万别照搬,注意自己环境的 statefulset 的名字和副本数量

k scale sts -n es-logs es-cluster-data --replicas=3

es 节点验证

# 进入 es 的 pod
k exec -it -n es-logs es-cluster-master-0 bash
# 查看节点信息
curl -s -u "${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}" "localhost:9200/_cat/nodes?v"
# 查看集群健康
curl -s -u "${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}" "localhost:9200/_cat/health?v"
dangling 悬空索引
  • 有 kibana 的话,就执行下面的 GET 命令,没有的话,建议装一个 kibana,或者使用下面的 curl 命令,把输出的内容,想办法做 json 格式化
# kibana 执行
GET /_dangling
# curl 执行
curl -s -u "${ELASTIC_USERNAME}:${ELASTIC_PASSWORD}" localhost:9200/_dangling

导入 dangling 悬空索引,<index-uuid> 就是上面 GET /_dangling 里面获取到的 index_uuid 字段

POST /_dangling/<index-uuid>?accept_data_loss=true

基于格式化过的 json 格式,可以借鉴下面的命令直接生成 curl 命令,然后放到 pod 里面执行就可以了

awk -F '"' '/index_uuid/ {print "curl -s -XPOST -u ""${ELASTIC_USERNAME}:${ELASTIC_PASSWORD} " "localhost:9200/_dangling/"$4"?accept_data_loss=true"}' xxx.json

剩下就是无尽的等待

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

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

相关文章

【软考】UML中的关联关系

目录 一、说明二、具体类型2.1 普通关联2.2 单向关联2.3 双向关联2.4 自关联2.4 聚合关系&#xff08;Aggregation&#xff09;2.5 组合关系&#xff08;Composition&#xff09; 三、关联关系中的多重性 一、说明 1.UML&#xff08;Unified Modeling Language&#xff0c;统一…

【Ubuntu】Ubuntu系统镜像

清华镜像源 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /ubuntu-releases/ | 清华大学开源软件镜像站&#xff0c;致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务&#xff0c;帮助用户更方便地获取开源软…

测开知识点合集2

一、try .... catch.. AccessViolationException异常触发后&#xff0c;下列程序的输出结果为 static void Main(string[] args) { try { throw new AccessViolationException(); Console.WriteLine("error1"); } catch (Exception e) { Console.WriteLi…

stm32学习:(寄存器2)GPIO总体说明

目录 GPIO的主要特点 GPIO的8种工作模式 GPIO电路结构 GPIO输出模式 输出流程 复用输出模式 GPIO输入模式 输入流程 模拟输入流程 GPIO相关的7个寄存器 GPIOx_CRL GPIOx_CRH GPIOx_IDR GPIOx_ODR GPIOx_BSRR GPIOx_BRR GPIOx_LCKR 实例 三个灯流水灯 main.…

C语言基础 9. 指针

C语言基础 9. 指针 文章目录 C语言基础 9. 指针9.1. &9.2. 指针9.3. 指针的使用9.4. 指针与数组9.5. 指针与const9.6. 指针运算9.7. 动态内存分配 9.1. & 运算符&: scanf(“%d”, &i);里的& 获得变量的地址, 它的操作数必须是变量 int i;printf(“%x”, &…

CSS中如何实现鼠标悬停效果?

在CSS中&#xff0c;您可以使用:hover伪类来实现鼠标悬停效果。:hover伪类会在用户将鼠标悬停在选择器所匹配的元素上时应用指定的样式。 下面是一个简单的例子&#xff0c;展示了如何在鼠标悬停时改变文本颜色和背景颜色&#xff1a; <!DOCTYPE html> <html lang&qu…

【SpringBoot Web开发之静态资源访问】笔记

详细内容见官方文档&#xff1a;Static Content SpringBoot Web开发之静态资源访问 1.准备工作&#xff1a;创建WebDemo2.静态资源目录2.1官网原文2.2静态资源目录第一步&#xff1a;依照上面2.1官网原文中创建如下目录第二步&#xff1a;复制粘贴图片到静态资源目录中第三步…

MySQL:JOIN 多表查询

多表查询 在关系型数据库中&#xff0c;表与表之间是有联系的&#xff0c;它们通过 外键 联系在一起&#xff0c;所以在实际应用中&#xff0c;经常使用多表查询。多表查询就是同时查询两个或两个以上的表。 MySQL多表查询是数据库操作中非常重要的一部分&#xff0c;它允许你…

Pandas 33个冷知识 0721

Pandas 33个冷知识 从Excel读取数据: 使用 pd.read_excel(file.xlsx) 来读取Excel文件。 写入Excel: 使用 df.to_excel(file.xlsx, indexFalse) 将DataFrame写入Excel文件。 创建日期索引: 使用 df.set_index(pd.to_datetime(df[date])) 创建日期索引。 向后填充缺失值: 使用…

【深入理解SpringCloud微服务】浅析微服务注册中心Eureka与nacos,手写实现一个微服务注册中心

【深入理解SpringCloud微服务】浅析微服务注册中心Eureka与nacos&#xff0c;手写实现一个微服务注册中心 注册中心手写实现一个注册中心服务端设计客户端设计 注册中心 注册中心是微服务体系里面非常重要的一个核心组件&#xff0c;它最重要的作用就是实现服务注册与发现。 …

【MyBatisPlus】快速掌握MP插件使用方法

一、MyBatis-Plus简介 1.1 简介 1.2 特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象操作强大的 CRUD 操作&#x…

【ACM独立出版|EI检索稳定】2024年智能感知与模式识别国际学术会议(ISPC 2024,9月6日-8)

2024年智能感知与模式识别国际学术会议 (ISPC 2024)将于2024年9月6日-8日于中国青岛召开。 会议将围绕智能感知与模式识别等领域中的最新研究成果&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经验&#xff0c;扩大…

初谈Linux信号-=-信号的产生

文章目录 概述从生活角度理解信号Linux中信号信号常见的处理方式理解信号的发送与保存 信号的产生core、term区别 概述 从生活角度理解信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临时&#xff0c; 你该…

机械臂泡水维修|机器人雨后进水维修措施

如果机器人不慎被水淹&#xff0c;别慌&#xff01;我们为你准备了一份紧急的机械臂泡水维修抢修指南&#xff0c;帮助你解决这个问题。 【机器人浸水被淹后紧急维修抢修&#xff5c;如何处理&#xff1f;】 机械臂被淹进水后维修处理方式 1. 机械手淹水后断电断网 首先&am…

Redis 深度历险:核心原理与应用实践 - 读书笔记

目录 第一章 基础应用篇Zset并发问题 - 分布式锁再谈分布式锁客户端在请求时加锁失败策略redis异步队列位图Hyperloglog布隆过滤器GeoHashscan 命令字典结构rehash扩容大 key 扫描 第二章 原理篇线程IO模型RESP 序列化协议持久化管道事务PubSub内存管理 第三章 集群篇CAP主从同…

Grid Puzzle

可以看看官方题解&#xff0c;说一下我的赛时做法 肯定操作二看起来都要优秀得多 不难发现&#xff0c;相邻两行不可能放两个及以上操作一&#xff0c;否则的话直接用两个操作二替代 利用数学归纳法考虑&#xff0c;对于第一行&#xff0c;我们要么用操作二&#xff0c;然后…

shell脚本教程学习

Bash 是 Linux 和 Mac 的默认 Shell&#xff08;命令行环境&#xff09;&#xff0c;系统管理和服务器开发都需要用。 echo命令 echo作用是在屏幕上输入一行文本&#xff0c;可以将该命令的参数输出。一般样式 $ echo "<HTML><HEAD><TITLE>Page Titl…

spring整合mybatis,junit纯注解开发(包括连接druid报错的所有解决方法)

目录 Spring整合mybatis开发步骤 第一步&#xff1a;创建我们的数据表 第二步&#xff1a;编写对应的实体类 第三步&#xff1a;在pom.xml中导入我们所需要的坐标 spring所依赖的坐标 mybatis所依赖的坐标 druid数据源坐标 数据库驱动依赖 第四步&#xff1a;编写SpringC…

Random,ThreadLocalRandom,SecureRandom有什么区别

private final Random randomnew Random(); Make sure that using this pseudorandom number generator is safe here. sonar给出的提示&#xff0c;应该如何修改代码? 根据Sonar的提示&#xff0c;为了确保在多线程环境下使用Random是安全的&#xff0c;您可以使用ThreadL…

linux在ssh的时候询问,yes or no 如何关闭

解决&#xff1a; 在~/.ssh/config文件中添加如下配置项&#xff1a; Host *StrictHostKeyChecking no