解决elasticsearch分片unassigned的3个方法

mac2024-05-20  33

在一次es集群崩溃重启之后,有分片出现了UNASSIGNED状态,我发现一直没有总结过这个问题的解决方法,以下是我所了解的解决方法,望补充,或指明问题

1.查找UNASSIGNED分片

命令:

GET /_cat/shards

在返回结果中查看状态为UNASSIGNED的分片

 

2.加载UNASSIGNED分片

 

使用reroute解决

对UNASSIGNED的分片执行以下命令:

POST /_cluster/reroute { "commands": [ { "allocate_replica": { "index": "cache", "shard": 1, "node": "cluster1" } } ] }

若副本分片没有问题即可成功

记一个reroute报错

 

然后根据提示执行

POST /_cluster/reroute?retry_failed=true

等了一会,看到分片依旧还是UNASSIGNED...

细看,发现主备分片的数据量都不同了,这种情况下备份分片自然是起不来了

 

 

修改number_of_replicas 数量

将索引的副本分片数量改为0,那么elasticsearch会自动删掉副本分片

PUT /cache/_settings {      "number_of_replicas": "0" }

执行 GET /_cat/shards,查看cache索引是否还有UNASSIGNED状态的分片,没有的话,再执行

PUT /cache/_settings {      "number_of_replicas": "1" }

es会生成备份分片,并进行而分配

 

使用reindex解决

执行以下命令,做一个cache索引的备份

POST /_reindex { "source": { "index": "cache" }, "dest": { "index": "cache.bak", "version_type": "external" } }

新生成的cache.bak索引的分片情况正常

删除原有索引

DELETE /cache

 

然后可以选择对cache.bak进行reindex,重新生成一个cache索引,并删除cache.bak

POST /_reindex { "source": { "index": "cache.bak" }, "dest": { "index": "cache", "version_type": "external" } } DElETE /cache.bak

 

或者给cache.bak设置一个别名,让它可以当做cache索引被操作

PUT cache.bak/_alias/cache

 

以上的3个就是我所了解的解决UNASSIGNED的方法.

如果所使用的es集群使用了snapshot仓库,也可以先备份索引,后删除,再restore一下.

 

 

 

 

 

 

最新回复(0)