原文出处:http://www.jwsblog.com/archives/59.html

red


原因

red表示不是所有的主分片都可用,通常时由于某个索引的住分片为分片unassigned,只要找出这个索引的分片,手工分配即可

处理

  • 官方文档的详细说明

  • 通过curl GET http://{ESIP}:9200/_cluster/health?level=indices查看所有索引信息,查看下是哪个索引的status是red导致了集群都red了(集群索引多的时候一眼看不出来,直接把结果拷出来,搜red关键字就跟踪到索引和分片了)

  • 如果这个索引不是很重要,直接delete掉省事,集群状态马上恢复green完事~

  • 通过reroute强制分配该分片(文章后面)

yellow


原因

yellow表示所有主分片可用,但不是所有副本分片都可用,最常见的情景是单节点时,由于es默认是有1个副本,主分片和副本不能在同一个节点上,所以副本就是未分配unassigned

处理

  • 过滤查看所有未分配索引的方式,curl -s "http://10.19.22.142:9200/_cat/shards" | grep UNASSIGNED结果如下,第一列表示索引名,第二列表示分片编号,第三列p是主分片,r是副本

curl -s "http://{ESIP}:9200/_cat/shards" | grep UNASSIGNED
eslog1                 3 p UNASSIGNED
eslog1                 3 r UNASSIGNED
eslog1                 1 p UNASSIGNED
eslog1                 1 r UNASSIGNED

分配分片


知道哪个索引的哪个分片就开始手动修复,通过reroute的allocate分配

curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{
    "commands" : [ {
          "allocate" : {
              "index" : "eslog1",
              "shard" : 4,
              "node" : "es1",
              "allow_primary" : true
          }
        }
    ]
}'

分配时可能遇到的坑,需要注意的地方


  • 分配副本时必须要带参数"allow_primary" : true, 不然会报错

  • 当集群中es版本不同时,如果这个未分配的分片是高版本生成的,不能分配到低版本节点上,反过来低版本的分片可以分配给高版本,如果遇到了,只要升级低版本节点的ES版本即可(博主注:es的版本号要全部一致,小版本之间也会出现此兼容性问题,比如2.4.4和2.4.6,并且升级es要谨慎,也是一个大坑)

  • (升级ES版本详见官方详细文档,我是ubuntu系统apt安装的,直接apt-get install elasticsearch升级的,elasticsearch.yml配置文件没变不用修改,但是/usr/share/elasticsearch/bin/elasticsearch文件中有个内存配置ES_HEAP_SIZE=6G需要再手动加一下&重启es)