目錄
- 非讀流程
- 寫(xiě)流程
- 分布式寫(xiě)入
- 寫(xiě)入
- refresh
- 刪除流程
- 更新
- 段合并
- 寫(xiě)流程
- 讀流程
- search流程
todo
- 宏觀看讀寫(xiě)流程(分布式檢索考余,分布式查詢(xún)) https://www.elastic.co/guide/cn/elasticsearch/guide/current/distrib-read.html
- es 讀取流程 https://www.cnblogs.com/upupfeng/p/13488120.html
- es router規(guī)則 https://zhuanlan.zhihu.com/p/94604871
非讀流程
分布式寫(xiě)入
-
用HighLevelClient寫(xiě)入ES時(shí)一般都是使用同步的方式寫(xiě)入ES
es寫(xiě)入集群時(shí).jpg
寫(xiě)流程
- es存儲(chǔ)是分段的劳闹,每個(gè)段具有不可變性曹步,這樣就避免多線程安全問(wèn)題,當(dāng)然后續(xù)會(huì)進(jìn)行段合并以避免段過(guò)多睁壁。
寫(xiě)入
- 新document首先寫(xiě)入內(nèi)存Buffer緩存中。
- 每隔一段時(shí)間,執(zhí)行"commitpoint"(管理多個(gè)segment弯囊,讀取也是找commit point)操作,buffer寫(xiě)入新Segment中胶果。
- 新segment寫(xiě)入文件系統(tǒng)緩存 filesystem cache匾嘱。(實(shí)際上第二,第三可以理解為一步稽物,內(nèi)存 -> 文件緩存 -> 文件奄毡。)
- 文件系統(tǒng)緩存中的index segment被fsync強(qiáng)制刷到磁盤(pán)上,確保物理寫(xiě)入贝或。
此時(shí)吼过,新egment被打開(kāi)供search操作。 -
清空內(nèi)存buffer咪奖,可以接收新的文檔寫(xiě)入盗忱。
先被存放到內(nèi)存.png
refresh
- Lucene支持對(duì)新段寫(xiě)入和打開(kāi)-可以使文檔在沒(méi)有完全刷入硬盤(pán)的狀態(tài)下就能對(duì)搜索可見(jiàn),而且是一個(gè)開(kāi)銷(xiāo)較小的操作羊赵,可以頻繁進(jìn)行,refresh操作趟佃。
-
進(jìn)行refresh操作,清空buffer昧捷,文檔可被搜索但尚未flush到磁盤(pán)闲昭。translog不會(huì)清空,每隔一段時(shí)間(例如translog變得太大)靡挥,index會(huì)被flush到磁盤(pán)序矩,新的translog文件被創(chuàng)建,這個(gè)commit完整執(zhí)行結(jié)束跋破。
帶translog.png - translog可以用來(lái)斷電恢復(fù)啥的
刪除流程
- 刪除一個(gè)ES文檔不會(huì)立即從磁盤(pán)上移除簸淀,它只是被標(biāo)記成已刪除。因?yàn)槎问遣豢勺兊亩痉担晕臋n既不能從舊的段中移除租幕,舊的段也不能更新以反映文檔最新的版本。
ES的做法是拧簸,每一個(gè)提交點(diǎn)包括一個(gè).del文件(還包括新段)劲绪,包含了段上已經(jīng)被標(biāo)記為刪除狀態(tài)的文檔。所以,當(dāng)一個(gè)文檔被做刪除操作珠叔,實(shí)際上只是在.del文件中將該文檔標(biāo)記為刪除蝎宇,依然會(huì)在查詢(xún)時(shí)被匹配到,只不過(guò)在最終返回結(jié)果之前會(huì)被從結(jié)果中刪除祷安。
更新
- 文檔的更新操作和刪除是類(lèi)似的:當(dāng)一個(gè)文檔被更新姥芥,舊版本的文檔被標(biāo)記為刪除,新版本的文檔在新的段中索引汇鞭。
該文檔的不同版本都會(huì)匹配一個(gè)查詢(xún)凉唐,但是較舊的版本會(huì)從結(jié)果中刪除。
段合并
- 段合并也會(huì)進(jìn)行哪些需要被刪除數(shù)據(jù)的刪除操作霍骄,ES通過(guò)后臺(tái)合并段解決這個(gè)問(wèn)題台囱。ES利用段合并的時(shí)機(jī)來(lái)真正從文件系統(tǒng)刪除那些version較老或者是被標(biāo)記為刪除的文檔。被刪除的文檔(或者是version較老的)不會(huì)再被合并到新的更大的段中读整。
- 合并會(huì)通過(guò)比如時(shí)間戳進(jìn)行分組合并簿训。
讀流程
search流程
1、客戶(hù)端發(fā)送請(qǐng)求到一個(gè)coordinate node米间。
2强品、協(xié)調(diào)節(jié)點(diǎn)將搜索請(qǐng)求轉(zhuǎn)發(fā)到所有的shard對(duì)應(yīng)的primary shard 或 replica shard ,都可以屈糊。
3的榛、query phase:每個(gè)shard將自己的搜索結(jié)果(其實(shí)就是一些doc id)返回給協(xié)調(diào)節(jié)點(diǎn),由協(xié)調(diào)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的合并逻锐、排序夫晌、分頁(yè)等操作,產(chǎn)出最終結(jié)果昧诱。
4晓淀、fetch phase:接著由協(xié)調(diào)節(jié)點(diǎn)根據(jù)doc id去各個(gè)節(jié)點(diǎn)上拉取實(shí)際的document數(shù)據(jù),最終返回給客戶(hù)端盏档。
- 進(jìn)一步要糊,參考本系列es深入篇
- 參考https://www.cnblogs.com/bonelee/p/6226185.html