一、ElasticSearch 分片
ElasticSearch集群中有許多個(gè)節(jié)點(diǎn)(Node),每一個(gè)節(jié)點(diǎn)實(shí)例就是一個(gè)實(shí)例;數(shù)據(jù)分布在分片之間。集群的容量和性能主要取決于分片如何在節(jié)點(diǎn)上如何分配。將數(shù)據(jù)分片是為了提高可處理的容量和易于進(jìn)行水平擴(kuò)展,為分片做副本是為了提高集群的穩(wěn)定性和提高并發(fā)量。每個(gè)分片之間是相互獨(dú)立的,對(duì)于搜索request 每個(gè)分片都會(huì)執(zhí)行。
二、分片
分片好比在 Mysql中 的分表,將數(shù)據(jù)分布在多張表中。
主分片(shard):主分片是數(shù)據(jù)的容器,文檔保存在主分片內(nèi),主分片又被分配到集群內(nèi)的各個(gè)節(jié)點(diǎn)里。每個(gè)shard都是一個(gè)lucene的索引文件(index)。
副本分片(replica):副本是對(duì)主分片的Copy,同步存儲(chǔ)主分片的數(shù)據(jù)內(nèi)容。為了達(dá)到高可用,當(dāng)分片所在的物理節(jié)點(diǎn)宕機(jī),ES可以使用副本機(jī)制進(jìn)行恢復(fù),從而避免數(shù)據(jù)丟失.。一個(gè)分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519個(gè)docs。
※:并不是副分片越多越好,因?yàn)槊總€(gè)分片都相當(dāng)于一個(gè)索引文件,會(huì)占用一定的文件句柄、內(nèi)存及cpu,并且分片間的數(shù)據(jù)同步也會(huì)占用一定的網(wǎng)絡(luò)帶寬。副本是乘法,越多消耗越大,但也越保險(xiǎn)。分片是除法,分片越多,單分片數(shù)據(jù)就越少也越分散。
※:在主分片掛掉后,會(huì)從副本分片中選舉一個(gè)升級(jí)為主分片,當(dāng)副本升級(jí)為主分片后,由于少了一個(gè)副本分片,所以集群狀態(tài)會(huì)從green改變?yōu)閥ellow,但是此時(shí)集群仍然可用。在一個(gè)集群中有一個(gè)分片的主分片和副本分片都掛掉后,集群狀態(tài)會(huì)由yellow改變r(jià)ed,集群狀態(tài)為red時(shí)集群不可正常使用。
※:由于elasticSearch 通過路由定位公式找到每一個(gè)數(shù)據(jù)對(duì)應(yīng)的具體分片的。
shard = hash(routing)%number_of_primary_shards
routing的默認(rèn)值就是這個(gè)document的_id(也可以手動(dòng)指定),這也說明了主分片數(shù)一旦定下來就不能再改變的原因,因?yàn)榉制瑪?shù)改變后,所有之前的路由值都會(huì)變得無效,之前的文檔數(shù)據(jù)也就找不到了。
三、節(jié)點(diǎn)
Master節(jié)點(diǎn):職責(zé)是和集群操作相關(guān)的內(nèi)容,如創(chuàng)建或刪除索引,跟蹤哪些節(jié)點(diǎn)是集群的一部分,并決定哪些分片分配給相關(guān)的節(jié)點(diǎn),穩(wěn)定的主節(jié)點(diǎn)對(duì)集群的健康是非常重要的。
節(jié)點(diǎn)對(duì)等:每個(gè)節(jié)點(diǎn)都能接收請(qǐng)求,每個(gè)節(jié)點(diǎn)接收到請(qǐng)求后都能把該請(qǐng)求路由到有相關(guān)數(shù)據(jù)的其他節(jié)點(diǎn)上,接收原始請(qǐng)求的節(jié)點(diǎn)負(fù)責(zé)采集數(shù)據(jù)并返回給客戶端。
協(xié)調(diào)節(jié)點(diǎn):一個(gè)寫請(qǐng)求被發(fā)送到集群的一個(gè)節(jié)點(diǎn)后該節(jié)點(diǎn)稱為協(xié)調(diào)節(jié)點(diǎn)。其職責(zé)是廣播查詢請(qǐng)求到所有相關(guān)分片并將它們的響應(yīng)整合成全局排序后的結(jié)果集合后返回給客戶端。
※:增加和刪除節(jié)點(diǎn),會(huì)自動(dòng)平衡 shard 在剩余節(jié)點(diǎn)中的分配。
※:如果集群中只有一個(gè)節(jié)點(diǎn),就沒有地方分配副本,此時(shí)副本的狀態(tài)就是unassigned(未分配的分片),也就是說主副分片不能存在于同一臺(tái)機(jī)器上。
※:一旦集群中的節(jié)點(diǎn)發(fā)生變化,它們就會(huì)協(xié)商誰將成為主節(jié)點(diǎn),ES中所有節(jié)點(diǎn)都有機(jī)會(huì)成為主節(jié)點(diǎn),可以通過設(shè)置主節(jié)點(diǎn)的最小數(shù)量防止腦裂(split brain)問題,一般的規(guī)則是集群節(jié)點(diǎn)數(shù)除以2(向下取整)再加一。
四、查詢和寫入過程
查詢:當(dāng)協(xié)調(diào)節(jié)點(diǎn)收到查詢 request 時(shí),先在本地創(chuàng)建一個(gè)大小為 from + size 的空優(yōu)先隊(duì)列,然后將請(qǐng)求廣播到索引的每個(gè)分片中,分片在本地執(zhí)行查詢并添加結(jié)果到本地有序優(yōu)先隊(duì)列中后返回給協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)將分片級(jí)的結(jié)果合并到自己的有序優(yōu)先隊(duì)列里并返回。
寫入:通過 routing 以及協(xié)調(diào)節(jié)點(diǎn)確定寫到具體的某個(gè)主分片上后,并發(fā)的向所有副本同步數(shù)據(jù)(樂觀鎖),所有副本同步完成后即為成功(類似 kafka 的ACK應(yīng)答機(jī)制)
※:ElasticSearch 通過增加 translog日志保證數(shù)據(jù)存儲(chǔ)可靠性。
當(dāng)新增了一個(gè)文檔數(shù)據(jù)后首先被寫入內(nèi)存中,如果此時(shí)宕機(jī)數(shù)據(jù)將會(huì)丟失,為此新增 translog 日志記錄數(shù)據(jù),translog 是追加寫入,因此性能比較好。
通過不斷的執(zhí)行 refresh 操作(操作間隔大約1s),將數(shù)據(jù)以段 (segment) 的形式提交到文件緩存系統(tǒng)中,此時(shí)雖然還真正的落盤但是可以正常打開并讀取文件。由于 refresh 操作會(huì)產(chǎn)生大量很小的段(segment),ES會(huì)對(duì)符合條件的segment進(jìn)行合并操作,減少lucene中的segment個(gè)數(shù),提高查詢速度,降低負(fù)載。
隨著 每30分鐘或當(dāng)translog達(dá)到一定大小,ES會(huì)觸發(fā)一次flush操作,將所有內(nèi)存中的 segment fsync到磁盤,數(shù)據(jù)就完成了持久化。

Tip: 為什么不直接刷到磁盤,而是寫入文件緩存系統(tǒng)?
每30分鐘或當(dāng)translog達(dá)到一定大小(由index.translog.flush_threshold_size控制,默認(rèn)512mb),ES會(huì)觸發(fā)一次flush操作文章來源:http://www.zghlxwxcb.cn/news/detail-779552.html
fsync 操作代價(jià)很大,如果每次索引一個(gè)文檔都去執(zhí)行一次的話會(huì)造成很大的性能問題,但是這里新segment會(huì)被先寫入到文件系統(tǒng)緩存,這一步代價(jià)會(huì)比較低文章來源地址http://www.zghlxwxcb.cn/news/detail-779552.html
到了這里,關(guān)于ElasticSearch 數(shù)據(jù)分片的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!