1.概述

转载:https://zhuanlan.zhihu.com/p/101608973

转载这篇文章是因为根据我的文章

【Elasticsearch】elasticsearch 7.x 查看分片未分配 (UNASSIGNED) 的原因

【Elasticsearch】Elasticsearch 集群健康值红色 解决方案 或者 分片 未分配

讲解了大部分分片未分配的原因,但是一步一步的排查,深入的排查,这篇文章可以弥补。

前言

可能你经历过这些Red.


。。。等等

那ES的Red是神么意思?

这里说的red,是指es集群的状态,一共有三种,green、red、yellow。具体含义:


冷静分析
从上图可知,集群red是由于有主分片不可用,这种情况一般是由于节点宕机。

有什么影响呢?

至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

此时我们可以执行相关的命令进行状态检查。

集群节点是否都存在、查看集群状态。

curl -uelastic:pwd  -XGET "http://ip:9200/_cluster/health?pretty"

  • active_shards 是涵盖了所有索引的所有分片的汇总值,其中包括副本分片。

  • relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。

  • initializing_shards 显示的是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于 initializing 状态,分片不应该长期停留在 initializing 状态。你还可能在节点刚重启的时候看到 initializing 分片:当分片从磁盘上加载后,它们会从 initializing 状态开始。所以这一般是临时状态。

  • unassigned_shards 是已经在集群状态中存在的分片,但是实际在集群里又找不着。最常见的体现在副本上。比如,我有两个es节点,索引设置分片数量为 10, 3 副本,那么在集群上,由于灾备原则,主分片和其对应副本不能同时在一个节点上,es无法找到其他节点来存放第三个副本的分片,所以就会有 10 个未分配副本分片。如果你的集群是 red 状态,也会长期保有未分配分片(因为缺少主分片)。

unassigned_shards原因1

上面说了一种造成 unassigned_shards的原因,就是副本太多,节点太少,es无法完成分片。
举一反三!由于索引的副本是可以动态修改的,那么,如果在修改时分配的副本数大于节点数目,那么肯定会有分片是这个状态。
这种情况的解决办法有两种:
1、是动态调整一下副本数量。
2、新加入一个节点来平衡。

unassigned还有其他原因?

目前集群爆红,但是所有节点都还在,有点诡异,从集群状态看,一共是两个分片有问题,一个正在初始化,一个是unassigned。确定了故障范围后,我们再来从索引层面、分片层面深入的分析具体原因把。


索引层面分析

再执行

curl -uelastic:pwd  -XGET "http://ip:9200/_cluster/health?pretty&level=indices"

没错,还是这个api,不过值得注意的是level=indices,想必读者已经心领神会。这个api返回的是一个格式化后的json,如果太长,推荐输出到一个文本里面看。

![从返回的信息中,我们可以看到,01-04索引目前状态为red,它有2个分片,0个副本,有一个分片正在初始化,从这个数据可以看出,受影响的是主分片,想到这里,感到慌不择路。

分片层面分析

少侠,莫慌

知道了索引层面的故障信息,我们继续深究,看看分片层面。

curl -uelastic:pwd  -XGET "http://ip:9200/_cluster/health?level=shards"

当然,重点还是level=shards,显示如下:


至此,我们可以得到更多的线索:

索引名:xxx-01-04。
分片数量:2。
副本数:0。
有问题的分片号:0。并且是主分片。
分片状态:initializing。说明正在初始化,自我恢复中。
既然是在恢复,那找恢复相关的api,看看。

curl -u elastic:pwd -XGET http://ip:9200/索引名/_recovery?pretty=true


从上图可以看到,花费了14.1个小时,从translog中恢复!目前进度很是堪忧。配合kibana看一下:

插播一下,translog的知识

我们把数据写到磁盘后,还要调用fsync才能把数据刷到磁盘中,如果不这样做在系统掉电的时候就会导致数据丢失,这个原理相信大家都清楚,elasticsearch为了高可靠性必须把所有的修改持久化到磁盘中。

我们的数据先写入到buffer里面,在buffer里面的数据时搜索不到的,同时将数据写入到translog日志文件之中。如果buffer快满了,或是一段时间之后,就会将buffer数据refresh到一个新的OS cache之中。

translog的作用:在执行commit之前,所有的而数据都是停留在buffer或OS cache之中,无论buffer或OS cache都是内存,
一旦这台机器死了,内存的数据就会丢失,所以需要将数据对应的操作写入一个专门的日志文件之中。

一旦机器出现宕机,再次重启的时候,es会主动的读取translog之中的日志文件数据,恢复到内存buffer和OS cache之中。
整个commit过程就叫做一个flush操作

其实translog的数据也是先写入到OS cache之中的,默认每隔5秒之中将数据刷新到硬盘中去,也就是说,
可能有5秒的数据仅仅停留在buffer或者translog文件的OS cache中,如果此时机器挂了,
会丢失5秒的数据,但是这样的性能比较好,我们也可以将每次的操作都必须是直接fsync到磁盘,但是性能会比较差。

上述摘录于互联网,写得清晰明了,可以参考一下,分析看了日志也没有找到其他有用的信息,由于是历史索引,就将其删除掉了,虽然没有定位到根本原因,不过记录一下排查过程总是好的。

剩下的unassigned分片

解决了一个问题,那么还剩下一个分片是未分配的,还是从索引层面和分片层面查询检查,发现同样是0号主分片出问题。
尝试手动分配

curl -uelastic:pwd -XPOST 'http://ip:9200/_cluster/reroute' -H"Content-Type:application/json" -d '{"commands" : [ {"allocate_stale_primary" : {"index" : "B_2020-01-05","shard" : 0,"node" : "SL8u8zKESy6rSHjHO0jEvA"}}]}'

报错:

No data for shard [0] of index [B_2020-01-05] found on node [SL8u8zKESy6rSHjHO0jEvA]"},"status":400}

尝试手动分配失败后,更换思路。摆脱掉各种复杂的查询API,使用es为我们提供的一个Explain API,它会解释为什么分片没有分配,解决问题之前,先诊断诊断。

curl -uelastic:pwd -XGET "http://ip:9200/_cluster/allocation/explain" -H"Content-Type:application/json" -d '{"index": "B_2020-01-05","shard": 0,"primary": true
}'


看上述错误,分片被锁住了,尝试分配,但是被拒绝,手动分配时,可以指定"acceptdataloss" : true。但这样会导致数据完全丢失。

这种情况一般出现在有结点短暂离开集群,然后马上重新加入,并且有线程正在对某个shard做bulk或者scroll等长时间的写入操作。等结点重新加入集群的时候,由于shard lock没有释放,master无法allocate这个shard。 通常/cluster/reroute?retryfailed=true可以解决问题,如果按照你说的依然无法解决,可能还有其他原因导致锁住该shard的线程长时间操作该shard无法释放锁(长时间GC?)。

如果retryfailed无法解决问题,可以尝试一下allocatestale_primary,前提是需要知道这个shard的primary在哪个结点上。实在解决不了,又不想丢数据,还可以重启一下该结点,内存锁应该可以释放。

执行集群reroute命令:

curl -XPOST "http://ip:9200/_cluster/reroute?retry_failed=true"

再看分片状态:

此时集群已经恢复Green。大功告成。

总结

一、遇到集群Red时,我们可以从如下方法排查:

集群层面:/_cluster/health。
索引层面:/_cluster/health?pretty&level=indices。
分片层面:/_cluster/health?pretty&level=shards。
看恢复情况:/_recovery?pretty。

二、有unassigned分片的排查思路

_cluster/allocation/explain,先诊断。
/_cluster/reroute尝试重新分配。

三、数据重放

如果实在恢复不了,那只能索引重建了。提供一种思路:

先新建备份索引

curl -XPUT ‘http://xxxx:9200/a_index_copy/‘ -d ‘{“settings”:{“index”:{“number_of_shards”:3,“number_of_replicas”:2}}
}

通过reindex,将目前可用的数据导入:

POST _reindex{"source": {"index": "a_index"},"dest": {"index": "aindexcopy","op_type": "create"}}

删除a_index索引,这个必须要先做,否则别名无法添加

.curl -XDELETE ‘http://xxxx:9200/a_index’

创建aindexcopy索引

curl -XPUT ‘http://xxxx:9200/a_index_copy/‘ -d ‘{“settings”:{“index”:{“number_of_shards”:3,“number_of_replicas”:2}}
}

通过reindex api将aindex数据copy到aindex_copy。

POST _reindex
{"source": {"index": "a_index"},"dest": {"index": "a_index_copy","op_type": "create"}
}

删除a_index索引,这个必须要先做,否则别名无法添加

curl -XDELETE 'http://xxxx:9200/a_index'

给aindexcopy添加别名a_index

curl -XPOST 'http://xxxx:9200/_aliases' -d '
{"actions": [{"add": {"index": "a_index_copy", "alias": "a_index"}}]
}'

【Elasticsearch】es 集群健康值 红色 red 分片 未分配相关推荐

  1. es集群健康值变为黄色解决办法

    查看集群状态各个指标 curl http://localhost:9200/_cluster/health?pretty "cluster_name" : "my-app ...

  2. 【Elasticsearch】Elasticsearch 集群健康值红色 解决方案 或者 分片 未分配

    文章目录 1.概述 1.集群状态解读 2.什么是unassigned 分片? 3.为什么会出现 unassigned 分片? 4.出现unassigned 分片后的症状? 5.unassigned 分 ...

  3. 线上 ELK 集群健康值 red 状态问题排查与解决

    线上 ELK 集群健康值 red 状态问题排查与解决 参考文章: (1)线上 ELK 集群健康值 red 状态问题排查与解决 (2)https://www.cnblogs.com/haifeiwu/p ...

  4. win10上elasticsearch-head显示集群健康值未连接问题

    安装好elasticsearch-head插件后,显示集群健康值为未连接 解决方法: 在elasticsearch.yml中添加配置 结果

  5. elasticsearch_head 启动集群健康值未连接?

    elasticsearch_head 启动集群健康值未连接? 在网上找了好久的解决办法 都么有解决这个问题.我觉得这个问题肯定是改配置文件的,但是往上改配置的五花八门的,要么改了启动不了.要么就是没有 ...

  6. 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配

    概述 转载:https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484125&idx=1&sn=18274d67 ...

  7. Linux搭建ElasticSearch(ES)集群并设置密码登录

    1. 环境信息 操作系统:CentOS7或者Amazon Linux 2 内核架构:x86_64 ElasticSearch版本:6.8.10 JDK版本:8u351 本次搭建的3台服务器IP地址: ...

  8. 【docker】elasticsearch-head无法连接elasticsearch的原因和解决,集群健康值:未连接,ElasticSearch——跨域访问的问题...

    环境 ==================== 虚拟机启动 centos 7  ip:192.168.92.130 elasticsearch 5.6.9   port:9200  9201 elas ...

  9. 【Elasticsearch】elasticsearch 7.x 查看分片未分配 (UNASSIGNED) 的原因

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 文章目录 1.概述 1.1 检查集群的健康状况 1.2 查看未分配原因 1. 2.查询参数 1. 3.请 ...

最新文章

  1. Java Swing 树状组件JTree的使用方法【图】
  2. struts2+hibernate-jpa+Spring+maven 整合(1)
  3. 多线程编程之线程同步主要函数一览
  4. Hyperledger Fabric 核心模块(1)整体概述
  5. 直播 背景 技术体系 乐视云直播Demo
  6. lpr命令linux下未找到,linux – LPR命令无法识别CUPS打印机
  7. 解决react状态管理---React Query
  8. linux 安装apache
  9. tensorflow函数介绍(3)
  10. 苹果8a1660是什么版本_苹果a1780是什么版本
  11. 微信公共号开发教程java版——微信网页授权(八)
  12. 一文了解IMU原理、误差模型、标定、惯性传感器选型以及IMU产品调研(含IMU、AHRS、VRU和INS区别)
  13. LabVIEW程序框图进行缩放
  14. 使用jmeter自动化证据切图后预览操作
  15. elasticsearch从入门到入门系列(二)---快速入门B
  16. 【云原生之Docker实战】使用docker部署Memos碎片化知识管理工具
  17. 导出期刊对应格式的参考_中文参考文献怎么一键导出正确格式?写作必看!
  18. 推荐一些坚持原创的公众号
  19. 机器学习——课后习题解答
  20. SpaceVim图标及部分字符显示乱码

热门文章

  1. Meta Company在公开信中谴责Facebook改名
  2. 双11首日全国共揽收快递包裹5.69亿件 同比增长28.54%
  3. realme Pad通过认证:搭载7100mAh大容量电池
  4. Redmi Note 10 Pro发布 首发价1499元起
  5. 三星Galaxy S21+真机上手视频曝光:外观彻底无悬念
  6. 卢伟冰:Redmi K30 Pro的主板可能是业内最复杂“三明治”主板设计
  7. 突发!贾跃亭或将申请个人破产重组
  8. 不愧是击溃服务器的男人!周杰伦《说好不哭》刷新QQ音乐单曲纪录
  9. 这又是什么新玩法?华为Mate 30 Pro真机谍照现身:音量键大变样
  10. 微信更新的这功能“炸了”:网友集体吐槽 忍不了