Elasticsearch分片本質與集羣的故障轉移

分片簡介

primary shard:主分片,提升系統存儲容量,通過主分片將數據分佈在所有節點上,主分片可以將一個索引的數據分散在多個數據節點上,從而實現數據存儲的水平擴展。主分片數在索引創建的時候指定,後續不能修改,如果需要修改則需要重建索引

replica shard:副本分片,提高數據可用性,一旦主分片丟失,副本分片可以晉升成爲主分片。副本分片可以動態調整。如果不設置副本分片,一旦節點出現故障就可能會導致數據丟失。副本分片一定程度上也可以提升讀取的吞吐量

分片本質

分片是Elasticsearch中的最小工作單元,本質上是一個Lucene Index。在Lucene中,單個倒排索引文件被稱爲Segment,Segment是自包含且不可變更的,多個Segment彙總在一起稱爲Lucene Index

當有新文檔生成時,會生成新的Segment,查詢時會同時查詢所有Segment,並且對結果彙總,Lucene中有一個文件用來記錄所有Segments信息,叫做Commit Point,刪除的文檔信息,保存在.del文件中
在這裏插入圖片描述
Refresh

將數據從Index Buffer寫入Segment,默認1s執行1次(可以通過index.refresh_interval配置),refresh後數據才能被檢索。如果系統有大量的數據寫入,則會產生很多Segment。Index Buffer被佔滿時也會觸發refresh操作,默認是JVM的10%

在這裏插入圖片描述
Transaction Log

Segment寫入磁盤的過程相對耗時,藉助文件系統緩存,refresh時先將Segment寫入緩存以開放查詢。同時爲了保證數據不會丟失,在Index Document時,同時寫Transaction Log,高版本開始Transaction Log默認落盤。每個分片有一個Transaction Log,在refresh時,Index Buffer被清空,Transaction Log不會被清空

在這裏插入圖片描述
Flush

Elasticsearch Flush & Lucene Commit:調用refresh,將Index Buffer清空,調用fsync,將緩存中的Segment寫入磁盤,清空Transaction Log。默認30分鐘一次。Transaction Log佔滿時也會觸發,默認512MB

Merge

定期合併Segment,刪除已刪除的文檔,ES會自動執行,也可以手動使用API執行(POST my_index/_focemerge)

分片設定

主分片數過小,如果該索引增長很快,集羣無法通過增加節點實現對這個索引的數據擴展;主分片數設置過大,導致單個Shard容量很小,引發一個節點上有過多分片,影響性能;副本分片數設置過多會降低集羣整體的寫入性能

案例:設置number_of_shards:3;number_of_replicas:1
在這裏插入圖片描述

故障轉移

節點1是Master,節點出現故障後集羣重新選舉Master節點,Node3上的R0提升爲P0,集羣變黃,R0和R1分配,集羣變綠
在這裏插入圖片描述

補充

倒排索引的不可變性:倒排索引採用Immutable Design,一旦生成就不可改變。
優勢:

  • 無需考慮併發寫文件的問題,避免了鎖機制帶來的性能問題
  • 一旦讀入內核的文件系統緩存,便停留在那裏,只要文件系統有足夠的空間,大部分請求會直接請求內存,不會命中磁盤,提升性能,且緩存容易生成和維護,數據可以被壓縮

弊端:

  • 如果需要讓一個新的文檔被搜索,需要重建整個索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章