[譯] Elasticsearch 究竟要設置多少分片數?">[譯] Elasticsearch 究竟要設置多少分片數?

分類:IT技術 時間:2017-09-26

0、引言

本文翻譯自Elasticsearch20170918熱乎的官方博客,原作者:Christian Dahlqvist。 在構建Elasticsearch集群的初期如果集群分片設置不合理,可能在項目的中後期就會出現性能問題。

Elasticsearch是一個非常通用的平臺,支持各種各樣的用例,並且為數據組織和復制策略提供了巨大靈活性。這種靈活性使得作為ELK新手的你將數據組織成索引和分片變得困難。雖然不一定會在首次啟動時出現問題,但由於 數據量隨時間的推移,可能會導致性能問題 。集群所擁有的數據越多,糾正問題就越困難,甚至有時可能需要重新索引大量數據。

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

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。

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

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

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

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

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

6、結論

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

然而,關於如何最好地在索引和分片上分發數據的許多決策將取決於用例細節,有時可能難以確定如何最佳地應用可用的建議。

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

1) “我應該有多少個分片?
” 答: 每個節點的分片數量保持在低於每1GB堆內存對應集群的分片在20-25之間。
 2) “我的分片應該有多大”? 
答:分片大小為50GB通常被界定為適用於各種用例的限制。

還是讀起來有點拗口,一些概念還是不夠深入,不能很好的深入淺出的講解。 
待我實踐中更新吧。更多細節,歡迎討論!

 


Tags: 分片 索引 數據 Elasticsearch 問題 集群

文章來源:


ads
ads

相關文章
ads

相關文章

ad