elasticsearch(lucene)索引數據過程

倒排索引存儲-分段存儲(lucene的功能)
在lucene中:lucene index包含了若干個segment
在elasticsearch中:index包含了若干主從shard,shard包乾了若干segment
segment是elasticsearch中存儲的最小文件單元,也就是分段存儲,segment被設計爲不可變的
新增:新建立索引時,新建一個segment存儲新的數據
刪除:因爲segment是隻讀的,因此在索引文件中新增了.del文件,專門存儲被刪除的數據id,當查詢時被刪除的數據仍能被查詢,進行查詢結果合併時纔會過濾掉,merge segment時會真正刪除
更新:新增和刪除的組合
segment的不可變性的優勢服務器

  • 不須要鎖(沒有直接修改已經存在段的狀況)
  • 能夠利用內存,因爲segment不可變,因此segment被加載到內存後無需改變,只要內存足夠,segment就能夠長期駐村,大大提高查詢性能
  • 更新、新增的增量的方式很輕,性能好

segment的不可變性的缺點異步

  • 刪除操做不會立刻刪除有必定的空間浪費
  • 頻繁更新涉及到大量的刪除動做,會有大量的空間浪費
  • segment的數量可能很是多,對服務器的文件句柄消耗很大,查詢性能會隨着segment的數量增長而增長

新增數據的過程jvm

 

 這個流程的目的是:提高寫入性能(異步落盤)elasticsearch

一、保存到index buffer中,同時寫入Transaction log(防止內存的數據丟失,有點想redo log)性能

二、當index buffer空間滿了(默認佔用jvm10%)或每1秒(經過index.refresh_interval 配置)執行Refresh操做,寫入segment並清空index buffer(這裏的1秒內是查不到剛保存的數據的,因此es也被成爲近實時的搜索引擎)搜索引擎

三、於此同時將segment刷入內存,開放查詢設計

四、flush操做將segment寫入磁盤(默認30分鐘執行一次)blog

  flash操做包含:索引

  •     調用一次refresh
  •     fsync:將segment寫入磁盤
  •     清空對應的trans log

相關文章
相關標籤/搜索