解决ES分片未分配的问题

时间:2024-05-19 22:50:35

1、定位问题分片:

使用EScat 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为副本数量)

 

 解决ES分片未分配的问题

如上图,many-shards索引有8个分片(两份副本分片)未分配,而每个节点都已经分配了一份分片。解决这个问题可以通过增加节点或者减少副本数量

本例中需要增加两个节点或者减少副本数为2

减少副本数为2

curl -XPUT'localhost:9200/<INDEX_NAME>/_settings' -d'{"number_of_replicas": 2}'

执行命令后:

 解决ES分片未分配的问题

 

4、需要对分片进行重分配

分片重分配默认是开启的,但是可能因为某些原因关闭了重分配但是忘记开启了

 

 解决ES分片未分配的问题

 


开启重分配命令:

curl -XPUT 'localhost:9200/_cluster/settings'-d
'{ "transient":
  {"cluster.routing.allocation.enable" : "all"
  }
}'

开启后,分片被重分配

解决ES分片未分配的问题 

 

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改为persistentES设置中百分比多指已使用空间,字节值多指未使用空间

 

 

7、多版本问题

ES集群中存在多版本ES,导致不兼容问题

 

参考链接:

1https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/