一、初识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操作,如定期维护、备份数据等,从而避免分片未分配或其他问题的出现。