- 什麼是ES的分片
- ES中最小的工作單元 / 是一個Lucence的Index
- 一些問題:
- 為什麼ES的搜尋時近實時的(1秒後被搜到)
- ES如何保證在斷電時資料也不會丟失
- 為甚刪除文件,並不會立刻釋放空間
- 倒排索引採用
Immutable Design
,一旦生成,不可更改 - 不可變性,帶來了的好處如下:
- 不許考慮併發寫檔案的問題,避免了鎖機制帶來的效能問題
- 一旦讀入核心的檔案系統快取,便留在那裡,只要檔案系統存有足夠的空間,大部分請求就會直接請求記憶體,不會命中磁碟,提高了很大的效能
- 快取容易生成和維護 / 資料可以被壓縮
- 不可變更性,帶來了的挑戰:如果需要讓一個新的文件可以被搜尋,需要重建整個索引
- 在Lucene中,單個倒排索引檔案被稱為
Segment
。Segment
是自包含的,不可變更的。多個Segment
彙總在一起,稱為Lucene的Index,其對應的就是ES中的Shard - 當有新文件寫入時,會生成新的
Segment
,查詢時會同時查詢所有的Segment
,並且對結果彙總。Luncene中有個檔案,用來記錄所有的Segment
的資訊,叫做Commit Point
- 刪除的文件資訊,儲存在".del"檔案中
- 將Index buffer 寫入
Segment
的過程叫做Refresh
。Refresh
不執行fsync
操作 Refresh
頻率:預設1秒發生一次,可通過index.refresj_interval
配置。Refresh
後,資料就可以被搜尋到了。這也就是為什麼ES被稱為近實時搜尋- 如果系統有大量的資料寫入,那就會產生很多的
Segment
- Index Buffer 被佔滿時,會觸發
Refresh
,預設值是JVM的10%
-Segment
寫入磁碟的過程相對耗時,藉助檔案系統快取,Refresh時,先將Segment
寫入快取以開放查詢
- 蔚來保證資料不會丟失。所有在Index文件時,同時寫
Transaction Log
,高版本開始,ra預設落盤。每個分片都有一個Transaction Log
- 當
ES Refresh
時,Index Buffer
被清空,Transaction Log
不會清空
- ES Flush & Lucene Commit
- 呼叫
Refresh
,Index Buffer
清空並且Refresh
- 呼叫fsync,將快取中的
Segments
寫入磁碟 - 清空(刪除)
Transaction Log
- 預設30分鐘呼叫一次
Transaction Log
滿(預設512M)
- 呼叫
Segment
很多,需要定期被合併- 減少
Segment
/ 刪除已經刪除的文件
- 減少
- ES 和Lucene 會自動進行Merge操作
- POST my_index/_forcemerge