集群状态为 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 | curl -s "http://{ESIP}:9200/_cat/shards" | grep UNASSIGNED |
第一列表示索引名,第二列表示分片编号,第三列p是主分片,r是副本
分配分片
知道哪个索引的哪个分片就开始手动修复,通过reroute的allocate分配
1 | curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{ |
分配时可能遇到的坑,需要注意的地方
- 分配副本时必须要带参数
"allow_primary" : true
, 不然会报错 - 当集群中es版本不同时,如果这个未分配的分片是高版本生成的,不能分配到低版本节点上,反过来低版本的分片可以分配给高版本,如果遇到了,只要升级低版本节点的ES版本即可
- (升级ES版本详见官方详细文档,我是ubuntu系统apt安装的,直接
apt-get install elasticsearch
升级的,elasticsearch.yml
配置文件没变不用修改,但是/usr/share/elasticsearch/bin/elasticsearch
文件中有个内存配置ES_HEAP_SIZE=6G
需要再手动加一下&重启es)