Elasticsearch Lucene 數(shù)據(jù)寫入原理 | ES 核心篇

前言

最近 TL 分享了下 《Elasticsearch基礎(chǔ)整理》http://www.reibang.com/p/e8226138485d 悠反,蹭著這個機(jī)會残黑。寫個小文鞏固下馍佑,本文主要講 ES -> Lucene
的底層結(jié)構(gòu),然后詳細(xì)描述新數(shù)據(jù)寫入 ES 和 Lucene 的流程和原理萍摊。這是基礎(chǔ)理論知識挤茄,整理了一下,希望能對 Elasticsearch 感興趣的同學(xué)有所幫助冰木。

一穷劈、Elasticsearch & Lucene 是什么

es

什么是 Elasticsearch ?
Elasticsearch 是一個基于 Apache Lucene(TM) 的開源搜索引擎踊沸。

那 Lucene 是什么歇终?
無論在開源還是專有領(lǐng)域,Lucene 可以被認(rèn)為是迄今為止最先進(jìn)逼龟、性能最好的评凝、功能最全的搜索引擎庫,并通過簡單的 RESTful API 來隱藏 Lucene 的復(fù)雜性腺律,從而讓全文搜索變得簡單奕短。

Elasticsearch 不僅僅是 Lucene 和全文搜索,我們還能這樣去描述它:

  • 分布式的實(shí)時文件存儲匀钧,每個字段都被索引并可被搜索
  • 分布式的實(shí)時分析搜索引擎
  • 可以擴(kuò)展到上百臺服務(wù)器翎碑,處理 PB 級結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)

二、Elasticsearch & Lucene 的關(guān)系

file

就像很多業(yè)務(wù)系統(tǒng)是基于 Spring 實(shí)現(xiàn)一樣之斯,Elasticsearch 和 Lucene 的關(guān)系很簡單:Elasticsearch 是基于 Lucene 實(shí)現(xiàn)的日杈。ES 基于底層這些包,然后進(jìn)行了擴(kuò)展佑刷,提供了更多的更豐富的查詢語句莉擒,并且通過 RESTful API 可以更方便地與底層交互。類似 ES 還有 Solr 也是基于 Lucene 實(shí)現(xiàn)的瘫絮。

在應(yīng)用開發(fā)中涨冀,用 Elasticsearch 會很簡單。但是如果你直接用 Lucene麦萤,會有大量的集成工作蝇裤。

因此,入門 ES 的同學(xué)频鉴,稍微了解下 Lucene 即可。如果往高級走恋拍,還是需要學(xué)習(xí) Lucene 底層的原理垛孔。因?yàn)榈古潘饕⒋蚍謾C(jī)制施敢、全文檢索原理周荐、分詞原理等等狭莱,這些都是不會過時的技術(shù)。

三概作、新文檔寫入流程

3.1 數(shù)據(jù)模型

file

如圖

  • 一個 ES Index (索引腋妙,比如商品搜索索引、訂單搜索索引)集群下讯榕,有多個 Node (節(jié)點(diǎn))組成骤素。每個節(jié)點(diǎn)就是 ES 的實(shí)例。
  • 每個節(jié)點(diǎn)上會有多個 shard (分片)愚屁, P1 P2 是主分片 R1 R2 是副本分片
  • 每個分片上對應(yīng)著就是一個 Lucene Index(底層索引文件)
  • Lucene Index 是一個統(tǒng)稱济竹。由多個 Segment (段文件,就是倒排索引)組成霎槐。每個段文件存儲著就是 Doc 文檔送浊。

3.2 Lucene Index

file

lucene 中,單個倒排索引文件稱為 segment丘跌。其中有一個文件袭景,記錄了所有 segments 的信息,稱為 commit point:

  • 文檔 create 新寫入時闭树,會生成新的 segment耸棒。同樣會記錄到 commit point 里面
  • 文檔查詢,會查詢所有的 segments
  • 當(dāng)一個段存在文檔被刪除蔼啦,會維護(hù)該信息在 .liv 文件里面

3.3 新文檔寫入流程

新文檔創(chuàng)建或者更新時榆纽,進(jìn)行如下流程:

更新不會修改原來的 segment,更新和創(chuàng)建操作都會生成新的一個 segment捏肢。數(shù)據(jù)哪里來呢奈籽?先會存在內(nèi)存的 bugger 中,然后持久化到 segment 鸵赫。

數(shù)據(jù)持久化步驟如下:write -> refresh -> flush -> merge

3.3.1 write 過程

file

一個新文檔過來衣屏,會存儲在 in-memory buffer 內(nèi)存緩存區(qū)中,順便會記錄 Translog辩棒。

這時候數(shù)據(jù)還沒到 segment 狼忱,是搜不到這個新文檔的。數(shù)據(jù)只有被 refresh 后一睁,才可以被搜索到钻弄。那么 講下 refresh 過程

3.3.2 refresh 過程

file

refresh 默認(rèn) 1 秒鐘,執(zhí)行一次上圖流程者吁。ES 是支持修改這個值的窘俺,通過 index.refresh_interval 設(shè)置 refresh (沖刷)間隔時間。refresh 流程大致如下:

  • in-memory buffer 中的文檔寫入到新的 segment 中复凳,但 segment 是存儲在文件系統(tǒng)的緩存中瘤泪。此時文檔可以被搜索到
  • 最后清空 in-memory buffer灶泵。注意: Translog 沒有被清空,為了將 segment 數(shù)據(jù)寫到磁盤

文檔經(jīng)過 refresh 后对途, segment 暫時寫到文件系統(tǒng)緩存赦邻,這樣避免了性能 IO 操作,又可以使文檔搜索到实檀。refresh 默認(rèn) 1 秒執(zhí)行一次惶洲,性能損耗太大。一般建議稍微延長這個 refresh 時間間隔劲妙,比如 5 s湃鹊。因此,ES 其實(shí)就是準(zhǔn)實(shí)時镣奋,達(dá)不到真正的實(shí)時币呵。

3.3.3 flush 過程

file

上個過程中 segment 在文件系統(tǒng)緩存中,會有意外故障文檔丟失侨颈。那么余赢,為了保證文檔不會丟失,需要將文檔寫入磁盤哈垢。那么文檔從文件緩存寫入磁盤的過程就是 flush妻柒。寫入次怕后,清空 translog耘分。

translog 作用很大:

  • 保證文件緩存中的文檔不丟失
  • 系統(tǒng)重啟時举塔,從 translog 中恢復(fù)
  • 新的 segment 收錄到 commit point 中

具體可以看官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-flush.html

3.3.4 merge 過程

file
file

上面幾個步驟,可見 segment 會越來越多求泰,那么搜索會越來越慢央渣?怎么處理呢?

通過 merge 過程解決:

  • 就是各個小段文件渴频,合并成一個大段文件芽丹。段合并過程
  • 段合并結(jié)束,舊的小段文件會被刪除
  • .liv 文件維護(hù)的刪除文檔卜朗,會通過這個過程進(jìn)行清除

四拔第、小結(jié)

file

如這個圖,ES 寫入原理不難场钉,記住關(guān)鍵點(diǎn)即可蚊俺。

write -> refresh -> flush

  • write:文檔數(shù)據(jù)到內(nèi)存緩存,并存到 translog
  • refresh:內(nèi)存緩存中的文檔數(shù)據(jù)逛万,到文件緩存中的 segment 泳猬。此時可以被搜到
  • flush 是緩存中的 segment 文檔數(shù)據(jù)寫入到磁盤

寫入的原理告訴我們,考慮的點(diǎn)很多:性能、數(shù)據(jù)不丟失等等

(完)

參考資料:
Java微服務(wù)資料暂殖,加我微w信x:bysocket01 (加的人,一般很帥)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末当纱,一起剝皮案震驚了整個濱河市呛每,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坡氯,老刑警劉巖晨横,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箫柳,居然都是意外死亡手形,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門悯恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來库糠,“玉大人,你說我怎么就攤上這事涮毫∷才罚” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵罢防,是天一觀的道長艘虎。 經(jīng)常有香客問我,道長咒吐,這世上最難降的妖魔是什么野建? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮恬叹,結(jié)果婚禮上候生,老公的妹妹穿的比我還像新娘。我一直安慰自己妄呕,他們只是感情好陶舞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绪励,像睡著了一般肿孵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疏魏,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天停做,我揣著相機(jī)與錄音,去河邊找鬼大莫。 笑死蛉腌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烙丛,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼舅巷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了河咽?” 一聲冷哼從身側(cè)響起钠右,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忘蟹,沒想到半個月后飒房,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媚值,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年狠毯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褥芒。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚼松,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喂很,到底是詐尸還是另有隱情惜颇,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布少辣,位于F島的核電站凌摄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漓帅。R本人自食惡果不足惜锨亏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦挪丢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽施戴。三九已至反浓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赞哗,已是汗流浹背雷则。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肪笋,地道東北人月劈。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓度迂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猜揪。 傳聞我的和親對象是個殘疾皇子惭墓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容