天天看點

Elasticsearch分布式架構原理(一)

一、ES分片

1、分片是ES中最小的工作單元。

2、是一個Lucence的Index

二、反向索引的不可變性

1、反向索引采用的是Immutable Design,一旦生成不可更改。

2、不可變性,帶來的好處如下:

2.1、不需要考慮并發寫檔案的問題,避免了鎖機制帶來的性能問題

2.2、一旦讀入核心的檔案系統緩存,便留在那裡,隻要檔案系統有足夠的空間,大部分請求就會直接請求記憶體,不會命中磁盤,極大的提高了性能

2.3、緩存容易生成和為何,并且資料可以被壓縮

3、不可變性,也帶來了挑戰: 如果需要讓一個新的文檔可以被搜尋,需要重建整個索引

三、Lucene Index

Elasticsearch分布式架構原理(一)

1、一個ES中的shard就是Lucene中的Index(An ES Shard=A Lucene Index)

2、在Lucene中,單個反向索引檔案被稱為Segment;Segment是自包含的,不可變的,多個Segment彙總在一起,稱為Lucene的Index;

3、當有新文檔寫入時,會生成新segment;查詢是會同時查詢所有的segments,并且對結果彙總。

4、Lucene中有一個檔案,用來記錄所有segment資訊,叫做commit point.

5、删除的文檔資訊,儲存在.del檔案中。

四、Refresh

Elasticsearch分布式架構原理(一)

1、将Index Buffer寫入Segment的過程叫做Refresh,當執行Refresh的時候不執行fsync操作

2、Refresh頻率:預設1s發生一次,可通過參數index.refresh_interval配置,refresh後資料就可以被搜尋到了,這也是ES被稱為近實時搜尋(NRT)

3、如果有大量的資料寫入,就會産生很多的segment;

4、Index Buffer被占滿是,就會觸發refresh,index buffer預設大小是JVM的10%;

五、Transaction Log

Elasticsearch分布式架構原理(一)

1、segment寫入磁盤的過程相對耗時,借助檔案系統緩存,refresh的時候,先将segment寫入檔案系統緩存,以開放查詢。

2、為了保證資料不會丢失,在寫入文檔時,同時寫入Transcation Log,高版本開始,預設transaction log預設落盤;

3、每個分片都有一個transaction log;

4、在ES refresh的時候,index buffer被清空,transaction Log不會清空。

5、在發生斷電的時候,因為有transaction Log的落盤,資料不會丢失。

六、ES Flash和Lucene Commit

Elasticsearch分布式架構原理(一)

1、調用Refresh,Index Buffer清空并且Refresh

2、調用fsync,将緩存中的segments寫入磁盤

3、清空(删除)transaction log

4、預設30分鐘調用一次

5、transaction log 滿(預設512M)

七、Merge

1、Segment很多,需要被定期合并。可以減少segments和删除已經删除的文檔

2、ES和Lucene會自動進行merge操作。如果手動執行,可以通過使用以下API進行操作:POST my_index/_forcemerge

Elasticsearch分布式架構原理(一)

繼續閱讀