ElasticSearch 5.3原始碼學習 —— Segments_N 檔案詳解

jxy發表於2019-03-01

概覽

  • Lucene當前活躍的Segment都會存在一個Segment Info檔案裡,也就是segments_N。如果有多個segments_N,那麼序號最大的就是最新的。
  • segments_N用SegmentInfos進行操作
  • segments_N由Header, LuceneVersion, Version, NameCounter, SegCount, MinSegmentLuceneVersion, <SegName, HasSegID, SegID, SegCodec, DelGen, DeletionCount, FieldInfosGen, DocValuesGen, UpdatesFiles>SegCount, CommitUserData, Footer 這19個變數組成。
變數 型別
Header 一個魔數(int),"segments"字串和一個大版本(int)組成
LuceneVersion,MinSegmentLuceneVersion 3個vint組成
NameCounter, SegCount, DeletionCount int32
Generation, Version, DelGen, Checksum, FieldInfosGen, DocValuesGen 為 long(int64)
HasSegID int8
SegID 16位byte
SegName, SegCodec String
CommitUserData Map<String,String>
UpdatesFiles Map<Int32,Set>
Footer 魔數(int),algorithmID(int),CRC(long)

檔案例項(SegmentInfos#readCommit讀取)

IMAGE

序號 含義
1 Magic Number 硬編碼在lucene中,一直為0x3fd76c17
2 "segments"字串,用於校驗檔案
3 version為6
4 Commit ID, 16位byte
5 表示generation的string,這邊是1e
6 lucene具體版本,6.4.1
7 index version: 622,表示index修改了622次了
8 counter為0xf4,表示下一個segment序號為244
9 numSegments為8,表示一共有8個active segment
10 segment裡最小的lucene版本,為6.4.1
11 第一個segment name:_3d
12 第一個byte表示有沒有segID,如果為1,那麼後面16位就是segID
13 表示Codec,這裡是Lucene62,用來找到對應segment的編碼器,用於開啟segment
14 DelGen,刪除檔案序號,為-1代表還沒有刪除,對應檔案{segname}_{delgen}.liv,這裡就是_3d_1.liv
15 刪除的doc數目
16 fieldInfosGen,為-1代表沒有,對應檔案{segname}_{delgen}.fnm
17 docValuesGen
18 讀取一個String Set,第一個vint為長度,此處為0。然後讀取一個int代表DocValuesUpdatesFiles的長度,此處為0,如果不為0,則是一個Map<Int32,Set>
19 第二個segment的開頭,因為一共有8個segment所以後面就重複上面的7遍
20 CommitUserData的長度,此處為3,表示後面有6個string,依次讀取作為kv
21 結尾魔數,是開頭魔數的反碼
22 algorithmID 此處為0
23 CRC校驗碼

附錄

  1. vint: 用1-5bit表示int,符號位表示是否結束(為0代表結束),後7位表示數值。低位在前高位在後
  2. generation在檔名中都是轉成36進位制
  3. SegmentInfos在readCommit時除了讀取Segment_N,還會讀取各segment的元檔案獲得maxID,在lucene62中為.si檔案,下圖示紅處即為docNum,MaxDoc為63023 (Lucene62SegmentInfoFormat#read讀取)
    IMAGE
  4. 其實Segment的這些資料在Rest API中均有展示,不過在5.3中不在一個api
// 獲得當前Segments資訊
GET /{index}/_segments
//獲得CommitUserData
GET /{index}/_stats?filter_path=**.commit&level=shards
複製程式碼

版權宣告

  • 自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
  • 本文首發於: http://czjxy881.coding.me/

相關文章