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

數(shù)據(jù)交互流程
- 寫(xiě)入請(qǐng)求發(fā)出后,首先發(fā)到
Master(主節(jié)點(diǎn)) -
Master會(huì)通過(guò)route(默認(rèn)是使用文檔ID,如果想要開(kāi)啟route需要額外配置)匹配到對(duì)應(yīng)的Shard的Master Shard,并轉(zhuǎn)發(fā)到對(duì)應(yīng)Master Shard -
Master Shard會(huì)將數(shù)據(jù)新增進(jìn)入Memory Buffer和TransLog -
Master Shard會(huì)將數(shù)據(jù)轉(zhuǎn)發(fā)到它的Slave Shard -
Slave Shard重復(fù)第三條,并將結(jié)果返回到Master Shard Response
數(shù)據(jù)處理流程
數(shù)據(jù)在進(jìn)入Shard后分為了兩道線,Memory Buffer和TransLog
-
TransLog- 每
30 min或者TransLog數(shù)據(jù)過(guò)大時(shí)會(huì)進(jìn)行Flush - 每
5 sec會(huì)觸發(fā)Flush
- 每
-
Memory Buffer- 每
1 sec進(jìn)行一次Refresh,會(huì)將數(shù)據(jù)刷進(jìn)Filesystem Cache - 進(jìn)行
Flush時(shí)會(huì)將Filesystem Cache里的數(shù)據(jù)寫(xiě)入磁盤(pán)
- 每
詳解
Memory Buffer
在前一篇Elasticsearch底層架構(gòu)概述(圖解)中提到了Segment,Segment的創(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 Buffer和Filesystem Cache的數(shù)據(jù)可能會(huì)丟失。ES為了保證數(shù)據(jù)的可靠性加入了TransLog。每次接收到請(qǐng)求后,在將數(shù)據(jù)新增進(jìn)入Memory Buffer的同時(shí)也會(huì)寫(xiě)入到TransLog中,這樣做的優(yōu)勢(shì)是:
-
TransLog數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,寫(xiě)入速度快,不會(huì)占用太長(zhǎng)的響應(yīng)時(shí)間 - 當(dāng)
Filesystem cache中的數(shù)據(jù)寫(xiě)入到磁盤(pán)中后,才會(huì)刪除,不擔(dān)心宕機(jī)等意外問(wèn)題 - 如果使用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ì)在于:
- 減少了
IO操作 - 可以使文檔搜索到
Refresh
Refresh默認(rèn) 1 sec將數(shù)據(jù)提交進(jìn)入Filesystem Cache一次(ES是支持修改這個(gè)值的,通過(guò)index.refresh_interval設(shè)置Refresh間隔時(shí)間)
Refresh流程大致如下:
-
Memory Buffer中的文檔寫(xiě)入到新的Segment中 - 清空
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ā)條件:
- 每
30 min觸發(fā)(可配置) - 文件體積過(guò)大(超過(guò)
512M,可配置)
文檔從Filesystem Cache寫(xiě)入磁盤(pán)的過(guò)程就是Flush。過(guò)程如下:
- 所有在
Memory Buffer的文檔都被寫(xiě)入一個(gè)新的Segment - 清空
Memory Buffer - 創(chuàng)建提交點(diǎn)(
Commit Point) - 將提交點(diǎn)前
Filesystem Cache中的數(shù)據(jù)寫(xiě)入磁盤(pán) - 刪除
TransLog中已被持久化的記錄