ES索引段合併策略

2021-08-24 18:09:22 字數 3424 閱讀 9405

儘管段合併有這些好處,但使用者也應該了解到段合併的代價,即主要是i/o操作的代價。在速度較慢的系統中,段合併會顯著影響效能。基於這個原因,elasticsearch允許使用者選擇段合併策略(merge policy)及儲存級節流(store level throttling)。本章後續部分將會討論段合併策略,而儲存級節流則安排在6.2節中討論。

3.6.1 選擇正確的合併策略

儘管段合併是lucene的責任,elasticsearch也允許使用者配置想用的段合併策略。到目前為止,有三種可用的合併策略:

tiered(預設)

前面提到的每一種段合併策略都有各自的引數,而這些引數定義了各自的行為特點,並且它們的預設值都是可以覆寫的(請閱讀後續章節來了解這些引數)。

為了告知elasticsearch我們想使用的段合併策略,可以將配置檔案的index.merge.policy.type欄位配置成我們期望的段合併策略型別。例如下面這樣:

一旦使用特定的段合併策略建立了索引,它就不能被改變。但是,可以使用索引更新api來改變該段合併策略的引數值。

接下來我們來了解這些不同的段合併策略,以及它們提供的功能,並討論這些段合併策略的具體配置。

tiered合併策略

這是elasticsearch的預設選項。它能合併大小相似的索引段,並考慮每層允許的索引段的最大個數。讀者需要清楚單次可合併的索引段的個數與每層允許的索引段數的區別。在索引期,該合併策略會計算索引中允許出現的索引段個數,該數值稱為閾值(budget)。如果正在構建的索引中的段數超過了閾值,該策略將先對索引段按容量降序排序(這裡考慮了被標記為已刪除的文件),然後再選擇乙個成本最低的合併。合併成本的計算方法傾向於**更多刪除文件和產生更小的索引段。

如果某次合併產生的索引段的大小大於index.merge.policy.max_merged_segment引數值,則該合併策略會選擇更少的索引段參與合併,使得生成的索引段的大小小於閾值。這意味著,對於有多個分片的索引,預設的index.merge.policy.max_merged_segment則顯得過小,會導致大量索引段的建立,從而降低查詢速度。使用者應該根據自己具體的資料量,觀察索引段的狀況,不斷調集成並策略以滿足應用需求。

log byte size合併策略

該策略會不斷地以位元組數的對數為計算單位,選擇多個索引來合併建立新索引。合併過程中,時不時會出現一些較大的索引段,然後又產生出一些小於合併因子(merge factor)的索引段,如此迴圈往復。你可以想象,時而有一些相同數量級的索引段,其個數會變得比合併因子還少。當碰到乙個特別大的索引段時,所有小於該級別的索引段都會被合併。索引中的索引段個數與下次用於計算的位元組數的對數成正比。因此,該合併策略能夠保持較少的索引段數量並且極小化段索引合併的代價。

log doc合併策略

該策略與log_byte_size合併策略類似,不同的是前者基於索引的位元組數計算,而後者基於索引段的文件數計算。以下兩種情況中該合併策略表現良好:文件集中的文件大小類似或者你期望參與合併的索引段在文件數方面相當。

3.6.2 合併策略配置

我們現在已經知道索引的段合併策略的工作原理了,只是還缺乏配置方面的相關知識,所以現在就來討論每種合併策略及其提供的配置選項。請記住,大多數情況下預設選項是夠用的,除非有特殊的需求才需要修改。

配置tiered合併策略

當使用tiered合併策略時,可配置以下這些選項:

配置log byte size合併策略

當採用log_byte_size合併策略時,可配置以下選項:

min_merge_size:該引數定義了索引段可能的最小容量(段中所有檔案的位元組數)。如果索引段大小小於該引數值,且merge_factor引數值允許,則進行索引段合併。該引數預設值為1.6mb,它對於避免產生大量小索引段是非常有用的。然而,使用者應該記住,該引數值設定為較大值時,將會導致較高的合併成本。

max_merge_size:該引數定義了允許參與合併的索引段的最大容量(以位元組為單位)。預設情況下,引數不做設定,因而在索引合併時對索引段大小沒有限制。

maxmergedocs:該引數定義了參與合併的索引段的最大文件數。預設情況下,引數沒有設定,因此當索引合併時,對索引段沒有最大文件數的限制。

calibrate_size_by_deletes:該引數為布林值,如果設定為true,則段中被刪除文件的大小會用於索引段大小的計算。

index.compund_format:該引數為布林值,它確定了索引檔案是否儲存為復合檔案格式,預設為false。可參考tiered合併策略配置中該選項的解釋。

配置log doc合併策略

當使用log_doc(文件數對數)合併策略時,可配置以下這些選項:

min_merge_docs:該引數定義了最小索引段允許的最小文件數。如果某索引段的文件數低於該引數值,且merge_factor引數允許,就會執行索引合併。該引數預設值為1000,它對於避免產生大量小索引段是非常有用的。但是使用者需要記住,將該引數值設定過大會增大索引合併的代價。

max_merge_docs:該引數定義了可參與索引合併的索引段的最大文件數。預設情況下,該引數沒有設定,因而對參與索引合併的索引段的最大文件數沒有限制。

calibrate_size_by_deletes:該引數為布林值,如果設定為true,則段中被刪除文件的大小會在計算索引段大小時考慮進去。

與前面介紹的合併策略類似,上面提及的屬性需要以index.merge.policy為字首。例如,要設定min_merge_docs屬性,則應該設定index.merge.policy.min_merge_docs屬性。

除此之外,log_doc合併策略支援index.merge.async和index.merge.async_interval屬性,就像tiered合併策略那樣。

3.6.3 排程

除了可以影響索引合併策略的行為之外,elasticsearch還允許我們定製合併策略的執行方式。索引合併排程器(scheduler)分為兩種,預設的是併發合併排程器concurrentmerge-scheduler。

併發合併排程器

該排程器使用多執行緒執行索引合併操作,其具體過程是:每次開啟乙個新執行緒直到執行緒數達到上限,當達到執行緒數上限時,必須開啟新執行緒(因為需要進行新的段合併),那麼所有索引操作將被掛起,直到至少乙個索引合併操作完成。

為了控制最大執行緒數,可以通過修改index.merge.scheduler.max_thread_count屬性來實現。一般來說,可以按如下公式來計算允許的最大執行緒數:

如果我們的系統是8核的,那麼排程器允許的最大執行緒數可以設定為4。

順序合併排程器

該排程器非常簡單,它使用同乙個執行緒執行所有的索引合併操作。在執行合併時,該執行緒的其他文件處理都會被掛起,從而索引操作會延遲進行。

設定合併排程

為了設定特定的索引合併排程器,使用者可將index.merge.scheduler.type的屬性值設定為concurrent或serial。例如,為了使用併發合併排程器,使用者應該如此設定:

如果想使用順序合併排程器,使用者則應該像下面這樣設定:

vue mixins 合併策略

1 data mixins中的data會合併到data中,有衝突的話,data中資料覆蓋mixins中的資料。2 鉤子函式 mixins中的鉤子函式也會執行,先執行mixins中的鉤子函式。3 methods components和directives methods components和dire...

ES刪除索引

es刪除索引api 例 刪除所有為logstash的索引 官方說明 shell curl xdelete es檢視索引 shell curl 刪除指令碼 home trade manage.sh shell bin bash 列印出所有索引,排除掉hf,fund indexs curl awk eg...

es 刪除索引

用以下的請求來 刪除索引 my index 你也可以這樣刪除多個索引 index one index two delete index 你甚至可以這樣刪除 全部 索引 all delete 對一些人來說,能夠用單個命令來刪除所有資料可能會導致可怕的後果。如果你想要避免意外的大量刪除,你可以在你的el...