1. 程式人生 > >elasticsearch(10) es核心:寫入原理

elasticsearch(10) es核心:寫入原理

1.document先寫入導記憶體buffer中,同時寫translog日誌,每隔一秒鐘把buffer中的資料刷入index segment file中,index segment file中的資料會立馬進入os cache中,記憶體buffer被清空,此時,segment 中的檔案就可以唄搜尋了,這就意味著document從被寫入到可以被搜尋需要一秒種,如果要更改這個屬性,可以執行以下操作

PUT /my_index {   "settings": {     "refresh_interval": "30s"    } } segment file會越來越多,os cache中積累了很多segment file,translog日誌也會越來越多,當translog日誌大小大於一個閥值時候,會出發flush操作。flush操作先會執行commit操作,commit操作先會把buffer中現有的檔案全部寫入到segment中,然後會有一個叫commit point被寫入到磁碟上,這個表明有哪些segment。然後就把os cache中的資料強行刷到磁碟上(fsync),現有translog日誌檔案清空。此時資料已經被持久化

fsync+清空translog,預設每隔30分鐘執行一次,或者translog過大的時候也會執行

我們也可以用_flush命令手動執行

translog每隔5秒回被寫入磁碟。在一次增刪改操作之後只有在replica和primary shard都成功才會成功,如果要提高操作速度,可以設定成非同步的

PUT /my_index {   "settings": {     "index.translog.durability": "async" ,

    "index.translog.sync_interval":"5s"   } }

2.基於translog和commit point的資料恢復

在磁碟上會有一個上次持久化的commit point,translog上有一個commit point,根據這兩個commit point,會把translog中的變更記錄進行回放,重新執行之前的操作

3.刪除原理,

刪除的資料會被標記為del,放倒一個專門的segment中

4.merge操作

由於沒秒會把buffer刷到segment中,所以segment會很多,為了防止這種情況出現,es內部會不斷把一些相似大小的segment合併,並且物理刪除del的segment,

當然也可以手動執行

POST /my_index/_optimize?max_num_segments=1,儘量不要手動執行,讓它自動預設執行就可以了