在一次es集群崩溃重启之后,有分片出现了UNASSIGNED状态,我发现一直没有总结过这个问题的解决方法,以下是我所了解的解决方法,望补充,或指明问题
命令:
GET /_cat/shards
在返回结果中查看状态为UNASSIGNED的分片
对UNASSIGNED的分片执行以下命令:
POST /_cluster/reroute { "commands": [ { "allocate_replica": { "index": "cache", "shard": 1, "node": "cluster1" } } ] }若副本分片没有问题即可成功
记一个reroute报错
然后根据提示执行
POST /_cluster/reroute?retry_failed=true等了一会,看到分片依旧还是UNASSIGNED...
细看,发现主备分片的数据量都不同了,这种情况下备份分片自然是起不来了
将索引的副本分片数量改为0,那么elasticsearch会自动删掉副本分片
PUT /cache/_settings { "number_of_replicas": "0" }执行 GET /_cat/shards,查看cache索引是否还有UNASSIGNED状态的分片,没有的话,再执行
PUT /cache/_settings { "number_of_replicas": "1" }es会生成备份分片,并进行而分配
执行以下命令,做一个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一下.