Es中出现unassigned shards问题解决

news2025/2/23 10:58:15

1、一般后台会报primary shard is not active Timeout: …

出现这种问题表示该索引是只读了,没办法进行shard及存储操作,优先排除是系统存储盘满了在这里插入图片描述

2、通过监控工具查看(cerebro)

发现该索引shard 1 损坏
在这里插入图片描述
也可以通过命令进行查看

GET _cluster/allocation/explain?pretty

在这里插入图片描述

3、问题原因

 1. Shard allocation 过程中的延迟机制
 2. nodes 数小于分片副本数
 3. 检查是否开启 cluster.routing.allocation.enable 参数
 4. 分片的历史数据丢失了
 5. 磁盘不够用了
 6. es 的版本问题

4、 问题解决

4.1、 简单粗暴方式解决(删索引)

如果该索引数据是日志记录,非必要数据可进行删除该索引即可解决,如:监控数据,丢了就丢了,因为你只关注当前的

4.2、Shard allocation 过程中的延迟机制

当一个 点从集群中下线了, es 有一个延迟拷贝机制, 默认是等一分钟之后再开始处理 unassigned 的分片, 该做 rebalance的去 rebalance,只所以这样, 是因为es担心如果一个点只是中断了片刻, 或者临时下线某台机器,就立马大动干戈,就尴尬了,比如下面这种情形
Node(节点) 19 在网络中失联了(某个家伙踢到了电源线)
Master 立即注意到了这个节点的离线,它决定在集群内提拔其他拥有 Node 19 上面的主分片对应的副本分片为主分片
在副本被提拔为主分片以后,master 节点开始执行恢复操作来重建缺失的副本。集群中的节点之间互相拷贝分片数据,网卡压力剧增,集群状态尝试变绿。
由于目前集群处于非平衡状态,这个过程还有可能会触发小规模的分片移动。其他不相关的分片将在节点间迁移来达到一个最佳的平衡状态
与此同时,那个踢到电源线的倒霉管理员,把服务器插好电源线进行了重启,现在节点 Node 19 又重新加入到了集群。不幸的是,这个节点被告知当前的数据已经没有用了, 数据已经在其他节点上重新分配了。所以 Node 19 把本地的数据进行删除,然后重新开始恢复集群的其他分片(然后这又导致了一个新的再平衡)
如果这一切听起来是不必要的且开销极大,那就对了。是的,不过前提是你知道这个节点会很快回来。如果节点 Node 19 真的丢了,上面的流程确实正是我们想要发生的。
这个默认的延迟分配分片的实际是1分钟, 当然你可以设置这个时间

curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '
{
    "settings": {
      "index.unassigned.node_left.delayed_timeout": "30s"
    }
}'

4.3、nodes 数小于分片副本数

当一个nodes 被下掉之后, master 节点会重新 reassigns 这台nodes上的所有分片, 尽可能的把同一个分片的不同副本分片和主分片分配到不同的node上,但是如果你设置的一个分片的 副本数目太多, 导致根本没法一个 node上分配一个,就会出现问题, 会导致 es 没法进行 reassign, 这样就会出现 unassigned 的分片。
从一开始创建index 的时候就要保证N >= R + 1这里 N 代表 node的个数, R代表你index 的副本数目。
这种情况要么增加 nodes 个数要么减少副本数

curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '{"number_of_replicas": 2}'

我们上个例子中,就把 副本数目减少到 2个, 问题解决。
注释:目前我就是属于单节点,但没办法调整分片数与节点数关系达到平衡,所以我这里直接删了索引

4.4检查是否开启 cluster.routing.allocation.enable 参数

Shard allocation 功能默认都是开启的, 但是如果你在某个时刻关闭了,这个功能(比如滚动重启的情形, https://www.elastic.co/guide/en/elasticsearch/guide/current/_rolling_restarts.html ), 后面忘了开启了,也会导致问题, 你可以使用下面这个命令开开启下

curl -XPUT 'localhost:9200/_cluster/settings' -d
'{ "transient":
  { "cluster.routing.allocation.enable" : "all" 
  }
}'

恢复之后, 你可以从监控上,看到 unassigned shards 逐渐恢复
看监控中,几个index都恢复了,好像还有constant-updates这个index 没有好,我们看下是否还有其他原因
分片的历史数据丢失了
我们现在的问题是这样, constant-updates 这个index 的第 0个分片处于 unassigned 状态, 创建这个index 的时候 每个分片只有 一个 主分片,没有其他副本, 数据没有副本, 集群检测到这个分片的 全局状态文件,但是没有找到原始数据, 就没法进行恢复。

还有一种可能是这样, 当一个node 重启的时候, 会重新连接集群, 然后把自己的 disk 文件信息汇报上去, 这时候进行恢复,如果这个过程出现了问题,比如存储坏掉了,那么当前分片还是没法恢复正常。

这个时候,你可以考虑下,是继续等待原来的那台机器恢复然后加入集群,还是重新强制分配 这些 unassigned 的分片, 重新分配的时候也可以使用备份数据。

如果你打算重新强制分配主分片,可以使用下面的命令 , 记得带上"allow_primary": “true”

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{ "commands" :
  [ { "allocate" : 
      { "index" : "constant-updates", "shard" : 0, "node": "<NODE_NAME>", "allow_primary": "true" }
  }]
}'

如果你没有带上"allow_primary": “true”, 就会报错

{"error":{"root_cause":[{"type":"remote_transport_exception","reason":"[NODE_NAME][127.0.0.1:9301][cluster:admin/reroute]"}],
"type":"illegal_argument_exception","reason":"[allocate] trying to allocate a primary shard [constant-updates][0], which is disabled"},
"status":400}

因为没有当前分配的分片是没有主分片了。

当然你在重新强制分配主分片的时候,可以创建一个 empty 的主分片,也就是老数据我不要了, 这个时候,如果失联的 node 重新加入集群后, 就把自己降级了, 分片的数据也会使用 这个 empty 的主分片覆盖, 因为它已经变成过时的版本了。

POST _cluster/reroute  
{
  "commands" : [ {
        "allocate_empty_primary" :
            {
              "index" : "constant-updates", "shard" : 0, "node" : "<NODE_NAME>", "accept_data_loss" : true
            }
        }
  ]
}

这个命令就可以创建一个 empty 的主分片。

4.5、磁盘不够情况解决

4.5.1、先进行查询

curl -s 'localhost:9200/_cat/allocation?v'

4.5.2、如果磁盘空间比较有剩余可以调整low disk watermark的磁盘使用比例也是可以设置的

curl -XPUT 'localhost:9200/_cluster/settings' -d
'{
    "transient": {  
      "cluster.routing.allocation.disk.watermark.low": "90%"    
    }
}'

4.5.3、可通过扩容物理磁盘并更改es配置

可以修改配置文件opensearch.yml或elasticsearch.yml进行配置在新的磁盘用逗号隔开,重启es

path.data:/test/data1,/test/data2

4.6、es 的版本问题

还有一种极端情况, 就是你升级了某个node的版本, master node 会不认这个跟它版本不同的的node, 也不会在上面分配分片。

如果你手动强制往上面分配分片,会报错。

[NO(target node version [XXX] is older than source node version [XXX])]

大体就这几种情况,你可以根据自己的观察到的现象去判断。

总结

针对不同情况需要进行不同的处理,能不删数据尽量不删数据,如果有更好的解决方案,或者没有解决你的问题欢迎留言一起讨论

原文链接:
https://www.cnblogs.com/lvzhenjiang/p/14196973.html
https://blog.csdn.net/syc000666/article/details/94910375

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

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

相关文章

阿里云短信服务接口返回: 只能向已回复授权信息的手机号发送

1、问题描述 在阿里云短信服务控制台&#xff0c;调用发送短信接口&#xff0c;报错&#xff1a;只能向已回复授权信息的手机号发送 2、问题分析 所使用的签名 是 测试or个人学习的 &#xff0c;所以会导致 有的手机号发送不出去验证码 3、解决 如果在测试阶段&#xff0c;非要…

Python小试牛刀:GUI(图形界面)实现计算器UI界面(一)

下一篇&#xff1a;Python小试牛刀&#xff1a;GUI&#xff08;图形界面&#xff09;实现计算器UI界面(二)-CSDN博客 Python GUI 是指 Python 图形用户界面库&#xff0c;它们可以帮助开发者创建在计算机上运行的图形用户界面&#xff08;GUI&#xff09;。下面是一些常用的 P…

64T存储松下mov和索尼mp4文件变0字节恢复案例

64T存储松下mov和索尼mp4文件变0字节恢复案例 小型入门的小NAS凭借超市的性价比在各行业中开始流行&#xff0c;可以通过搭配普通SATA硬盘就可以完成阵列上线&#xff0c;部署也很简单&#xff0c;一根网线就搞定。我们看一个影视公司64T小NAS存储比较奇怪的恢复案例。 故障存…

【JavaScript保姆级教程】for循环与for循环遍历数组

文章目录 前言一、for循环1.1 什么是For循环&#xff1f;1.2 For循环示例1. 打印偶数2. 倒序打印 1.3 For循环遍历数组 二、JavaScript中的循环嵌套1.1 while循环的嵌套示例1&#xff1a;乘法表 示例2&#xff1a;打印星号三角形2.2 for循环的嵌套示例1&#xff1a;二维数组遍历…

pwd - 显示当前工作目录的路径

pwd命令来自英文词组“print working directory”的缩写&#xff0c;其功能是用于显示当前工作目录的路径&#xff0c;即显示所在位置的绝对路径。 在实际工作中&#xff0c;我们经常会在不同目录之间进行切换&#xff0c;为了防止“迷路”&#xff0c;可以使用pwd命令快速查看…

linux二进制文件分析三大工具详解(ldd、readelf、nm)

介绍 测试代码源码、源码如下&#xff1a; #include <openssl/evp.h> #include <openssl/sm2.h> #include <openssl/rand.h> #include <iostream> #include <string>EVP_PKEY* generate_sm2_key_pair() {EVP_PKEY_CTX *ctx;EVP_PKEY *pkey nu…

Openssl数据安全传输平台019:外联接口类的封装以及动态库的制作 - Bug未解决,感觉不是代码的问题

文章目录 1 外联接口1.1 接口类的封装1.2 共享内存与配置文件 2 json格式配置文件的定义2.1 共享内存中存储的节点结构2.2 服务器端配置文件2.3 客户端配置文件2.4 改进配置文件 3 共享内存类修改4 将接口打包成库(静态/动态)4.1 相关的指令4.1.1 静态库4.1.2 动态库 4.2 外联接…

CONTAINING_RECORD宏

CONTAINING_RECORD宏的使用 已知类或结构体成员变量的地址&#xff0c;可以取得类或结构体对象的地址。 代码 #include <windows.h> #include <iostream>class MyClass { public:MyClass(){}virtual ~MyClass(){}public:int m_Value1;int m_Value2;int m_Value3; …

「图像 merge」无中生有制造数据

在进行一个新项目的时候&#xff0c;往往缺少一些真实数据&#xff0c;导致没办法进行模型训练&#xff0c;这时候就需要算法工程师自行制作一些数据了&#xff0c;比如这篇文章分享的 bag 目标检测&#xff0c;在检测区域没有真实的 bag数据 此时&#xff0c;就可以采用图像拼…

CHS零壹视频恢复程序换机加载扫描结果的方法

有些特殊情况下我们需要把当前机器上扫描的结果在另外一台机器上加载&#xff0c;这样可以避免多次扫描浪费时间。目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持换机加载&#xff0c;下面这个教程演示了如何换机加载。 STEP1&#xff1a;选择扫描对象点击扫描->根…

4.3 抽象类和接口

思维导图: 4.3 抽象类和接口的笔记 4.3.1 抽象类 定义&#xff1a;当一个类需要定义成员方法描述其行为特征&#xff0c;但这些方法的实现方式无法确定时&#xff0c;Java提供了抽象类来满足这种需求。 特点&#xff1a; 抽象方法是使用abstract关键字修饰的方法&#xff0c;无…

Spring-创建非懒加载的单例Bean源码

补充&#xff1a;关于扫描的逻辑 /*** Scan the class path for candidate components.* param basePackage the package to check for annotated classes* return a corresponding Set of autodetected bean definitions*/ public Set<BeanDefinition> findCandidateCo…

【C++】无重复数字全排列(三种方法)和有重复数字全排列

文章目录 一、无重复数字排列1.1 题目描述1.2 用dfs方法1.2.1 思路分析1.2.2 代码编写 1.3 用交换法1.4 STL秒解1.4.1 所用函数1.4.2 代码编写 二、有重复数字排列2.1 思路分析2.2 代码编写 一、无重复数字排列 1.1 题目描述 把 1 ∼ n 1∼n 1∼n 这 n n n 个整数排成一行后…

Xray+awvs联动扫描

首先xray开启监听 xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-xxx.html --plugins sqldet,xxe,upload,brute-force,cmd-injection,struts,thinkphp 然后准备目标csv文件,每行一个url或ip然后加个逗号 接着awvs导入csv 对导进来的每个目…

【python海洋专题三十四】调用自己的colormore

点击蓝字&#xff0c;关注我们 ​ 【python海洋专题三十四】调用自己的colormore 有时候不想使用他们给好的&#xff0c;调用自己的colormore 使用素材 ncl的colormore。 格式文本格式&#xff01; 这样自己的colormore存入txt也可以使用了。 ​ 结果呈现 单个颜色调…

网络层协议【IP协议】

全文目录 基本概念IP协议IPv4 协议头格式&#xff1a;分片发送方进行分片&#xff1a;识别IP分片&#xff1a;组装IP分片&#xff1a; 网段划分DHCP技术IP分类 私有IP和共有IP1. 私有IP地址&#xff08;Private IP Address&#xff09;&#xff1a;2. 公网IP地址&#xff08;Pu…

接入文心一言实战(一):API申请与测试

大家好&#xff0c;我是豆小匠。 这期来介绍申请百度文心一言API的步骤。 第一步 注册百度智能云账号 网址&#xff1a;https://login.bce.baidu.com/new-reg?tplbceplat&fromportal 第二步&#xff1a;申请预置模型 网址&#xff1a;https://console.bce.baidu.com/qi…

VCS与XRUN对语法支持的不同点(持续更新...)

静态方法声明位置不同&#xff1a;VCS支持声明在class内/外&#xff08;extern&#xff09;两种方式&#xff0c;XRUN只支持static function声明于类内&#xff0c;不支持类外声明&#xff08;带extern关键字&#xff09;。 字符串转二进制、8进制、十进制、16进制方法&#xf…

【算法挑战】字符串解码(含解析、源码)

394.字符串解码 https://leetcode-cn.com/problems/decode-string/ 394.字符串解码 题目描述方法 1: 递归 思路复杂度分析代码 方法 2: 循环 栈 图解复杂度分析代码 题目描述 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。编码规则为: k[encoded_string]…

VSCode 设置平滑光标

1.点击左下角的设置按钮&#xff0c;再点击设置 2.点击文本编辑器&#xff0c;点击光标&#xff0c;勾选控制是否启用平滑插入动画。 3.随便打开一个文件&#xff0c;上下左右移动光标时&#xff0c;会发现非常的流畅。 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023…