es寫入流程

當(dāng)節(jié)點(diǎn)收到客戶端的寫入請(qǐng)求,如果當(dāng)前節(jié)點(diǎn)不是master節(jié)點(diǎn),會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給master,master根據(jù)要寫入的索引,從集群索引信息中判斷是否要生成索引,沒有索引則先生成索引,有則轉(zhuǎn)發(fā)寫入,寫入的時(shí)候,如果有副本分片,會(huì)將寫入請(qǐng)求同時(shí)轉(zhuǎn)發(fā)給副本分片所在的節(jié)點(diǎn)上,如果有一半確定寫入成功,則返回結(jié)果寫入成功.
對(duì)于某一個(gè)節(jié)點(diǎn)來說,首先接受到請(qǐng)求,會(huì)先執(zhí)行雙寫的操作,也就是寫buffer和寫translog,因?yàn)橹苯訉懘疟P設(shè)計(jì)到數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)化,此處開銷較大,所以寫入buffer,而寫入buffer又會(huì)存在宕機(jī)后無法恢復(fù)的風(fēng)險(xiǎn),所以同時(shí)也寫入translog,以便宕機(jī)后恢復(fù),寫入buffer后需要定期將buffer數(shù)據(jù)刷新到磁盤上才能提供查詢,這一個(gè)刷新叫refresh,這個(gè)時(shí)間默認(rèn)為1s,實(shí)際上es在實(shí)現(xiàn)buffer刷新到磁盤上時(shí)并沒有直接就刷到磁盤了,而是刷到了os的cache上,但是此時(shí)cache就相當(dāng)于從磁盤上拉取的數(shù)據(jù)做緩存一樣,也是能夠提供查詢的,從cache真正的刷新到磁盤這個(gè)操作叫flush操作,默認(rèn)30分鐘操作,同時(shí)如果translog如果滿了也會(huì)觸發(fā)flush操作,當(dāng)每一次flush操作,除了清空buffer和translog,還生成了一個(gè)segment,在lucene中,因?yàn)橐粋€(gè)segment同時(shí)只能被一個(gè)寫入索引打開,所以每次刷新生成一個(gè)segement而不是在一個(gè)segement上修改是可以提高并發(fā)的,但是segement過多時(shí)又會(huì)觸發(fā)另外一個(gè)問題,就是查詢的時(shí)候需要遍歷所有的segement,在此基礎(chǔ)上又出現(xiàn)了一個(gè)動(dòng)作,叫做merge操作,merge就是把多個(gè)小的segement合并成一個(gè)大的segement,這個(gè)操作其實(shí)類似mysql的purge操作,就是把binlog進(jìn)行合并,合并的內(nèi)容除了小的segement變?yōu)榇蟮膕egement還做了另外一件事情,就是刪除掉設(shè)置刪除的文檔,luncene在設(shè)計(jì)的時(shí)候,對(duì)于刪除文檔,為了提高并發(fā)和性能,并沒有真正的去立刻就刪掉,而是將其docid存入一個(gè).del的文件當(dāng)中,當(dāng)查詢的時(shí)候,在去這個(gè).del文件過濾下,就可以實(shí)現(xiàn)刪掉的數(shù)據(jù)不會(huì)被查詢出來的情況,所以merge的操作還有一步就是根據(jù).del文件的docid去真正的刪除掉這個(gè)文檔.

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

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

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