一、初識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/zh-tw/n/146392.html