段合并對于es來說是一件至關重要的事情,因為段是es發生檢索的最小執行單元,一個索引的資料是由分片組成的,分片是一個lucene實體,而分片又是由段組成的,因此,一個檢索任務,最終是在每一個段中執行完檢索,最后合并結果的,
因此了解段就顯得至關重要,段的優劣,直接決定了檢索的性能,常用es的,大家可能會遇到一個情況,就是es用著用著越來越慢了,段合并問題是一個重要的影響因素,
通過這篇文章,我們將深入的了解段合并流程,段合并程序,段合并策略,已經段合并問題,我參看的檔案原文為:
- LogMergePolicy-html (通過這篇文章,我們將會學到段合并的一些基礎知識,了解到段合并的程序,其中LogMergePolocy 是lucene 最早版本的合并策略)
- TieredMergePolicy-html (將會學到 lucene默認的合并策略,已經為什么要有第二中策略,來替換更新前邊的策略)
以上兩篇文章,實際上對應的是lucene的兩種段合并策略,
帶著問題讀文章
我是在尋找es索引為什么在使用一段時間之后變慢的原因, 所以研究了段合并的問題,段合并只是一個點,但是至關重要,
問題串列:
- 為什么需要段合并,
- 為什么TieredMergePolicy 合并策略,會成為默認的段合并策略,替換了LogMergePolicy
- 什么時候發生段合并,
- 段合并的程序究竟是怎么樣的,
- 我認為本片文章最重要的問題:什么時候就不再進行段合并(段合并的條件是什么)已經不進行段合并,會有什么致命的問題?這個問題也是我最初問題的答案,
問題一:為什么需要段合并
通過讀上邊的兩篇文章,我基本上已經能夠知道段合并的細節問題,其實段合并有兩個目的
- 想要降低段的個數,把小段合并成大段,合并成大段,利于檢索,
- 段合并其實上想要調整段的大小,盡可能的使段均勻,
問題二:為什么TieredMergePolicy 合并策略,會成為默認的段合并策略,替換了LogMergePolicy
這個問題,從文章中也能找到答案,我們先看兩個合并策略上的差別:
- LogMergePolicy總是合并相鄰的段檔案,合并相鄰的段檔案(Adjacent Segment)描述的是對于IndexWriter提供的段集,LogMergePolicy會選取連續的部分(或全部)段集區間來生成一個待合并段集
- TieredMergePolicy中會先對IndexWriter提供的段集進行排序,然后在排序后的段集中選取部分(可能不連續)段來生成一個待合并段集,即非相鄰的段檔案(Non-adjacent Segment)
此外,這個問題也要和第一個問題關聯起來,段合并的目的,通過了解LogMergePolicy策略我們知道,它是把相鄰的段進行合并,但是這樣并不能達到段合并的第二個目的(使段均勻)
在了解TieredMergePolicy以后,我們可以知道,它使用了更多的演算法來優化段合并的程序,它對段進行的打分(了解文章二中的打分演算法規則即可),并做了排序,然后有限合并小段,顯然合并小段花費更少的資源,且會帶來更好合并效果,
問題三:什么時候發生段合并
某次提交(commit)或者重繪(flush)的所有索引檔案屬于一個新的段(Segment),所以也可以稱為段合并(Segment Merge),當IndexWriter索引中的資料有任意修改動作,它會呼叫findMerges(...)方法通過某個合并策略(MergePolicy)來找出需要合并的段集,如果需要合并,那么合并策略會回傳一個oneMerge的集合,oneMerge的個數描述了IndexWriter需要執行合并的次數,單個oneMerge中包含了需要合并為一個新段(New Segment)的段集合,
另外段合并的條件是(TieredMergePolicy 默認段合并策略下):
- 默認的限制段合并的大小為5G,也就是說當一個段的大小大于 2.5G就不再發生段合并,段的大小需要小于 2.5G,這個是一個引數,我們可以控制(配置),
- 段中洗掉資料的大于設定的比例值,默認為三分之一,也就是當洗掉的資料大于該段總大小的三分之一,就會符合段合并的條件,這個我們可以設定,可設定的范圍為:20% - 50%,
以上連個條件為或的關系,滿足其中一個就可以進行段合并,
問題四:段合并的程序究竟是怎么樣的
直接從原文找答案吧,
問題五:什么時候就不再進行段合并 + 不再段合并會有什么問題
在問題三中,已經說了段合并的兩個條件,當兩個條件都不滿足的情況下,則段不能合并,
此時在極端情況,如果發生了,段的大小大于2.5G,且洗掉的資料不夠百分之三十,則這個大段不會發生段合并,假如段中洗掉的內容又比較多,就是很大的問題,它門會占用我們我們的磁盤空間,相當于是發生了磁盤空間泄露,另外,在檢索程序中,實際上是,檢索出所有的資料,然后再去掉標記洗掉的資料,如果遲遲不能發生段合并,無法將洗掉的資料釋放出去,則會給檢索程序帶來負面影響,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423323.html
標籤:其他
上一篇:pandas使用iloc函式基于dataframe資料列的索引抽取單列或者多列資料、其中多列索引需要嵌入在串列方括號[]中、或使用:符號形成起始和終止范圍索引
