Es中出现unassigned shards问题解决

这篇具有很好参考价值的文章主要介绍了Es中出现unassigned shards问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

出现这种问题表示该索引是只读了,没办法进行shard及存储操作,优先排除是系统存储盘满了Es中出现unassigned shards问题解决,Elasticsearch,elasticsearch,数据库,php

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

发现该索引shard 1 损坏
Es中出现unassigned shards问题解决,Elasticsearch,elasticsearch,数据库,php
也可以通过命令进行查看

GET _cluster/allocation/explain?pretty

Es中出现unassigned shards问题解决,Elasticsearch,elasticsearch,数据库,php

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文章来源地址https://www.toymoban.com/news/detail-752142.html

到了这里,关于Es中出现unassigned shards问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch常见unassigned原因和解决方式

    查看unsigned 的原因 1、磁盘满 解决:磁盘扩容或定期删除无用数据(设定数据保存时间) 通常如果磁盘满了,ES为了保证集群的稳定性,会将该节点上所有的索引设置为只读。ES 7.x版本之后当磁盘空间提升后可自动解除,但是7.x版本之前则需要手动执行下面的API来解除只读模

    2024年02月02日
    浏览(28)
  • 【elasticsearch】 es状态查看节点分片信息:/_cat/shards

    在kibana查询: 查询结果: index:索引名称 shard:分片数 prirep:分片类型,p=pri=primary为主分片,r=rep=replicas为复制分片 state:分片状态,STARTED为正常分片,INITIALIZING为异常分片 docs:记录数 store:存储大小 ip:es节点ip node:es节点名称

    2024年02月11日
    浏览(36)
  • ES(elasticsearch)中遇到elasticsearch.keystore的问题,已解决!!!

    提示:Linux中部署elasticsearch7.8.0 在处于非root权限下,启动elasticsearch,遇到了elasticsearch.keystore的问题 提示:在启动之前,已经给elasticsearch文件夹全部授权为非root权限可以访问,但是elasticsearch.keystore给文件是在启动之后生成的,默认启动权限为root所以无法继续访问下去。 提

    2024年02月06日
    浏览(31)
  • 使用Docker安装和部署Elasticsearch出现问题以及解决方案

    docker安装elasticsearch(最详细版)| Bright1668-CSDN es在Windows环境启动报错 | 你道本部院是个书生-CSDN 查看max_map_count的值 默认是 65530 。 重新设置max_map_count的值。 –name es:设置容器的名称为\\\"es\\\"。 -p 9200:9200 -p 9300:9300:这部分将主机的端口与容器的端口进行映射。 -e “discovery.ty

    2024年02月09日
    浏览(44)
  • ES常见问题(1)-解决ElasticSearch每次只能返回10条数据

    使用ElasticSearch查询分页数据 有时候,我们需要使用ElasticSearch来分词查询,并分页返回指定的数据条数,但是当我们每次想得到分页数据条数超过十条的时候,ElasticSearch总是只能返回十条 因为ElasticSearch为了查询的速度,在默认的情况下已经设置了分页数据只能返回10条,所

    2024年02月11日
    浏览(30)
  • 【工作记录】springboot集成spring-data-elasticsearch访问es及问题解决

    ​ 前文我们介绍了通过可视化爬虫爬取新闻到Mysql库、基于docker-compose的elk集群部署及抽取mysql数据到es的过程,本文我们介绍通过集成springboot和spring-data-elasticsearch客户端完成连接es并查询数据的开发过程以及遇到的问题和解决方案,希望对大家能有所帮助,对文中内容有任何

    2023年04月10日
    浏览(31)
  • 解决在使用 Elasticsearch(ES)多线程批量操作时导致并发一致性的问题!!

    先说一下什么是数据库数据库中 并发一致性 问题! 1、在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。 数据丢失 T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。 读脏数据 T1 修改一个数据,T2 随后读取

    2024年02月04日
    浏览(42)
  • es elasticsearch 十四 各种机制 评分机制 正序索引 解决跳跃结果问题 解决耗时过长问题 解决相同属性值都到一个地方

    目录 评分机制 机制 查看评分实现如何算出来的explain=true 分析能否被搜索到 Doc value 正排序索引 Query phase Fetch phase Preference 问题 解决跳跃结果问题 Timeout 到达时间直接返回,解决耗时过长问题 Routing 数据准确分配到某地,解决相同属性值都到一个地方 评分机制 机制 TF分词频

    2024年02月08日
    浏览(65)
  • elasticsearch的shard优化

    shard简介 Elasticsearch 中的数据会整理为索引。每个索引又由一个或多个分片组成。每个分片都是一个 Lucene 索引实例,您可以将其视作一个独立的搜索引擎,它能够对 Elasticsearch 集群中的数据子集进行索引并处理相关查询。 分片是 Elasticsearch 在集群内分发数据的单位。 Elasti

    2024年02月08日
    浏览(35)
  • Es集群UNASSIGNED之NODE-LEFT解决

    1,通过以下API可以查看哪些分片未分配以及集群节点 UNASSIGNED 的原因 2,想要查看更多的未分配详情可以使用API: 3,此处我们发现未分配的原因为 NODE_LEFT ,我们可以通过下面的API查看结点分片的分配情况: 通过以上结果我们发现未分配的分片有70个,而且 node-4 上的分片为0。

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包