ElasticSearch 5.3源碼學習 —— Segments_N 文件詳解

概覽

  • 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/
相關文章
相關標籤/搜索