干货 | Elasticsearch 集群健康值红色终极解决方案【转】

题记

Elasticsearch当清理缓存( echo 3 > /proc/sys/vm/drop_caches )的时候,出现 
如下集群健康值:red,红色预警状态,同时部分分片都成为灰色。 
 
查看Elasticsearch启动日志会发现如下: 
集群服务超时连接的情况。

bserver: timeout notification from cluster service. timeout setting [1m], time since start [1m]
  • 1

该问题排查耗时很长,问题已经解决。 
特将问题排查及解决方案详尽的整理出来。

1、集群状态解读

head插件会以不同的颜色显示。 
1)、绿色——最健康的状态,代表所有的主分片和副本分片都可用; 
2)、黄色——所有的主分片可用,但是部分副本分片不可用; 
3)、红色——部分主分片不可用。(此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好。) 
参考官网:http://t.cn/RltLEpN(部分中文集群健康状态博文资料翻译的不够精确,以官网为准)

如果集群状态为红色, Head插件显示:集群健康值red 。则说明:至少一个主分片分配失败。

这将导致一些数据以及索引的某些部分不再可用。

尽管如此, ElasticSearch还是允许我们执行查询,至于是通知用户查询结果可能不完整还是挂起查询,则由应用构建者来决定。

2、什么是unassigned 分片?

一句话解释:未分配的分片。 
启动ES的时候,通过Head插件不停刷新,你会发现集群分片会呈现紫色、灰色、最终绿色的状态。

3、为什么会出现 unassigned 分片?

如果不能分配分片,例如,您已经为集群中的节点数过分分配了副本分片的数量,则分片将保持UNASSIGNED状态。 
其错误码为:ALLOCATION_FAILED。

你可以通过如下指令,查看集群中不同节点、不同索引的状态。

GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
  • 1

4、出现unassigned 分片后的症状?

head插件查看会:Elasticsearch启动N长时候后,某一个或几个分片仍持续为灰色。

5、unassigned 分片问题可能的原因?

1)INDEX_CREATED:由于创建索引的API导致未分配。
2)CLUSTER_RECOVERED :由于完全集群恢复导致未分配。
3)INDEX_REOPENED :由于打开open或关闭close一个索引导致未分配。
4)DANGLING_INDEX_IMPORTED :由于导入dangling索引的结果导致未分配。
5)NEW_INDEX_RESTORED :由于恢复到新索引导致未分配。
6)EXISTING_INDEX_RESTORED :由于恢复到已关闭的索引导致未分配。
7)REPLICA_ADDED:由于显式添加副本分片导致未分配。
8)ALLOCATION_FAILED :由于分片分配失败导致未分配。
9)NODE_LEFT :由于承载该分片的节点离开集群导致未分配。
10)REINITIALIZED :由于当分片从开始移动到初始化时导致未分配(例如,使用影子shadow副本分片)。
11)REROUTE_CANCELLED :作为显式取消重新路由命令的结果取消分配。
12)REALLOCATED_REPLICA :确定更好的副本位置被标定使用,导致现有的副本分配被取消,出现未分配。

6、集群状态红色如何排查?

症状:集群健康值红色; 
日志:集群服务连接超时; 
可能原因:集群中部分节点的主分片未分配。 
接下来的解决方案主要围绕:使主分片unsigned 分片完成再分配展开。

7、如何Fixed unassigned 分片问题?

方案一:极端情况——这个分片数据已经不可用,直接删除该分片。 
ES中没有直接删除分片的接口,除非整个节点数据已不再使用,删除节点。 
curl -XDELETE ‘localhost:9200/index_name/’

方案二:集群中节点数量>=集群中所有索引的最大副本数量 +1。 
N> = R + 1 
其中: 
N——集群中节点的数目; 
R——集群中所有索引的最大副本数目。 
知识点:当节点加入和离开集群时,主节点会自动重新分配分片,以确保分片的多个副本不会分配给同一个节点。换句话说,主节点不会将主分片分配给与其副本相同的节点,也不会将同一分片的两个副本分配给同一个节点。 
如果没有足够的节点相应地分配分片,则分片可能会处于未分配状态。 
由于我的集群就一个节点,即N=1;所以R=0,才能满足公式。

问题就转嫁为: 
1)添加节点处理,即N增大; 
2)删除副本分片,即R置为0。 
R置为0的方式,可以通过如下命令行实现:

root@tyg:/# curl -XPUT "http://localhost:9200/_settings" -d‘ {  "number_of_replicas" : 0 } ‘
{"acknowledged":true}
  • 1
  • 2

方案三:allocate重新分配分片。 
如果方案二仍然未解决,可以考虑重新分配分片。

可能的原因:

1)节点在重新启动时可能遇到问题。正常情况下,当一个节点恢复与群集的连接时,它会将有关其分片的信息转发给主节点,然后主节点将这分片从“未分配”转换为“已分配/已启动”。

2)当由于某种原因(例如节点的存储已被损坏)导致该进程失败时,分片可能保持未分配状态。

在这种情况下,您必须决定如何继续:尝试让原始节点恢复并重新加入集群(并且不要强制分配主分片);

或者强制使用Reroute API分配分片并重新索引缺少的数据原始数据源或备份。 
如果您决定分配未分配的主分片,请确保将“allow_primary”:“true”标志添加到请求中。

ES5.X使用脚本如下:

NODE="YOUR NODE NAME"
IFS=$‘\n‘
for line in $(curl -s ‘localhost:9200/_cat/shards‘ | fgrep UNASSIGNED); do
  INDEX=$(echo $line | (awk ‘{print $1}‘))
  SHARD=$(echo $line | (awk ‘{print $2}‘))

  curl -XPOST ‘localhost:9200/_cluster/reroute‘ -d ‘{
     "commands": [
        {
            " allocate_replica ": {
                "index": "‘$INDEX‘",
                "shard": ‘$SHARD‘,
                "node": "‘$NODE‘",
                "allow_primary": true
          }
        }
    ]
  }‘
done

—————————————————————————————

原文地址:https://www.cnblogs.com/seaspring/p/9322582.html

时间: 2024-10-11 03:46:43

干货 | Elasticsearch 集群健康值红色终极解决方案【转】的相关文章

启动elasticsearch-head显示集群健康值:未连接

ES启动后,进行es header访问的话,使用localhost:9100会显示集群健康值未连接 2种情况(均为windows10环境下): 1:未在elasticsearch-6.8.0\config\elasticsearch.yml中进行ip配置 win+R--cmd--ipconfig查看本机ip 在elasticsearch.yml中将ip添加进去 network.host: 192.168.1.103 保存后重新启动ES,使用http:\\ip:9100进行可视化访问 2.如果你已

elasticsearch集群健康状态查看

1. 查看ES集群健康状态 http://localhost:9200/_cluster/health?pretty 响应: { "cluster_name" : "if2c", "status" : "yellow", //集群的状态红绿灯,绿:健康,黄:亚健康,红:病态 "timed_out" : false, "number_of_nodes" : 1, //节点数 "n

基于swarm的elasticsearch集群搭建

es集群构建: 1.安装head插件: for Elasticsearch 5.x: docker run -p 9100:9100 mobz/elasticsearch-head:5 ( docker run -p 9100:9100 10.211.121.26/library/elasticsearch-head ) 出现问题 head主控页面是可以显示的,但是显示连接失败 "集群健康值: 未连接" 解决方案 修改elasticsearch.yml文件 vim $ES_HOME$/

Elasticsearch集群 {"acknowledged"=>true, "shards_acknowledged"=>false}

Elasticsearch集群创建索引的时候,返回{"acknowledged"=>true, "shards_acknowledged"=>false}错误.集群健康值为Red. 原因是磁盘空间不够了,输入df -h命令可以看到文件系统已用超过了85%. 找到原因错误就好解决了,办法就是扩容,即虚拟机系统磁盘扩容.由于每个人的虚拟机装的不一样这里就不贴出了. 原文地址:https://www.cnblogs.com/cracker13/p/116869

Elasticsearch学习笔记-03.1集群健康

本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_cluster_health.html 让我们以一个基础的健康检查开始,用这个检查我们可以得知我们的集群工作状态如何.咱们来使用curl做这个检查,不过你也可以使用任何能发起HTTP/REST请求的工具来做这个练习.假设我们仍旧在启动E

Elasticsearch集群知识笔记

Elasticsearch集群知识笔记 Elasticsearch内部提供了一个rest接口用于查看集群内部的健康状况: curl -XGET http://localhost:9200/_cluster/health response结果: { "cluster_name": "format-es", "status": "green", ... } 这里的status有3种状态,分别是green(所有主分片和复制分片都可用

[Elasticsearch] 集群的工作原理 - 第一部分

本文翻译自Elasticsearch官方指南的life inside a cluster一章. ES就是为高可用和可扩展而生的. 扩展能够通过购置性能更强的server(垂直扩展或者向上扩展,Vertical Scale/Scaling Up),亦或是通过购置很多其它的server(水平扩展或者向外扩展,Horizontal Scale/Scaling Out)来完毕. 虽然ES可以利用更强劲的硬件.垂直扩展毕竟还是有它的极限.真正的可扩展性来自于水平扩展 - 通过向集群中加入很多其它的节点来分

ES2:ElasticSearch 集群配置

ElasticSearch共有两个配置文件,都位于config目录下,分别是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 是全局配置文件,用于在服务器级别对ElasticSearch进行配置.ElasticSearch的配置选项分为静态设置和动态设置两种,静态设置必须在结点级别(node-level)设置,或配置在elasticsearch.yml配置文件中,或配置在环境变量中,或配置在命令行中,在结点启动之后,静态设置不能修改.集群的名字

elasticsearch集群介绍及优化【转】

elasticsearch用于构建高可用和可扩展的系统.扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),Elasticsearch能从更强大的硬件中获得更好的性能,但是纵向扩展也有一定的局限性.真正的扩展应该是横向的,它通过增加节点来传播负载和增加可靠性.对于大多数数据库而言,横向扩展意味着你的程序将做非常大的改动来利用这些新添加的设备.对比来说,Elasticsearch天生是分布式的:它知道如何管理节点来提供高扩展和高可用.这意味着你的程序不需要关心这些.对于大