Elasticsearch的數(shù)據(jù)創(chuàng)建流程

上一篇Elasticsearch底層架構(gòu)概述(圖解)中講了ES的整體架構(gòu),這篇將不會(huì)再對(duì)這部分內(nèi)容進(jìn)行講解。這篇的主要做數(shù)據(jù)寫(xiě)入的整體流程講解,會(huì)先做個(gè)概述后對(duì)每一步進(jìn)行詳細(xì)解讀。

整體流程

數(shù)據(jù)交互流程
  1. 寫(xiě)入請(qǐng)求發(fā)出后,首先發(fā)到Master(主節(jié)點(diǎn))
  2. Master會(huì)通過(guò)route(默認(rèn)是使用文檔ID,如果想要開(kāi)啟route需要額外配置)匹配到對(duì)應(yīng)的ShardMaster Shard,并轉(zhuǎn)發(fā)到對(duì)應(yīng)Master Shard
  3. Master Shard會(huì)將數(shù)據(jù)新增進(jìn)入Memory BufferTransLog
  4. Master Shard會(huì)將數(shù)據(jù)轉(zhuǎn)發(fā)到它的Slave Shard
  5. Slave Shard重復(fù)第三條,并將結(jié)果返回到Master Shard
  6. Response
數(shù)據(jù)處理流程

數(shù)據(jù)在進(jìn)入Shard后分為了兩道線,Memory BufferTransLog

  1. TransLog
    1. 30 min或者TransLog數(shù)據(jù)過(guò)大時(shí)會(huì)進(jìn)行Flush
    2. 5 sec會(huì)觸發(fā)Flush
  2. Memory Buffer
    1. 1 sec進(jìn)行一次Refresh,會(huì)將數(shù)據(jù)刷進(jìn)Filesystem Cache
    2. 進(jìn)行Flush時(shí)會(huì)將Filesystem Cache里的數(shù)據(jù)寫(xiě)入磁盤(pán)

詳解

Memory Buffer

在前一篇Elasticsearch底層架構(gòu)概述(圖解)中提到了SegmentSegment的創(chuàng)建都需要消耗計(jì)算機(jī)資源,而且Segment中有很多重復(fù)的部分,減少創(chuàng)建的同時(shí)也節(jié)省了內(nèi)存資源。為了減少Segment的創(chuàng)建,加入了Memory Buffer,將多次請(qǐng)求匯總為一次創(chuàng)建,減少Segment的創(chuàng)建過(guò)程,也有效的減少Segment之間的Merge

在這里的數(shù)據(jù)在沒(méi)有Refresh之前都是查不到的

Transaction Log

在某些情況下,儲(chǔ)存在Momery BufferFilesystem Cache的數(shù)據(jù)可能會(huì)丟失。ES為了保證數(shù)據(jù)的可靠性加入了TransLog。每次接收到請(qǐng)求后,在將數(shù)據(jù)新增進(jìn)入Memory Buffer的同時(shí)也會(huì)寫(xiě)入到TransLog中,這樣做的優(yōu)勢(shì)是:

  1. TransLog數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,寫(xiě)入速度快,不會(huì)占用太長(zhǎng)的響應(yīng)時(shí)間
  2. 當(dāng)Filesystem cache中的數(shù)據(jù)寫(xiě)入到磁盤(pán)中后,才會(huì)刪除,不擔(dān)心宕機(jī)等意外問(wèn)題
  3. 如果使用id檢索,可利用其返回?cái)?shù)據(jù),數(shù)據(jù)實(shí)時(shí)性高
Filesystem Cache

Filesystem Cache是在內(nèi)存中運(yùn)行的,文檔經(jīng)過(guò)Refresh后,會(huì)將Memory Buffer中的數(shù)據(jù)寫(xiě)入Filesystem Cache并在Filesystem Cache中創(chuàng)建新的Segment。這樣做的優(yōu)勢(shì)在于:

  1. 減少了IO操作
  2. 可以使文檔搜索到
Refresh

Refresh默認(rèn) 1 sec將數(shù)據(jù)提交進(jìn)入Filesystem Cache一次(ES是支持修改這個(gè)值的,通過(guò)index.refresh_interval設(shè)置Refresh間隔時(shí)間)

Refresh流程大致如下:

  1. Memory Buffer中的文檔寫(xiě)入到新的Segment
  2. 清空Memory Buffer(注意: TransLog不會(huì)被清空,為了將Segment數(shù)據(jù)寫(xiě)到磁盤(pán))

Refresh默認(rèn)1 sec執(zhí)行一次,性能損耗太大,建議稍微延長(zhǎng)這個(gè)Refresh時(shí)間間隔,比如5 sec。因此,ES其實(shí)就是準(zhǔn)實(shí)時(shí),達(dá)不到真正的實(shí)時(shí)。

Flush

Flush的觸發(fā)條件:

  1. 30 min觸發(fā)(可配置)
  2. 文件體積過(guò)大(超過(guò)512M,可配置)

文檔從Filesystem Cache寫(xiě)入磁盤(pán)的過(guò)程就是Flush。過(guò)程如下:

  1. 所有在Memory Buffer的文檔都被寫(xiě)入一個(gè)新的Segment
  2. 清空Memory Buffer
  3. 創(chuàng)建提交點(diǎn)(Commit Point
  4. 將提交點(diǎn)前Filesystem Cache中的數(shù)據(jù)寫(xiě)入磁盤(pán)
  5. 刪除TransLog中已被持久化的記錄

我的其他ES相關(guān)文章

  1. Elasticsearch+Kibana使用Docker安裝
  2. Elasticsearch底層架構(gòu)概述(圖解)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容