在一次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一下.