一、初识esunassigned
esunassigned是一个开源的Elasticsearch插件,旨在解决Elasticsearch无法自动分配未分配shard的问题。
Elasticsearch是一个基于Lucene库的分布式全文搜索引擎,提供了高效、强大的搜索功能。它将数据拆分成多个分片(shard)并存储在不同的节点上,提高了搜索效率,同时也提高了搜索的容错性。
然而,在集群运行中,有些分片可能会因为各种原因未被分配到节点上,这时就需要手动处理,而esunassigned就是解决这个问题的利器。
二、esunassigned的优势
esunassigned具有以下优点:
- 自动分配未分配分片。
- 能够定期监控未分配分片情况。
- 支持可配置的重试机制和超时机制。
- 支持Elasticsearch版本5.0及以上。
要使用esunassigned,只需要简单地把它放到Elasticsearch的plugins目录下,并在elasticsearch.yml配置文件中添加以下配置项即可:
esunassigned: interval: 1m timeout: 5m retry: attempts: 3 delay: 1m
三、esunassigned的使用
使用esunassigned非常简单,只需在Elasticsearch集群中启用该插件即可。当插件启动后,它会定期扫描未分配的分片并自动将它们分配到可用的节点上。
以上述配置文件为例:
- interval:表示监控时间间隔,本例中设为1分钟。
- timeout:表示分配超时时间,本例中设为5分钟。
- retry:是重试机制的相关配置。
- attempts:表示尝试次数,本例中设为3次。
- delay:表示重试的时间间隔,本例中设为1分钟。
根据实际情况,可以根据需要进行调整。
四、esunassigned源码剖析
esunassigned的源码主要分为三个部分:
- Monitor:监控未分配的分片。
- Allocator:分配未分配的分片到可用节点。
- Utils:工具类。
需要注意的是,分配分片涉及到集群路由、数据迁移等复杂的操作,因此需要考虑各种异常情况。esunassigned做了很多容错处理,保证了其健壮性。
下面是分配分片到节点的核心代码:
ClusterAllocationExplanation explanation = allocator.explainAllocation(shard, unassignedInfo, clusterState, checkExisting, includeYesDecisions, explainCancellableTasks); if (logger.isDebugEnabled()) { logger.debug("[{}] [{}] - allocation explanation [{}]", new Object[]{shard.topLevelReason(), shard, explanation}); } if (explanation != null && explanation.isYes()) { try { shardStateChange(state, "from [unassigned] to [initializing]"); allocationService.reroute(Collections.singleton(shard), "allocate_unassigned"); } catch (Throwable t) { logger.warn("[{}] [{}] - allocation failed, reason [{}]", new Object[]{shard.topLevelReason(), shard, explanation.getExplanation()}); shardStateChange(state, "from [unassigned] to [unassigned]", getShardValue(shardState, shard.getIndex(), shard.getId())); return false; } return true; }
实现了自动分配未分配分片功能后,就可以耐心等待esunassigned定期分配未分配分片了。
五、esunassigned存在的问题和解决方案
使用esunassigned可能会遇到以下问题:
- 分配分片失败。
- 分配分片后,仍有部分分片未被分配。
- 分配分片时出现异常。
面对这些问题,我们可以采取以下措施:
- 查看日志,了解失败原因。
- 手动分配未分配的分片。
- 升级或降级esunassigned,或切换其他插件。
当然,使用esunassigned最好还是进行一些基本的ES操作,如定期维护、备份数据等,从而避免分片未分配或其他问题的出现。
原创文章,作者:VGGL,如若转载,请注明出处:https://www.506064.com/n/146392.html