elasticsearch寫入查詢?cè)斫榻B

一.? es是如何寫數(shù)據(jù)的

? ? (1)客戶端程序隨機(jī)選擇一個(gè)es集群中的節(jié)點(diǎn)作為協(xié)調(diào)節(jié)點(diǎn)(coordinating node)

? ? (2)協(xié)調(diào)節(jié)點(diǎn)對(duì)請(qǐng)求的doc進(jìn)行路由,將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的node(primary Shard)上

? ? (3)node處理請(qǐng)求,將數(shù)據(jù)寫入primary Shard的同時(shí)將數(shù)據(jù)同步到對(duì)應(yīng)的replica Shard上

? ? (4)primar Shard和replica Shard執(zhí)行完成后,將處理結(jié)果返回給協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)在接收到成功的信息后,將響應(yīng)結(jié)果返回給客戶端

二. es是如何讀取數(shù)據(jù)的

1. 基于doc里面的field進(jìn)行查詢

????(1)客戶端隨機(jī)選擇一個(gè)節(jié)點(diǎn)作為協(xié)調(diào)節(jié)點(diǎn)

? ? (2)協(xié)調(diào)節(jié)點(diǎn)對(duì)請(qǐng)求的document進(jìn)行路由,采用round-robin隨機(jī)輪詢算法,將請(qǐng)求隨機(jī)轉(zhuǎn)發(fā)到primary Shard或者primary shard備份的replica shard上。

? ? (3)primary shard或replica Shard將查詢的結(jié)果(實(shí)際一些?doc id等可以表示doc的基本信息)返回給協(xié)調(diào)節(jié)點(diǎn);由協(xié)調(diào)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的合并、排序、分頁等操作,產(chǎn)出最終結(jié)果

? ? (4)協(xié)調(diào)節(jié)點(diǎn)根據(jù)最終的結(jié)果doc id,從shard中拉取實(shí)際的doc信息,最終將結(jié)果匯總返回給客戶端

2. 基于doc的主鍵ID進(jìn)行查詢

????????保存doc的時(shí)候,es會(huì)給每個(gè)doc指定一個(gè)主鍵id,也可以自己指定,保存的時(shí)候,跟對(duì)ID進(jìn)行hash,然后保存在對(duì)應(yīng)的shard上面

? ? ????根據(jù)主鍵ID查詢Doc,則es會(huì)根據(jù)id進(jìn)行hash,判斷出doc是保存在哪個(gè)shard上。然后將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的shard上進(jìn)行查詢,取回?cái)?shù)據(jù)。

三. 寫數(shù)據(jù)的底層原理

? ? ? ? 解釋:os cache為操作系統(tǒng)緩存,寫入磁盤文件的數(shù)據(jù),都會(huì)優(yōu)先寫入到os cache中。

????????1. es現(xiàn)將數(shù)據(jù)寫入到內(nèi)存buffer中的,并同時(shí)將數(shù)據(jù)信息寫入到translog日志中。(ps:在內(nèi)存buffer中的數(shù)據(jù)是不能夠被檢索出來的。這也是es具有秒級(jí)延時(shí)的原因)。

? ? ? ? 2.buffer區(qū)滿了或者到了一定的時(shí)間,內(nèi)存buffer就會(huì)將數(shù)據(jù)refresh到os cache中,并將數(shù)據(jù)同步到一個(gè)新的segment file中,當(dāng)數(shù)據(jù)被寫入到os cache和segment file中時(shí),數(shù)據(jù)就可以被檢索出來了。這個(gè)過程就是refresh過程

? ? ? ? 寫機(jī)制:每隔一秒(這個(gè)參數(shù)是可調(diào)的),數(shù)據(jù)就會(huì)從內(nèi)存buffer寫入的os cache,并同步到segment file中去,這個(gè)segment file就存儲(chǔ)最近一秒的數(shù)據(jù)。

? ? ? ? 3.重復(fù)上面的操作,新的數(shù)據(jù)不斷的被寫入到buffer和translog中。并不斷的將數(shù)據(jù)寫入的新的segment file中。每次refresh后,buffer都會(huì)被清空。translog日志會(huì)保留。隨著這個(gè)過程推進(jìn),translog 會(huì)變得越來越大。當(dāng) translog 達(dá)到一定長度的時(shí)候,就會(huì)觸發(fā)?commit?操作。

? ? ? ? 4.commit 操作發(fā)生第一步,就是將 buffer 中現(xiàn)有數(shù)據(jù) refresh 到 os cache 中去,清空 buffer。然后,將一個(gè) commit point 寫入磁盤文件,里面標(biāo)識(shí)著這個(gè) commit point 對(duì)應(yīng)的所有 segment file,同時(shí)強(qiáng)行將 os cache 中目前所有的數(shù)據(jù)都 fsync 到磁盤文件中去。最后清空 現(xiàn)有 translog 日志文件,重啟一個(gè) translog,此時(shí) commit 操作完成。

????????es的數(shù)據(jù)恢復(fù) 主要就是通過translog日志進(jìn)行恢復(fù)的(恢復(fù)的主要是寫入內(nèi)存buffer和os cache,而沒有寫入到磁盤上的數(shù)據(jù));實(shí)際上隨著時(shí)間的推移,segment file 會(huì)越來越多,而實(shí)際上es會(huì)對(duì)小的segment進(jìn)行定期的merge。將多個(gè)segment file合并成一個(gè)。同時(shí)這里會(huì)將標(biāo)識(shí)為?deleted?的 doc 給物理刪除掉,然后將新的?segment file?寫入磁盤,這里會(huì)寫一個(gè)?commit point,標(biāo)識(shí)所有新的?segment file,然后打開?segment file?供搜索使用,同時(shí)刪除舊的?segment file。

? ? ? ? 5.這個(gè) commit 操作叫做 flush。默認(rèn) 30 分鐘自動(dòng)執(zhí)行一次 flush,但如果 translog 過大,也會(huì)觸發(fā) flush。flush 操作就對(duì)應(yīng)著 commit 的全過程,我們可以通過 es api,手動(dòng)執(zhí)行 flush 操作,手動(dòng)將 os cache 中的數(shù)據(jù) fsync 強(qiáng)刷到磁盤上去。

? ? ? ? 四.? 面試淺談

????????如果面試官問你 es 丟數(shù)據(jù)的問題,你可以恢復(fù),其實(shí) es 第一是準(zhǔn)實(shí)時(shí)的,數(shù)據(jù)寫入 1 秒后可以搜索到;可能會(huì)丟失數(shù)據(jù)的。有 5 秒的數(shù)據(jù),停留在 buffer、translog os cache、segment file os cache 中,而不在磁盤上,此時(shí)如果宕機(jī),會(huì)導(dǎo)致 5 秒的數(shù)據(jù)丟失。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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