cluster state
es
集群相關(guān)的數(shù)據(jù)稱為 cluster state
,主要記錄:
- 節(jié)點(diǎn)信息幅慌,如節(jié)點(diǎn)名稱宋欺、連接地址等。
- 索引信息胰伍,如索引名稱齿诞、配置等。
能夠修改 cluster state
的節(jié)點(diǎn)稱為 master
節(jié)點(diǎn)骂租,master
節(jié)點(diǎn)維護(hù) cluster state
并將最新版本的數(shù)據(jù)同步給其它結(jié)點(diǎn)祷杈。master
節(jié)點(diǎn)是通過選舉產(chǎn)生的,可以被選舉的節(jié)點(diǎn)稱為 master-eligible
節(jié)點(diǎn)渗饮。
coordinating node
處理請求的節(jié)點(diǎn)即為 coordinating node
但汞,是所有節(jié)點(diǎn)的默認(rèn)角色,不可取消互站。coordinating node
負(fù)責(zé)路由請求到正確的節(jié)點(diǎn)處理私蕾。
data node
存儲數(shù)據(jù)的節(jié)點(diǎn)即為 data node
,默認(rèn)節(jié)點(diǎn)均為 data node
胡桃。
副本
es
引入副本(replica
)提高了服務(wù)可用性和數(shù)據(jù)可用性踩叭,創(chuàng)建索引時使用 number_of_replicas
參數(shù)指定副本數(shù)。
- 應(yīng)對部分節(jié)點(diǎn)停止服務(wù)問題翠胰。
- 在不同節(jié)點(diǎn)上進(jìn)行數(shù)據(jù)備份容贝。
分片
- 通過分片(
shard
)使得數(shù)據(jù)可以進(jìn)行拆分,分布在任意節(jié)點(diǎn)上之景。創(chuàng)建索引時使用number_of_shards
參數(shù)指定分片數(shù)斤富。 - 分片是
es
支持PB
級數(shù)據(jù)的基石。 - 分片數(shù)在索引創(chuàng)建時指定并且后續(xù)不允許修改锻狗。
- 分片有主分片和副本分片之分茂缚,副本分片的數(shù)據(jù)由主分片同步戏罢。副本分片可以有多個,用以提高吞吐量脚囊。
PUT /test
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 3
}
}
cluster health
通過 GET /_cluster/health
可以查看 es
集群狀態(tài)龟糕,包括以下三種:
-
green
:健康狀態(tài),所有主副分片都正常分配悔耘。 -
yello
:所有主分片都分配正常讲岁,但有副本分片未正常分配。 -
red
:有主分片未分配完成衬以。
故障轉(zhuǎn)移
非 master
節(jié)點(diǎn)會不停查看 mater
節(jié)點(diǎn)的狀態(tài)缓艳,如果發(fā)現(xiàn) master
節(jié)點(diǎn)無法提供服務(wù),會重新選舉 master
節(jié)點(diǎn)看峻,選舉規(guī)則為當(dāng)前集群可選舉結(jié)點(diǎn)數(shù)大于 quorom
時才可以選舉阶淘,quorom = 所有可選舉結(jié)點(diǎn)數(shù) / 2 + 1
。
分布式存儲
coordinating node
收到請求后會通過文檔映射算法用文檔 id
計算文檔所在的分片互妓,如果是查詢請求會獲取該分片的主副分片列表溪窒,然后以輪詢的機(jī)制到某個分片上執(zhí)行查詢,然后將結(jié)果返回給 coordinating node
冯勉;如果是寫入請求澈蚌,在計算文檔的分片后會將寫入請求轉(zhuǎn)發(fā)給主分片,主分片成功執(zhí)行后會將請求轉(zhuǎn)發(fā)給副本分片灼狰,主分片收到副本分片返回結(jié)果后通知 coordinating node
宛瞄。
倒排索引不可變特性
倒排索引一旦生成,不能修改交胚,好處如下:
- 不用考慮并發(fā)寫文件的問題份汗,杜絕了鎖機(jī)制帶來的性能問題。
- 由于文件不再更改蝴簇,可以充分利用文件系統(tǒng)緩存裸影,只需載入一次,在內(nèi)存足夠的情況下對該文件的讀取都會從內(nèi)存讀取军熏,性能更高。
- 利于生成緩存數(shù)據(jù)卷扮。
- 利于對文件進(jìn)行壓縮存儲荡澎,節(jié)省磁盤和內(nèi)存存儲空間。
倒排索引維護(hù)
lucene
針對倒排索引不可變問題的解決方案是生成新的倒排索引文件晤锹,查詢時同時查詢所有的倒排索引文件摩幔,然后匯總結(jié)果。這樣構(gòu)建的單個倒排索引稱為 segment
鞭铆,專門記錄 segment
信息的文件稱為 commit point
或衡,segment
和 commit point
構(gòu)成了 lucene index
焦影。
refresh
segement
寫入磁盤的過程耗時較長,可以借助文件系統(tǒng)的緩存特性封断,先將 segement
在緩存中創(chuàng)建并開放查詢來進(jìn)一步提升實時性斯辰。該過程在 es
中稱為 refresh
。
index buffer
在 refresh
之前文檔會先存儲在一個內(nèi)存 buffer
中坡疼,refresh
時將 buffer
中的所有文檔清空并在內(nèi)存中生成 segment
彬呻。由于 index buffer
的存在,refresh
可以等待一段時間來生成 segement
柄瑰,es
默認(rèn)每 1
秒執(zhí)行一次 refresh
闸氮,這就是 近實時
的由來。
translog
translog
機(jī)制是為了應(yīng)對內(nèi)存中的 index buffer
或 segement
還未寫進(jìn)磁盤時發(fā)生宕機(jī)等事故導(dǎo)致數(shù)據(jù)丟失的問題教沾。
- 當(dāng)變更寫入
buffer
時es
會將操作同步寫入translog
蒲跨,translog
文件會即時寫入磁盤(通過fsync
)。 -
es
啟動時會檢查translog
文件授翻,并從中恢復(fù)數(shù)據(jù)或悲。
flush
flush
負(fù)責(zé)將內(nèi)存中的 segment
寫入磁盤:
- 將
translog
寫入磁盤。 - 將
index buffer
清空藏姐,其中的文檔生成一個新的segement
隆箩,相當(dāng)于refresh
操作。 - 執(zhí)行
fsync
羔杨,將內(nèi)存中的segement
寫入磁盤捌臊。 - 更新
commit point
文件,記錄新增的segment
兜材。 - 刪除舊的
translog
文件理澎。
flush
默認(rèn)間隔時間是 30
分鐘,當(dāng) translog
超過一定大小時也會觸發(fā) flush
曙寡。
刪除文檔
lucene
專門維護(hù)了一個 .del
文件糠爬,記錄已刪除的文檔(文檔在 lucene
內(nèi)部的 id
),查詢時會通過 .del
文件進(jìn)行過濾举庶。更新文檔也是通過先刪除文檔再創(chuàng)建新的文檔來實現(xiàn)的执隧。
segment merging
隨著 segment
的增多,es
會定期在后臺執(zhí)行合并操作來減少 segment
的數(shù)量户侥。通過 force_merge
可以手動強(qiáng)制做 segement merge
操作镀琉。