天天看點

Elasticsearch究竟要設定多少分片數?1、什麼是分片?2、索引有效期( retention period )3、索引和分片不是空閑的?4、分片的大小如何影響性能?5、如何管理分片大小?6、結論

Elasticsearch究竟要設定多少分片數?1、什麼是分片?2、索引有效期( retention period )3、索引和分片不是空閑的?4、分片的大小如何影響性能?5、如何管理分片大小?6、結論
連結

Elasticsearch是一個非常通用的平台,支援各種各樣的用例,并且為資料組織和複制政策提供了巨大靈活性。這種靈活性使得作為ELK新手的你将資料組織成索引和分片變得困難。雖然不一定會在首次啟動時出現問題,但由于資料量随時間的推移,可能會導緻性能問題。叢集所擁有的資料越多,糾正問題就越困難,甚至有時可能需要重新索引大量資料。

當我們遇到遭遇性能問題的使用者時,可以追溯到關于資料索引的資料和群集數量的問題并不罕見。 對于涉及multi-tenancy或使用基于時間的索引的使用者尤其如此。 在與使用者讨論這個問題時(會議、論壇形式),引申出的一些最常見的問題是:

1)“我應該有多少個分片?”
2)“我的分片應該有多大”?
• 1
• 2      

這篇部落格文章旨在幫助您回答這些問題,并為使用基于時間的索引的使用案例( 日志記錄或安全分析 )提供實用的指導。

1、什麼是分片?

在開始之前,讓我們約定文章中用到的一些概念和術語。

Elasticsearch中的資料組織成索引。每一個索引由一個或多個分片組成。每個分片是Luncene索引的一個執行個體,你可以把執行個體了解成自管理的搜尋引擎,用于在Elasticsearch叢集中對一部分資料進行索引和處理查詢。

【重新整理】當資料寫入分片時,它會定期地釋出到磁盤上的新的不可變的Lucene段中,此時它可用于查詢。——這被稱為重新整理。更詳細的解讀請參考:

http://t.cn/R05e3YR

【合并】随着分段數(segment)的增長,這些segment被定期地整合到較大的segments。 這個過程被稱為合并(merging)。

由于所有段都是不可變的, 因為新的合并段需要建立,舊的分段将被删除 ,這意味着所使用的磁盤空間通常在索引時會波動。 合并可能資源相當密集,特别是在磁盤I/O方面。

分片是Elasticsearch在叢集周圍分發資料的機關。 Elasticsearch在重新平衡資料時 (例如 發生故障後) 移動分片的速度 取決于分片的大小和數量以及網絡和磁盤性能。

提示:避免有非常大的分片,因為大的分片可能會對叢集從故障中恢複的能力産生負面影響。 對于多大的分片沒有固定的限制,但是分片大小為50GB通常被界定為适用于各種用例的限制。

2、索引有效期( retention period )

由于段是不可變的,更新文檔需要Elasticsearch首先查找現有文檔,然後将其标記為已删除,并添加更新的版本。删除文檔還需要找到文檔并将其标記為已删除。是以,删除的文檔将繼續占據磁盤空間和一些系統資源,直到它們被合并,這将消耗大量的系統資源。

Elasticsearch允許從檔案系統直接删除完整索引,而不必明确地必須單獨删除所有記錄。這是迄今為止從Elasticsearch删除資料的最有效的方式。

***提示:*盡可能使用基于時間的索引來管理資料。根據保留期(retention period,可以了解成有效期)将資料分組。基于時間的索引還可以輕松地随時間改變主分片和副本分片的數量(以為要生成的下一個索引進行更改)。這簡化了适應不斷變化的資料量和需求。

3、索引和分片不是空閑的?

【叢集狀态】對于每個Elasticsearch索引,其映射和狀态的資訊都存儲在叢集狀态。 這些叢集狀态資訊儲存在記憶體中以便快速通路。 是以,如果在叢集中擁有大量索引,可能導緻大的叢集狀态(特别是如果映射較大)。 所有更新叢集狀态操作為了在叢集中保證一緻性,需要通過單個線程完成,是以更新速度将變慢。

提示:*為了減少索引數量并避免大的乃至非常龐大的映射,請考慮将相同索引結構的資料存儲在相同的索引中*,而不是基于資料的來源将資料分割成獨立的索引。 在每個索引的索引數量和映射大小之間找到一個很好的平衡很重要。**

每個分片都有資料需要儲存在記憶體中并使用堆空間。 這包括在分片級别儲存資訊的資料結構,也包括在段級别的資料結構,以便定義資料駐留在磁盤上的位置。 這些資料結構的大小不是固定的,并且将根據用例而有所不同。

然而,段相關開銷的一個重要特征是它與分段的大小不成正比。 這意味着與較小的段相比,較大的段的每個資料量具有較少的開銷,且這種差異很大。

【堆記憶體的重要性】為了能夠每個節點存儲盡可能多的資料,重要的是盡可能多地管理堆記憶體使用量并減少其開銷。 節點擁有的堆空間越多,它可以處理的資料和分片越多。

是以,索引和分片從叢集的角度看待不是空閑的,因為每個索引和分片都有一定程度的資源開銷。

提示1:小分片會導緻小分段(segment),進而增加開銷。目的是保持平均分片大小在幾GB和幾十GB之間。對于具有基于時間的資料的用例,通常看到大小在20GB和40GB之間的分片*。*

提示2:由于每個分片的開銷取決于分段數和大小,通過強制操作迫使較小的段合并成較大的段可以減少開銷并提高查詢性能。一旦沒有更多的資料被寫入索引,這應該是理想的。請注意,這是一個消耗資源的(昂貴的)操作,較為理想的處理時段應該在非高峰時段執行。

提示3:您可以在叢集節點上儲存的分片數量與您可用的堆記憶體大小成正比,但這在Elasticsearch中沒有的固定限制。 一個很好的經驗法則是:確定每個節點的分片數量保持在低于每1GB堆記憶體對應叢集的分片在20-25之間。 是以,具有30GB堆記憶體的節點最多可以有600-750個分片,但是進一步低于此限制,您可以保持更好。 這通常會幫助群體保持處于健康狀态。

4、分片的大小如何影響性能?

在Elasticsearch中,每個查詢在每個分片的單個線程中執行。然而,可以并行處理多個分片,并可以在相同分片上執行多個查詢和聚合。

【小分片的利弊】這意味着,在不涉及高速緩存時,最小查詢延遲将取決于資料、查詢的類型、分片的大小。查詢大量小分片将使得每個分片的處理速度更快,但是随着更多的任務需要按順序排隊和處理,它不一定要比查詢較小數量的更大的分片更快。如果有多個并發查詢,則有很多小碎片也會降低查詢吞吐量。

提示:從查詢性能角度确定最大分片大小的最佳方法是使用逼真的資料和查詢進行基準測試(真實資料而非模拟資料)。 始終使用查詢和索引負載進行基準測試,代表節點在生産中需要處理的内容,因為單個查詢的優化可能會産生誤導性的結果。

5、如何管理分片大小?

當使用基于時間的索引時,每個索引傳統上都與固定的時間段相關聯。 每日索引非常普遍,經常用于持有時間區間短或每日量大的資料。 這些允許資料期限期間以良好的粒度進行管理,并且可以友善地對每天更換調整volumes。

時間周期長的資料,特别是如果每日不儲存每天的索引資料,則通常會使用每周或每月的儲存的碎片大小的增加。 這減少了随着時間的流逝需要存儲在群集中的索引和碎片數量大小(直譯有點費勁此處)。

提示:如果使用固定期限的時間索引資料,可以根據時間周期和預期資料量調整所涵蓋的時間範圍,以達到目标分片大小。

【均勻更新&快速變化的索引資料對比】具有固定時間間隔的基于時間的索引在資料量合理預測并且變化緩慢的情況下工作良好。 如果索引率可以快速變化,則很難保持均勻的目标分片大小。

為了能夠更好地處理這種情況,推出了Rollover和Shrink API。 這些增加了如何管理索引和分片的靈活性,尤其适用于基于時間的索引。

此處省略了 Rollover和Shrink API的介紹。(建議查詢官網補齊概念再深入)

6、結論

這篇部落格文章提供了有關如何在Elasticsearch中最好地管理資料的提示和實用指南。 如果您有興趣了解更多,推薦閱讀Google搜尋 “Elasticsearch: the definitive guide” (有點舊,值得閱讀)。

然而,關于如何最好地在索引和分片上分發資料的許多決策将取決于用例細節,有時可能難以确定如何最佳地應用可用的建議。

文章提及的幾個核心建議清單如下,以回答文章開頭的提問。

1) “我應該有多少個分片?”
答: 每個節點的分片數量保持在低于每1GB堆記憶體對應叢集的分片在20-25之間。
2) “我的分片應該有多大”?
答:分片大小為50GB通常被界定為适用于各種用例的限制。
• 1
• 2
• 3
• 4      

還是讀起來有點拗口,一些概念還是不夠深入,不能很好的深入淺出的講解。

待我實踐中更新吧。更多細節,歡迎讨論!

繼續閱讀