由于master節(jié)點(diǎn)只保存了cluster級(jí)別和indices級(jí)別的元數(shù)據(jù),但沒(méi)有shard在哪個(gè)node上的元數(shù)據(jù),需要走一遍allocation流程確定每個(gè)shard分配到哪個(gè)節(jié)點(diǎn),allocation使用allocator和deciders進(jìn)行節(jié)點(diǎn)選擇,allocator負(fù)責(zé)整個(gè)流程會(huì)找出哪些節(jié)點(diǎn)可以分配,deciders通過(guò)多個(gè)decider判斷該節(jié)點(diǎn)能否分配,很多分片分配的配置都是通過(guò)decider實(shí)現(xiàn)的,例如primary和replica不能分配在同一個(gè)節(jié)點(diǎn)、磁盤容量大于85%不能分配。
I. Master node
- gateway階段結(jié)束后,觸發(fā)reroute分配分片
- shuffle 所有未分配的分片。作用是避免一些有問(wèn)題的分片影響其他分片分配。例如,集群分片分配的并發(fā)是1,有一個(gè)分片因?yàn)槲募p壞無(wú)法分配,如果不進(jìn)行shuffle,每次分片分配的都是這個(gè)有問(wèn)題的分片,直到到達(dá)次數(shù)上限
- 對(duì)unassigned shard按優(yōu)先級(jí)排序,首先比較index.priority,其次是index create time,最后index name。
沒(méi)錯(cuò),鑒權(quán)相關(guān)的索引優(yōu)先級(jí)最高,確保集群接口最快可用 - 首先使用primaryShardAllocator對(duì)所有primary進(jìn)行分配,根據(jù)每個(gè)shard向所有節(jié)點(diǎn)異步發(fā)起fetchData請(qǐng)求,拉取shard的元數(shù)據(jù)
- 由于請(qǐng)求是異步的,當(dāng)前還沒(méi)有元數(shù)據(jù),因此reroute結(jié)束
II. Data node
- 從磁盤目錄加載shard元數(shù)據(jù),包含allocationId, boolean primary, discovery node。
- 嘗試調(diào)用Lucene從shard目錄打開(kāi)索引,如果遇到異常則加入返回信息中,例如磁盤故障就會(huì)拋出異常
- 將allocationId, boolean primary, discovery node,store exception返回給master節(jié)點(diǎn)
III. Master node
- 當(dāng)fetchData請(qǐng)求的response返回后,會(huì)保存結(jié)果,觸發(fā)reroute來(lái)繼續(xù)分配分片
- 將該分片在所有節(jié)點(diǎn)的返回結(jié)果進(jìn)行排序,排序依次比較no excepiton 和 primary
- 使用deciders將節(jié)點(diǎn)分為三組yes(可以分配) no(不能分配) throttled(分配受到并發(fā)限制)
- 如果yes不為空,則將shard分配給列表中的第一個(gè)節(jié)點(diǎn)
- 如果yes和throttle為空,no不為空,則嘗試是否能夠forceAllocate,forceAllocate會(huì)將no返回為yes,yes和throttle正常返回
- 如果結(jié)果為yes則將分片分配給對(duì)應(yīng)節(jié)點(diǎn),更新相關(guān)數(shù)據(jù)結(jié)構(gòu),否則分片標(biāo)記ignore,避免分片走到新建分片分配流程
- 遍歷replica shard,使用replicaShardAllocator進(jìn)行allocate
- 先通過(guò)deciders判斷一下,是否至少有一個(gè)節(jié)點(diǎn)可以分配shard,如果分配不了就省略后面邏輯
- 和primary一樣,拉取分片元數(shù)據(jù),不過(guò)元數(shù)據(jù)不同
IV. Data node
- 從內(nèi)存或者磁盤獲取StoreFilesMetadata,其中包含retention lease, MetadataSnapshot(shard Lucene文件元數(shù)據(jù))
- 返回StoreFilesMetadata給master
V. Master node
-
需要對(duì)返回結(jié)果的node按照replica數(shù)據(jù)的落后程度進(jìn)行排序,優(yōu)先數(shù)據(jù)較全的。最匹配的節(jié)點(diǎn)的排序方式是
-
無(wú)需回放操作(replica SeqNo(從retention lease獲取) > primary SeqNo或者replica sync flush id = primary https://www.elastic.co/guide/en/elasticsearch/reference/6.0/indices-synced-flush.html) 。順便說(shuō)一句,Elasticsearch 跟蹤每個(gè)分片的索引活動(dòng)。 5 分鐘內(nèi)未收到任何索引操作的分片將自動(dòng)標(biāo)記為非活動(dòng)狀態(tài)。 這為 Elasticsearch 提供了減少分片占用資源并執(zhí)行一種特殊類型的刷新(稱為synced flush)的機(jī)會(huì)。 同步刷新執(zhí)行正常刷新,然后將生成的唯一標(biāo)記(sync_id)添加到所有分片。
由于sync id標(biāo)記是在沒(méi)有正在進(jìn)行的索引操作時(shí)添加的,因此它可以用作檢查兩個(gè)分片的 lucene 索引是否相同的快速方法。 這種快速sync ID 比較(如果存在)在恢復(fù)或重新啟動(dòng)期間使用,以跳過(guò)該過(guò)程的第一個(gè)也是成本最高的階段。 在這種情況下,不需要復(fù)制段文件,并且可以立即開(kāi)始恢復(fù)的事務(wù)日志重播階段。 請(qǐng)注意,由于sync ID 標(biāo)記與刷新一起應(yīng)用,因此事務(wù)日志很可能為空,從而進(jìn)一步加快恢復(fù)速度。
-
retenton lease的seq No較大(意味著需要回放的操作少)
-
Checksum相同的文件大小較大的
-
-
使用decider對(duì)最匹配的節(jié)點(diǎn)進(jìn)行決策,如果throttle則返回,如果是yes或者no則返回yes
-
如果最匹配的節(jié)點(diǎn)都沒(méi)有數(shù)據(jù)則replica shard進(jìn)行延遲分配文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-786799.html
-
reroute完成后構(gòu)建集群新的狀態(tài)。最后master將新的集群狀態(tài)廣播下去文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-786799.html
VI. Data node
- 數(shù)據(jù)節(jié)點(diǎn)收到cluster state change后,應(yīng)用變化,創(chuàng)建或更新shard
- 節(jié)點(diǎn)上無(wú)該shard時(shí),createshard,進(jìn)行shard recovery,主分片從本地恢復(fù),副本從主分片恢復(fù)
總結(jié)
- fetch data過(guò)程會(huì)發(fā)送shard num * node num個(gè)請(qǐng)求,并且會(huì)將結(jié)果保存在內(nèi)存中。當(dāng)集群規(guī)模較大時(shí),master節(jié)點(diǎn)內(nèi)存會(huì)被打滿,150節(jié)點(diǎn) 7w分片 master節(jié)點(diǎn)10GB內(nèi)存時(shí)就出現(xiàn)過(guò)??梢钥紤]將sync allocation id和node的映射保存在cluster state,或者按分片并發(fā)數(shù)進(jìn)行限流
- 利用retention lease和synced id加速replica的恢復(fù)過(guò)程,synced id用于快速比較,retention lease減少回放的doc數(shù)。有個(gè)問(wèn)題是為什么不通過(guò)sync allocation id列表來(lái)給replica排序呢
到了這里,關(guān)于【Elasticsearch】存在數(shù)據(jù)的分片分配流程梳理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!