1. 程式人生 > 其它 >ElasticSearch資料寫入原理

ElasticSearch資料寫入原理

整體寫入流程分為四步:

  • write(資料寫入buffer和translog)
  • refresh(buffer資料提交重新整理到segment file和os cache,此步驟以後,資料才可見)
  • flush(os cache快取資料同步到磁碟,清空當前時間段內translog)
  • merge(每次refresh產生的小segment file合併成大的segment file)
  1. write:資料先寫入記憶體buffer(基於記憶體的緩衝),在buffer裡的時候資料是搜尋不到的;同時將資料寫入translog日誌檔案。

  2. refresh:如果buffer快滿了,或者到一定時間(預設1s),就會將記憶體buffer資料refresh 到一個新的segment file中,同時將資料同步到os cache(作業系統快取),os cache馬上響應,將segment file的狀態置為open,當狀態為open時,資料即可查到。這個過程就是 refresh。每隔1秒鐘,執行一次refresh,將buffer中的資料寫入一個新的segment file,這個segment file中就儲存最近1秒內 buffer中寫入的資料。(refresh發生在JVM堆中,頻率越小越好),但是如果buffer裡面此時沒有資料,那當然不會執行refresh操作, 每秒建立換一個空的segment file 。重複上面的步驟,新的資料不斷進入buffer和translog,不斷將buffer資料寫入一個又一個新的segment file中去,每次refresh完buffer清空,translog保留。

  3. flush:隨著資料的不斷寫入,translog會變得越來越大。當translog達到一定長度的時候,就會觸發commit操作。第一步,就是將buffer中現有的資料refresh到os cache中去,清空buffer。然後將一個commit point寫入磁碟檔案,裡面標識著這個commit point 對應的所有segment file,同時強行將os cache中目前所有的資料都fsync到磁碟檔案中去。最後清空現有 translog日誌檔案,重啟一個translog,此時commit操作完成。這個commit操作叫做flush。預設30分鐘自動執行一次flush,但如果translog過大,也會觸發flush。flush操作就對應著commit的全過程,我們可以通過es api,手動執行flush操作,手動將os cache中資料fsync強刷到磁碟上去。

  4. merge: buffer每次refresh一次,就會產生一個segment file,所以預設情況下是1秒鐘一個segment file,segment file會越來越多,此時會定期執行merge,每次merge的時候,會將多個segment file合併成一個,同時這裡會將標識為deleted的doc給物理刪除掉,然後將新的segment file寫入磁碟,這裡會寫一個commit point,標識所有新的segment file,然後開啟segment file供搜尋使用,同時刪除舊的segment file。