解决elasticsearch集群Unassigned Shards 无法reroute的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决elasticsearch集群Unassigned Shards 无法reroute的问题相关的知识,希望对你有一定的参考价值。

参考技术A 接上篇文章 http://www.jianshu.com/p/329b9f92ac4c
在上一篇文章中,由于系统宕机,导致大量索引出现了Unassigned 状态。在上一篇文章中,我们通过reroute API进行了操作,对主分片缺失的索引,经过上述操作之后,分配了主分片。但是在接下来的操作中,对于副本分片,reroute出错!
如下是索引 alarm-2017.08.12,第0个分片的副本没有分配:

结果执行失败!

注意看错误:

表面上看好像是还是超出了文件limits。但是在做上述操作的过程中,我已经将所有配置调整,并将elasticsearch集群升级,新增了两台服务器,将服务器修改为如下节点:

但是报错日志中还是node8,这证明可能是上次宕机直接导致了副本文件不可用,无法进行reroute.
现在查看各节点的limits配置:

结果:

可以看到每个节点的max_file_descriptors都非常大,不太可能出现无法打开文件的错误,这只有一种可能,就是原来的副本分片数据存在问题,无法reroute。
副本无法reroute!!!
想了各种办法之后,决定用以下两种方式来解决:
方法一:我想到了将索引snapshot到文件系统,之后再restore 。
但是这个方案再尝试了一个索引之后放弃。因为elasticsearch的snapshot需要每个节点的snapshot目录通过NFS方式实现网络共享。也就是类似与windows的共享文件夹。这样来保证所有节点的备份都导出到同一个目录。这个方案被放弃的原因是nfs共享目录还没有建立,而且这个过程比较复杂。如果有更好的办法肯定放弃这个方案。
方法二:有没有一种简单的办法让索引重建?我查看了elasticsearch的官方文档。终于找到了reindex。对就是这个功能强大的reindex。
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
具体参数可参考上述链接。这个reindex不仅可以让本地索引重建,而且还可以以其他elasticsearch服务器为源重建索引。也就是说可以将其他集群的索引拷贝到目标集群。
补充:
方法三:还有一种更为快捷的办法,考虑到elasticsearch的分片的副本可以动态的设置,那么其实可以先将 number_of_replicas 设为0,待副本分片都删除之后,再将number_of_replicas改为1,这样副本分片就会自动恢复。同时,考虑到副本的优化情况,建议在做该操作的同时,做一次段合并。以节约空间和减少文件句柄数。

选择了目标索引
alarm-2017.08.12

响应结果

再查看索引监控,发现索引重建成功,分片也正常。

现在只需要将原来的索引删除即可!
如果需要索引名与之前一致,则将现有索引增加一个别名即可。
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index-aliases.html

不难发现,在elasticsearch中并没有类似于mysql table那样直接可以修改表名的操作,这可能与elasticsearch的特殊结构有关系。reindex是一个非常重要的操作,在某些方面,甚至可能取代备份的snapshot。直接通过一个新的集群将数据copy。

选取目标索引
applog-prod-2016.12.18
可以看到存在分片未分配状况:

现在修改number_of_replicas

可以看到number_of_replicas变成了0,分片只有1份

分片:

对段进行合并:

之后再将number_of_replicas改回来

分片情况:

可以发现分片会被初始化,恢复到2个分片。

对于索引出现Unassigned 的情况,最好的解决办法是reroute,如果不能reroute,则考虑重建分片,通过number_of_replicas的修改进行恢复。如果上述两种情况都不能恢复,则考虑reindex。

以上是关于解决elasticsearch集群Unassigned Shards 无法reroute的问题的主要内容,如果未能解决你的问题,请参考以下文章

ELK+Filebeat+Nginx集中式日志解决方案——添加ElasticSearch集群

ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决

关于elasticsearch 6.x及其插件head安装(单机与集群)5分钟解决

关于Elasticsearch集群脑裂brain-split的预防与解决

xml CouponCustomer_Unassign.xml

xml CouponCustomer_Unassign.xml