使用ES时经常会在索引上出问题,总结一些小tips,以后遇到什么问题,以及相应的解决方案,都会慢慢增加。
关于unassigned shards的问题,一般遇到这种情况都是——重启试试。因为可能是网络通信问题会影响分片分配。
另外也可以看看日志,报了什么错,有遇到过硬盘了满了或者超过85%的限制导致不能分配分片的情况,具体问题具体分析。
不行的话,只能强制删除。
那么,首先得看集群状态:
curl -XGET 'http://localhost:9200/_cluster/health'
第二,看所有的shards:
curl -XGET 'http://localhost:9200/_cat/shards'
第三,看unassignded shards:
curl -XGET 'http://localhost:9200/_cat/shards' | grep UNASSIGNED
那些索引挂了的,估计也难得恢复了,很大程度上只能自求多福了。似乎有解决方案,只是颇为繁琐。
在Google的时候发现出问题的情况有很多,有人是因为空间不够了导致的问题,有些则是因为集群间通信的故障导致的。
首先检查下是不是有文档丢失,在head图形化界面里看清楚,到底文档有没有丢失。一般说来如果有丢失的话,估计很难找回来,如果没有丢失的话,可能需要做的是强行分配shard。
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
"commands": [{
"allocate": {
"index": "my-index",
"shard": 4,
"node": "search03",
"allow_primary": 1
}
}]
}'
曾经这么弄好过没丢失数据的分片。
over!
PS:其实还有一种办法,如果你有副本,尝试将副本数量降低一个,比如replica=2降为1,也可能成功哦。
关于如何回复unassigned shards,可以参考本blog中另一篇关于如何处理的,能够完美回复所有丢失的分片。