原文出处:
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 UNASSIGNEDeslog1 3 p UNASSIGNEDeslog1 3 r UNASSIGNEDeslog1 1 p UNASSIGNEDeslog1 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)