1、定位问题分片:
使用ES的cat API可以分析出未分配的分片信息及未分配的原因
curl -XGETlocalhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason| grepUNASSIGNED
命令返回信息包括索引名称、分片编号、是主分片还是副本分片、未分配原因等
hole | 0 | P | UNASSIGNED | CLUSTER_RECOVERED |
如果是已删除索引的分片,可以直接使用删除命令删除索引:
curl -XDELETE 'localhost:9200/index_name/'
2、集群有目的的延迟分配
当某个节点脱离集群,主节点会暂时的延迟重分配分片,以减少重新平衡分片带来的资源浪费,这种情况下,如果源节点在一定时间(默认1分钟)内重新加入,可以恢复分片信息。这种情况的日志信息如下:
[TIMESTAMP][INFO][cluster.routing] [MASTER NODE NAME]delaying allocation for [54] unassigned shards, next check in [1m]
可以手动修改延迟时间:
curl -XPUT'localhost:9200/<INDEX_NAME>/_settings' -d '
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "30s"
}
}'
如果需要修改所有索引的阀值,则可以使用_all替换<INDEX_NAME>
3、分片数目过多,而节点数不足
主节点不会将主分片和副本分片分配至同一个节点,同样,也不会将两个副本节点分配到同一个节点,所以当没有足够的节点分配分片时,会出现未分配的状态;
为了避免该种情况发生,节点数和副本数的关系应该为N>=R+1 (其中N为节点数,R为副本数量)
如上图,many-shards索引有8个分片(两份副本分片)未分配,而每个节点都已经分配了一份分片。解决这个问题可以通过增加节点或者减少副本数量
本例中需要增加两个节点或者减少副本数为2
减少副本数为2:
curl -XPUT'localhost:9200/<INDEX_NAME>/_settings' -d'{"number_of_replicas": 2}'
执行命令后:
4、需要对分片进行重分配
分片重分配默认是开启的,但是可能因为某些原因关闭了重分配但是忘记开启了
开启重分配命令:
curl -XPUT 'localhost:9200/_cluster/settings'-d
'{ "transient":
{"cluster.routing.allocation.enable" : "all"
}
}'
开启后,分片被重分配
5、集群中分片数据已不存在
如上图中的constant-updates索引的0分片,数据在集群中已不存在,处理方法:
1)恢复存有0分片的源节点,并加入到集群中(不强制重新分配主分片)
2)使用Reroute API强制重分配分片
curl -XPOST'localhost:9200/_cluster/reroute' -d '{ "commands" :
[ { "allocate_empty_primary" :
{ "index" :"constant-updates", "shard" : 0, "node":"<NODE_NAME>", "accept_data_loss": "true" }
}]
}'
3)从原始数据重建索引或者从备份快照中恢复
6、磁盘空间不足
一般情况下,当磁盘利用率达到85%时,主节点将不再分配分片至该节点上
可以使用如下命令查看磁盘利用率:
curl -s 'localhost:9200/_cat/allocation?v'
如果磁盘空间比较大,而85%利用率有些浪费,可以通过设置
cluster.routing.allocation.disk.watermark.low和(或)cluster.routing.allocation.disk.watermark.high来增加该值
curl -XPUT 'localhost:9200/_cluster/settings'-d
'{
"transient": {
"cluster.routing.allocation.disk.watermark.low":"90%"
}
}'
注:如果需要集群重启有效,可将transient改为persistent;ES设置中百分比多指已使用空间,字节值多指未使用空间
7、多版本问题
ES集群中存在多版本ES,导致不兼容问题
参考链接:
1、https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/