记一次Elasticsearch节点状态red的整改过程

2023-11-20

问题起因

自己负责审计日志模块的管理功能,同事突然对我说,写入的日志数据全部不能用了,我立即答复(回怼)“不可能”。
说罢,还是去登录系统查看,能查出数据,只是偶现查询速度特别慢,看控制台,原因是部分请求一直挂起直到超时。
于是登录服务器查看日志,好家伙,果然报错了。

{
	"took":60000,
	"errors":true,
	"items":[
		{
			"index":{
				"_index":"xxx",
				"_type":"xxx",
				"_id":"ohNNCIABQ5H_8lZrABim",
				"status":503,
				"error":{
					"type":"unavailable_shards_exception",
					"reason":"[xxx][4] primary shard is not active Timeout: ..."
				}
			}
		}
	]
}

查询挂起,和写入日志数据失败,均为该错误引起,这哪能忍,直接开干。

Round 1

错误原因也写的很清楚了,主分片不可用
于是查看集群健康状态

//request
{{host}}/_cat/indices

//response
{
    "error": {
        "root_cause": [
            {
                "type": "security_exception",
                "reason": "current license is non-compliant for [security]",
                "license.expired.feature": "security"
            }
        ],
        "type": "security_exception",
        "reason": "current license is non-compliant for [security]",
        "license.expired.feature": "security"
    },
    "status": 403
}

淦,第一反应就是之前加入X-Pack插件时,说过该插件需要付费证书来授权,第一次申请可以免费试用一个月,到期后部分功能会受限。
经过一番查阅资料,得到结果需要如下操作方可接触限制:

1、到Elasticsearch官方申请免费证书;
2、将证书PUT到受限的服务器以将到普通版本;
该方法也就是放弃使用X-Pack的安全功能,回退到普通功能。

于是又是一顿如虎的操作

//申请并下载好证书
{
	"license":{
		"uid":"xxx",
		"type":"basic",
		"issue_date_in_millis":1649376000000,
		"expiry_date_in_millis":1680998399999,
		"max_nodes":100,
		"issued_to":"hoew",
		"issuer":"Web Form",
		"signature":"xxx",
		"start_date_in_millis":1649376000000
	}
}

//将证书PUT到受限服务器
{{host}}/_xpack/license' -d @my.json

//却得到如下结果
{
    "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Installing basic licenses is no longer allowed. Use the POST /_xpack/license/start_basic API to install a basic license that does not expire."
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "Installing basic licenses is no longer allowed. Use the POST /_xpack/license/start_basic API to install a basic license that does not expire."
    },
    "status": 400
}

看起来就是PUT /_xpack/license方法已经废弃了,需要使用POST /_xpack/license/start_basic方法来进行。那还等什么呢,改了调用呗。

Round 2

经过上回合的折腾,总算把证书问题解决了,这下再次调用GET /_cat/indices得到如下信息

red		open xxx xxx 5 0        0       0   1.2kb   1.2kb
red		open xxx xxx 5 0     3975       0   4.7mb   4.7mb
yellow	open xxx xxx 5 0        0       0   1.2kb   1.2kb
...

总之就是好一片红黄交错的胜景,那我们进一步看看是什么原因导致节点的健康状态为red/yellow,于是我们看具体的分片情况

//请求分片情况
GET {{host}}/_cat/shards

//得到如下响应
xxx                     1 p STARTED		367523  60.4mb 10.240.50.103 node-1
xxx                     3 p UNASSIGNED  366494  60.1mb 10.240.50.103 node-1
...

说明这些不健康索引的分片没有都启动起来。当时因为天气炎热,到这步有点冲昏头脑了,折腾了好久,最后突然想到之前该服务器启动ES的时候报存储空间不足,于是思考有没可能是因为存储空间满了导致的呢。
查看错误原因GET {{host}}/_cluster/allocation/explain,得到如下错误信息

cannot allocate because allocation is not permitted to any of the nodes 

于是尝试清除服务器空间

-rw-r--r--. 1 mysql    mysql 14514122752 Dec 30 09:28 mysqld.log

这也日志文件也忒大了,于是将该日志备份到其他未满的分区后,将该日志文件清空。
其实后来据非官方信息了解到,当剩余空间小于10%时,分片无法成功启动。
再次重启ES,以为胜利的曙光已经在召唤了,哪成想…

Round 3

节点还是一片红黄交错,这次强行清醒了,虽然现象一样,但原因可能不一样,于是再次查看错误原因

failed shard on node [xxx]: failed recovery, failure RecoveryFailedException[[xxx][1]: Recovery failed on {node-1}{xxx}{xxxlA}{x.x.x.x}{x.x.x.x:9300}{ml.machine_memory=25334550528, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}]; nested: IndexShardRecoveryException[failed to recover from gateway]; nested: AccessDeniedException[/xx/elasticsearch/data/nodes/0/indices/xxx/1/index/_23b.fdt]; 

好家伙,访问拒绝,熟悉的味道啊。但怎么产生的呢,脑海中立马想到原因可能是之前有一次启动时用的是root用户造成的。
于是立马去看这个受限文件的权限信息,果不其然,属于root用户

//xx为你的es用户
chown -R xx:xx /xx/elasticsearch/data

走你,翻滚吧,阿信!不好意思,串词了。运行完成后,所有数据文件都具有访问权限了,于是再次重启ES…

Round 4

既然看到了第四回合,那你已经知道,前面的battle都没能彻底解决掉我们的问题,但这里有个小小惊喜的是,red状态的索引都已经没了,现在只剩下yellow状态的了,也就是说截止目前,我们的功能已经是能正常使用了。
于是赶紧让文章开头的那个同事(问题源)来重试,果然,他没有再哔哔了。可本着本农追根溯源的优良精神,怎么能止步于此,我一定要让所有索引都是green才行!
那么还是进一步查看问题原因

the shard cannot be allocated to the same node on which a copy of the shard already exists [[xxx][3], node[xxx], [P], s[STARTED], a[id=xxx]]

错误信息也很明显,就是分片副本不能和分片本身分配到同样的节点上。但这个问题刚开始还是迷惑了我,因为我以为分片多的情况可能刚启动时没分配过来,于是准备通过

index.unassigned.node_left.delayed_timeout

参数来延时分配这些未被分配的分片。
一番操作下来,错误信息不断地变,但是结果却始终没有好转,终于当错误产生循环后,终于意识到方向不对了。
这里补充个小知识,ES的分片副本肯定要和分片本身要分配到不同的节点的,也就说每个主分片的副本数要少于群集中的节点数,也就是我们熟知的NR公式

//N代表节点数,R代表所有索引的最大分片复制因子
N >= R + 1

于是我只需要将副本数量进行控制即可

number_of_replicas

一番操作后,总算一片green了

总结

查资料的过程中,还看到有解决办法让哪个索引为yellow/red直接将该索引DELETE即可。WTF?如果解决不了问题就解决提出问题的人吗?
其实总结下来就一句话,遇事不着急,细细看日志,万事必有因,逐破自搞定!(强行银湿一手[doge])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次Elasticsearch节点状态red的整改过程 的相关文章

  • 如何在测试套件中定义 JUnit 方法规则?

    我有一个类 它是 JUnit 测试类的 JUnit 套件 我想定义一个规则on the suite 这是可以做到的 但需要做一些工作 您还需要定义自己的 Suite 运行程序和测试运行程序 然后在测试运行程序中重写 runChild 使用以
  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 数学建模:18 粒子群算法

    目录 基础的粒子群算法 流程图 核心公式 改进惯性权重 线性递减的惯性权重 非线性递减的惯性权重 自适应的惯性权重 随机的惯性权重 改进学习因子 压缩学习因子 非对称学习因子 改进 自动退出迭代 测试函数 Matlab 自带的粒子群函数 p
  • 一种把四个字节(BYTE)组成一个32位int型的方法

    实现代码如下 int ConvertTo32 int la int lb int lc int ld la 0XFFFFFF la lt lt 24 lb 0XFF00FFFF lb lt lt 16 lc 0XFFFF00FF lc lt
  • linux扩展/dev/sda1分区方法

    一 准备 扩展虚拟机的磁盘空间 在虚拟机关闭状态下 点击虚拟机 gt 设置 gt 硬盘 gt 扩展 扩展自己需要的容量 二 开始扩展 idriver ubuntu su 1 切换至root用户 root ubuntu home idrive
  • Kettle教程(一):ETL简介、Kettle安装部署

    文章目录 前言 一 ETL 1 ETL是啥 2 ETL有啥价值 二 Kettle 1 简介 2 安装 三 总结 前言 随着大数据的不断发展 企业级别的数据转换显得尤为重要 从本文开始和大家一起学习一款开源ETL工具 Kettle 一 ETL
  • Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 1 什么是插件化 能运行的宿主APP去加载没有下载的APK文件 并使用APK文件里面的功能 这就叫插
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • equals()方法的重写

    equals 本身是一个方法 并不是运算符 而且仅适用于引用数据类型 在java的引用数据时使用时 比较的并不是具体的数值 而是地址值 此时并不能有效地比较引用数据类型中的具体数据 比较地址值对于引用数据类型而言没有用 就出现了equals
  • 数组添加元素的方法-6种

    数组添加元素的方法 6种 使用 length 属性追加元素 使用length属性 可以在数组末尾后面添加一个元素 var arr 1 2 3 4 5 arr length 6 console log arr 1 2 3 4 5 6 使用 p
  • 远程控制 ToDesk

    ToDesk 远程控制软件 支持跨平台的远程控制 有且不限于PC对PC iOS Android也可以直接控制 最近发现的一个好用的远程连接软件 也是近些年非常火热的 远程控制软件 ToDesk 虽然 QQ 和 向日葵 也都可以满足我们实现的
  • 深入理解spring注解之@ComponentScan注解

    2018 05 20 10 02 23 今天主要从以下几个方面来介绍一下 ComponentScan注解 ComponentScan注解是什么 ComponentScan注解的详细使用 1 ComponentScan注解是什么 其实很简单
  • nginx配置同时支持https/wss协议(http/https ws/wss)都可以

    在Nginx代理集群支持SSL 整体架构如下 SSL SSL Secure Socket Layer 安全套接层 简单来说是一种加密技术 通过它 我们可以在通信的双方上建立一个安全的通信链路 因此数据交互的双方可以安全地通信 而不需要担心数
  • iis6.0配置与漏洞复现

    实验环境 windows sesrver 2003 asp环境 1 iss服务器的搭建 1 点击开始 gt 控制面板 gt 添加或删除程序 2 点击添加或删除程序 3 点击应用程序服务器 gt 点击详细信息 点击确定完成配置 4 点击开始
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • python 使用setup.py安装packages

    前置条件 安装了python 我的版本是python 3 6 5 安装pip 1 打开cmd 2 安装pip python m ensurepip 3 升级pip python m pip install upgrade pip 本地安装
  • 【ChatGPT实践篇】给小孩制作一个数字人恐龙科普短视频

    以下文章来源于飞书 1 科普文本生成 起初我也是试了不少prompts去让chatgpt自由发挥 生成恐龙科普文章 但科普内容要么过于复杂 要么过于宽泛 无法到达自己想要的效果 既然如此 我决定定制化科普内容 让它实现我的想法 1 1 确定
  • 编译原理13:SLR(1)分析表、LR(1)分析表

    更强的LR分析 可以根据当前单词 来选择是移进还是归约 只要所有移进项目中的点后面的那些终结符 与归约项目生成的非终结符的Follow集合的元素没有重叠 若当前单词属于上述Follow集合里则规约 SLR 1 冲突解决办法 SLR 1 分析
  • c++学习笔记

    c 学习笔记 1 安装环境 1 安装环境 windows 下载MinGW w64 linux
  • 在Mac上安装ArduinoIDE并布置环境支持NodeMcu

    前言 笔者最近在研究Swoole 因为对物联网很感兴趣 在某宝上买来了 NodeMcu 开发板 关于NodeMcu大家请提前做好功课 我选择的是CP2102版 Swoole TCP Server负责和小车通讯 Swoole WebScoke
  • 处理大并发之一 对异步非阻塞的理解

    处理大并发之一 对异步非阻塞的理解 在研究nginx和node js的时候常会遇到异步 非阻塞等 之前自己也经常使用epoll 对其同步与阻塞 异步与非阻塞有了一定的认识 现对参考资料总结下 首先讨论下使用事件驱动 异步编程的优点 充分利用
  • 记一次Elasticsearch节点状态red的整改过程

    文章目录 问题起因 Round 1 Round 2 Round 3 Round 4 总结 问题起因 自己负责审计日志模块的管理功能 同事突然对我说 写入的日志数据全部不能用了 我立即答复 回怼 不可能 说罢 还是去登录系统查看 能查出数据