ES 筆記三十三: 分片及其生命週期

CrazyZard發表於2019-12-21
  • 什麼是ES的分片
    • ES中最小的工作單元 / 是一個Lucence的Index
  • 一些問題:
    • 為什麼ES的搜尋時近實時的(1秒後被搜到)
    • ES如何保證在斷電時資料也不會丟失
    • 為甚刪除文件,並不會立刻釋放空間
  • 倒排索引採用Immutable Design,一旦生成,不可更改
  • 不可變性,帶來了的好處如下:
    • 不許考慮併發寫檔案的問題,避免了鎖機制帶來的效能問題
    • 一旦讀入核心的檔案系統快取,便留在那裡,只要檔案系統存有足夠的空間,大部分請求就會直接請求記憶體,不會命中磁碟,提高了很大的效能
    • 快取容易生成和維護 / 資料可以被壓縮
  • 不可變更性,帶來了的挑戰:如果需要讓一個新的文件可以被搜尋,需要重建整個索引
  • 在Lucene中,單個倒排索引檔案被稱為SegmentSegment是自包含的,不可變更的。多個Segment彙總在一起,稱為Lucene的Index,其對應的就是ES中的Shard
  • 當有新文件寫入時,會生成新的Segment,查詢時會同時查詢所有的Segment,並且對結果彙總。Luncene中有個檔案,用來記錄所有的Segment的資訊,叫做Commit Point
  • 刪除的文件資訊,儲存在".del"檔案中

ES 筆記三十三: 分片及其生命週期

  • 將Index buffer 寫入Segment的過程叫做RefreshRefresh不執行fsync操作
  • Refresh頻率:預設1秒發生一次,可通過index.refresj_interval配置。Refresh後,資料就可以被搜尋到了。這也就是為什麼ES被稱為近實時搜尋
  • 如果系統有大量的資料寫入,那就會產生很多的Segment
  • Index Buffer 被佔滿時,會觸發Refresh,預設值是JVM的10%

ES 筆記三十三: 分片及其生命週期

-Segment寫入磁碟的過程相對耗時,藉助檔案系統快取,Refresh時,先將Segment寫入快取以開放查詢

  • 蔚來保證資料不會丟失。所有在Index文件時,同時寫Transaction Log,高版本開始,ra預設落盤。每個分片都有一個Transaction Log
  • ES Refresh時,Index Buffer被清空,Transaction Log不會清空

ES 筆記三十三: 分片及其生命週期

  • ES Flush & Lucene Commit
    • 呼叫RefreshIndex Buffer 清空並且Refresh
    • 呼叫fsync,將快取中的Segments寫入磁碟
    • 清空(刪除)Transaction Log
    • 預設30分鐘呼叫一次
    • Transaction Log滿(預設512M)

ES 筆記三十三: 分片及其生命週期

  • Segment很多,需要定期被合併
    • 減少Segment/ 刪除已經刪除的文件
  • ES 和Lucene 會自動進行Merge操作
    • POST my_index/_forcemerge

快樂就是解決一個又一個的問題!

相關文章