?面試遇到了 ES 相關(guān)的拷打律杠,發(fā)現(xiàn)對 ES 還停留在應(yīng)用層潭流,對于底層的實現(xiàn)沒有很好的理解和熟悉,在此整理柜去,溫故知新灰嫉。
?本文介紹ES整體架構(gòu),節(jié)點嗓奢,分片讼撒,副本等概念以及查詢流程,數(shù)據(jù)更新流程股耽。
ES架構(gòu)
節(jié)點及節(jié)點類型 - Node
?在Elasticsearch中根盒,一個節(jié)點Node
可以同時扮演多個角色。例如物蝙,一個節(jié)點可以同時是數(shù)據(jù)節(jié)點炎滞、主可選舉節(jié)點和預(yù)處理節(jié)點。但是诬乞,為了優(yōu)化性能和資源使用厂榛,通常建議將這些角色分開,特別是在大型集群中丽惭。出于多可用的考慮,可以增加Ingest Node
節(jié)點辈双,通過讀負(fù)載均衡將讀寫請求分發(fā)到不同節(jié)點责掏,從而提高集群性能。
- Master Node
?主節(jié)點負(fù)責(zé)管理集群級別的操作湃望,比如創(chuàng)建或刪除索引换衬、跟蹤哪些節(jié)點是集群的一部分以及決定哪些分片分配給哪些節(jié)點。
?它們還處理集群范圍內(nèi)的變更证芭,如創(chuàng)建或刪除索引瞳浦、跟蹤集群中的節(jié)點以及管理集群的狀態(tài)。
?主節(jié)點不承擔(dān)數(shù)據(jù)相關(guān)的任務(wù)废士,如存儲或搜索文檔叫潦。 - Matser eligible Node
?主可選舉節(jié)點是指有資格被選舉為master節(jié)點的節(jié)點。在默認(rèn)配置下官硝,集群中的每個節(jié)點都可以成為master節(jié)點矗蕊。
?這些節(jié)點參與master節(jié)點的選舉過程短蜕,當(dāng)當(dāng)前的master節(jié)點不可用時,它們可以被選舉為新的master節(jié)點傻咖。
?它們也可以執(zhí)行數(shù)據(jù)節(jié)點的任務(wù)朋魔,如存儲數(shù)據(jù)和執(zhí)行搜索。 - Data Node
?數(shù)據(jù)節(jié)點負(fù)責(zé)存儲數(shù)據(jù)和執(zhí)行數(shù)據(jù)相關(guān)的操作卿操,如CRUD(創(chuàng)建警检、讀取、更新害淤、刪除)操作和搜索扇雕。
?它們還負(fù)責(zé)執(zhí)行集群的分片分配和數(shù)據(jù)的復(fù)制。
?數(shù)據(jù)節(jié)點是Elasticsearch集群中工作負(fù)載最重的節(jié)點筝家,因為它們負(fù)責(zé)處理數(shù)據(jù)和搜索請求洼裤。 - Coordinating Node
?協(xié)調(diào)節(jié)點通常是一個接受客戶端請求并向其他節(jié)點轉(zhuǎn)發(fā)請求的節(jié)點。
?它們不存儲數(shù)據(jù)溪王,但負(fù)責(zé)聚合來自不同節(jié)點的搜索結(jié)果并返回給客戶端腮鞍。
?協(xié)調(diào)節(jié)點可以是任何節(jié)點,因為任何節(jié)點都可以轉(zhuǎn)發(fā)請求莹菱,但通常移国,客戶端直接連接的節(jié)點就充當(dāng)協(xié)調(diào)節(jié)點的角色。 - Ingest Node
?預(yù)處理節(jié)點負(fù)責(zé)處理傳入數(shù)據(jù)的預(yù)處理工作道伟,如解析迹缀、轉(zhuǎn)換和豐富數(shù)據(jù)。
?它們使用預(yù)處理管道(Ingest pipelines)來處理文檔蜜徽,這些管道可以在索引之前對文檔進(jìn)行修改祝懂。
?Ingest節(jié)點可以與數(shù)據(jù)節(jié)點和協(xié)調(diào)節(jié)點的功能重疊,因為預(yù)處理可以在索引數(shù)據(jù)之前在任何節(jié)點上執(zhí)行拘鞋。
分片 - Shard
?在創(chuàng)建索引時砚蓬,可以指定分片的個數(shù)和副本個數(shù),多分片分部在集群各個節(jié)點,分片分為主分片Primary Shard
和副本分片Replica Shard
盆色。
?副分片不會被分配到與主分片相同的節(jié)點上灰蛙。這是為了確保如果一個節(jié)點發(fā)生故障,主分片和其副分片不會同時丟失隔躲,分配情況如下圖摩梧。
主分片(Primary Shard)
存儲和索引:每個文檔都存儲在一個主分片上。主分片負(fù)責(zé)處理文檔的索引(即插入宣旱、更新和刪除操作)仅父。
查詢處理:主分片也負(fù)責(zé)處理查詢請求,返回與查詢條件匹配的文檔。
數(shù)量固定:在創(chuàng)建索引時驾霜,需要指定主分片的數(shù)量案训,這個數(shù)量在索引創(chuàng)建后不能更改。
負(fù)載均衡:主分片在集群中的節(jié)點上分布粪糙,以實現(xiàn)負(fù)載均衡强霎。
副分片(Replica Shard)
數(shù)據(jù)復(fù)制:副分片是主分片的復(fù)制品,它們包含了與主分片相同的數(shù)據(jù)蓉冈。副分片的主要目的是提供數(shù)據(jù)的冗余城舞,以防主分片所在的節(jié)點發(fā)生故障。
查詢負(fù)載分擔(dān):副分片可以處理查詢請求寞酿,從而分擔(dān)主分片的負(fù)載家夺,提高查詢性能。
數(shù)量可變:副分片的數(shù)量可以在索引創(chuàng)建后動態(tài)調(diào)整伐弹,以適應(yīng)集群的負(fù)載和可用性需求拉馋。
故障恢復(fù):如果一個主分片所在的節(jié)點發(fā)生故障,Elasticsearch會從副分片中選舉一個新的主分片惨好,以保證數(shù)據(jù)的可用性煌茴。
功能區(qū)別
數(shù)據(jù)寫入:只有主分片負(fù)責(zé)處理數(shù)據(jù)的寫入操作,副分片不參與數(shù)據(jù)寫入日川,它們只是主分片的復(fù)制品蔓腐。
數(shù)據(jù)讀取:主分片和副分片都可以處理數(shù)據(jù)的讀取操作龄句,包括查詢和獲取文檔回论。副分片可以分擔(dān)讀取負(fù)載,提高查詢性能分歇。
故障恢復(fù):副分片的主要作用之一是提供故障恢復(fù)能力傀蓉。如果主分片丟失,Elasticsearch會從副分片中選擇一個新的主分片职抡,以保證數(shù)據(jù)的可用性和一致性僚害。
負(fù)載均衡:副分片有助于負(fù)載均衡,因為它們可以處理部分查詢請求繁调,從而減輕主分片的壓力。
如何保證主從數(shù)據(jù)一致性
- 寫操作傳播
當(dāng)對主分片執(zhí)行寫操作(如索引靶草、更新或刪除文檔)時蹄胰,這個操作會被復(fù)制到所有的副分片。
只有當(dāng)所有的副分片都確認(rèn)接收到并應(yīng)用了這個操作后奕翔,寫操作才會被認(rèn)為成功裕寨。 - 版本控制
每個文檔都有一個版本號,當(dāng)文檔被更新時,版本號會增加宾袜。
版本號用于確保操作的順序性捻艳,并在沖突發(fā)生時解決誰的更新優(yōu)先。 - 事務(wù)日志
主分片會維護(hù)一個操作日志(稱為translog)庆猫,記錄所有對文檔進(jìn)行的變更操作认轨。
當(dāng)副分片需要同步數(shù)據(jù)時,它會從主分片的translog中獲取自上次同步以來的所有變更月培,并應(yīng)用這些變更嘁字。 - 定期刷新
Elasticsearch會定期將內(nèi)存中的變更刷新到磁盤上的索引文件中。
這個定期刷新的過程稱為refresh杉畜,它確保了即使在節(jié)點故障的情況下纪蜒,數(shù)據(jù)也不會丟失。 - 副本同步
主分片和副分片之間的數(shù)據(jù)同步是實時進(jìn)行的此叠。
如果副分片落后于主分片纯续,它會自動從主分片獲取缺失的操作并應(yīng)用它們。
小結(jié)
?主分片和副分片的設(shè)計使得Elasticsearch能夠?qū)崿F(xiàn)高可用性灭袁、容錯能力和負(fù)載均衡猬错。主分片負(fù)責(zé)數(shù)據(jù)的存儲和索引,而副分片提供數(shù)據(jù)的冗余和讀取負(fù)載分擔(dān)简卧。在設(shè)計Elasticsearch集群時兔魂,合理配置主分片和副分片的數(shù)量對于優(yōu)化性能和可靠性至關(guān)重要。