Elasticsearch集群yellow和red状态处理

集群状态为 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://localhost:9200/_cat/shards" | grep UNASSIGNED结果如下:

1
2
3
4
5
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

第一列表示索引名,第二列表示分片编号,第三列p是主分片,r是副本


分配分片

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

1
2
3
4
5
6
7
8
9
10
11
curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{
"commands" : [ {
"allocate" : {
"index" : "eslog1",
"shard" : 4,
"node" : "es1",
"allow_primary" : true
}
}
]
}'

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

  • 分配副本时必须要带参数"allow_primary" : true, 不然会报错
  • 当集群中es版本不同时,如果这个未分配的分片是高版本生成的,不能分配到低版本节点上,反过来低版本的分片可以分配给高版本,如果遇到了,只要升级低版本节点的ES版本即可
  • (升级ES版本详见官方详细文档,我是ubuntu系统apt安装的,直接apt-get install elasticsearch升级的,elasticsearch.yml配置文件没变不用修改,但是/usr/share/elasticsearch/bin/elasticsearch文件中有个内存配置ES_HEAP_SIZE=6G需要再手动加一下&重启es)

原文链接:http://www.jwsblog.com/archives/59.html

-------------本文结束感谢您的阅读-------------