自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:ES 倒排索引如何實現(xiàn)?詳細(xì)描述一下 ES 索引文檔的過程?ES如何保證并發(fā)下讀寫一致?ES 如何實現(xiàn) master 選舉?

開發(fā)
Elasticsearch(簡稱ES)是一個基于Apache Lucene構(gòu)建的開源、分布式、RESTful接口的全文搜索引擎。

正文前的小菜——Elasticsearch的基礎(chǔ)概念(對基礎(chǔ)概念了解的朋友可以直接往下看題)

Elasticsearch(簡稱ES)是一個基于Apache Lucene構(gòu)建的開源、分布式、RESTful接口的全文搜索引擎。

以下是Elasticsearch的基礎(chǔ)概念:

1.Elasticsearch的基本概念

(1) 索引(Index):

  • 索引是Elasticsearch中存儲數(shù)據(jù)的地方,可以把它理解為一個優(yōu)化過的、快速查詢的大型文檔集合。
  • 索引類似于關(guān)系型數(shù)據(jù)庫中的“數(shù)據(jù)庫”或“表”的概念,但它是面向文檔的,且每個字段都可以被索引和搜索。
  • 索引由名稱(必須為全小寫字符)標(biāo)識,并通過此名稱進(jìn)行文檔的創(chuàng)建、搜索、更新及刪除操作。

(2) 文檔(Document):

  • 文檔是Elasticsearch中的最小單位,是索引中的一條數(shù)據(jù)。
  • 文檔以JSON格式存儲,包含多個字段,每個字段的類型由映射(Mapping)定義。
  • 文檔的字段類型可以是文本、數(shù)值、日期等,也可以是復(fù)雜類型,如嵌套文檔或數(shù)組。

(3) 映射(Mapping):

  • 映射定義了索引中文檔的結(jié)構(gòu),包括字段的名稱、類型和其他相關(guān)設(shè)置。
  • 類似于關(guān)系型數(shù)據(jù)庫中的模式(Schema),但Elasticsearch支持動態(tài)映射,即可以在插入新字段時自動創(chuàng)建映射。

(4) 分片(Shard):

  • 分片是Elasticsearch分布式架構(gòu)的基礎(chǔ),每個索引都可以被分成多個主分片(Primary Shard)和副本分片(Replica Shard)。
  • 主分片負(fù)責(zé)數(shù)據(jù)的存儲和索引,而副本分片則提供數(shù)據(jù)的冗余存儲和負(fù)載均衡。
  • 分片使得Elasticsearch能夠橫向擴(kuò)展至數(shù)以百計的服務(wù)器,處理PB級的數(shù)據(jù)。

(5) 節(jié)點(Node):

  • 節(jié)點是Elasticsearch集群中的一個實例,它可以是主節(jié)點(Master Node)、數(shù)據(jù)節(jié)點(Data Node)或客戶端節(jié)點(Client Node)。
  • 主節(jié)點負(fù)責(zé)集群的元數(shù)據(jù)存儲和協(xié)調(diào),數(shù)據(jù)節(jié)點負(fù)責(zé)數(shù)據(jù)的存儲和檢索,而客戶端節(jié)點則提供RESTful API接口供外部訪問。

2.Elasticsearch的工作原理簡述

(1) 索引過程:

  • 當(dāng)向Elasticsearch中存入文檔時,它會自動對文檔的內(nèi)容進(jìn)行索引。
  • 索引過程包括分詞和倒排索引,幫助系統(tǒng)快速找到與查詢匹配的文檔。

(2) 查詢過程:

  • 查詢請求會首先被發(fā)送到客戶端節(jié)點或數(shù)據(jù)節(jié)點。
  • 節(jié)點會根據(jù)查詢條件將請求路由到包含相關(guān)數(shù)據(jù)的分片上。
  • 分片會執(zhí)行查詢并返回結(jié)果給節(jié)點,節(jié)點再將結(jié)果匯總后返回給客戶端。

3.Elasticsearch的應(yīng)用場景

(1) 全文搜索:適用于需要全文檢索的應(yīng)用場景,如搜索引擎、文檔管理系統(tǒng)等。

(2) 日志分析:適用于需要實時分析日志數(shù)據(jù)的應(yīng)用場景,如運(yùn)維監(jiān)控、故障排查等。

(3) 實時數(shù)據(jù)分析:提供了聚合分析功能,可以實現(xiàn)對保存的大量數(shù)據(jù)的近實時統(tǒng)計分析。適用于需要實時數(shù)據(jù)分析的應(yīng)用場景,如商業(yè)智能、數(shù)據(jù)分析等。

面試官:ES的整體架構(gòu)是怎樣的?

Elasticsearch(簡稱ES)的整體架構(gòu)是分布式和模塊化的,旨在支持大規(guī)模數(shù)據(jù)的搜索、分析和實時查詢。

以下是ES整體架構(gòu)的詳細(xì)解釋:

1.集群與節(jié)點

(1) 集群:Elasticsearch集群由多個節(jié)點組成,這些節(jié)點共同協(xié)作以提供搜索和分析功能。每個集群都有一個唯一的名稱,節(jié)點通過這個名稱進(jìn)行通信。

(2) 節(jié)點:每個節(jié)點都是一個運(yùn)行Elasticsearch實例的服務(wù)器。節(jié)點可以是主節(jié)點、數(shù)據(jù)節(jié)點、協(xié)調(diào)節(jié)點或備份節(jié)點(也稱副本節(jié)點)。

  • 主節(jié)點(Master Node):負(fù)責(zé)管理集群的狀態(tài)和配置,如索引的創(chuàng)建和刪除、節(jié)點的加入和離開等。
  • 數(shù)據(jù)節(jié)點(Data Node):用于存儲數(shù)據(jù)并執(zhí)行與數(shù)據(jù)相關(guān)的操作,如搜索、聚合和索引。數(shù)據(jù)節(jié)點是集群中最重要的節(jié)點,因為它們會處理大多數(shù)請求。
  • 協(xié)調(diào)節(jié)點(Coordinating Node):負(fù)責(zé)將請求路由到適當(dāng)?shù)墓?jié)點,并將結(jié)果聚合返回給客戶。協(xié)調(diào)節(jié)點本身不存儲任何數(shù)據(jù)。
  • 備份節(jié)點(Replica Node):不用于主數(shù)據(jù)存儲,而是為主節(jié)點分片提供備份。若主節(jié)點出現(xiàn)故障,副本將自動替代其功能,保證高可用性。

2.索引與分片

(1) 索引:索引是存儲文檔的地方,可以視為一個數(shù)據(jù)庫。每個索引都有一個唯一的名稱,用于在搜索時引用。索引中的數(shù)據(jù)通常以JSON格式存儲,并可以通過REST API進(jìn)行操作。

(2) 分片:索引被分割成多個分片,每個分片是一個獨立的Lucene索引。分片使得數(shù)據(jù)可以水平擴(kuò)展,允許在多個節(jié)點上分布存儲。每個索引可以有多個主分片(primary shard)和副本分片(replica shard)。主分片存儲數(shù)據(jù),副本分片用于提供數(shù)據(jù)冗余和負(fù)載均衡。

3.文檔與字段

(1) 文檔:文檔是Elasticsearch中存儲的基本信息單元,通常與數(shù)據(jù)庫中的一行相對應(yīng)。每個文檔都有一個唯一的ID,且以JSON格式存儲。文檔包含多個字段,這些字段提供了文檔的元數(shù)據(jù)或內(nèi)容。

(2) 字段:文檔中的每個屬性都稱為一個字段。字段可以包含文本、數(shù)字、日期、布爾值或地理位置等數(shù)據(jù)類型。

4.存儲與檢索機(jī)制

(1) 存儲機(jī)制:當(dāng)文檔被寫入Elasticsearch時,它們首先被存儲在內(nèi)存緩沖區(qū)(Memory Buffer)中。然后,這些文檔會定期被刷新到磁盤上的段文件(Segment)中。段文件是Lucene索引的基本單位,它們包含了文檔的倒排索引和其他相關(guān)信息。

(2) 檢索機(jī)制:當(dāng)用戶執(zhí)行搜索查詢時,Elasticsearch會首先在Term Dictionary中查找查詢字符串中的每個單詞。然后,它會使用這些單詞對應(yīng)的倒排列表來找到包含這些單詞的文檔。最后,系統(tǒng)會根據(jù)文檔的相關(guān)性得分對結(jié)果進(jìn)行排序并返回給用戶。倒排索引允許Elasticsearch快速定位到包含特定單詞的文檔集合。

5.容錯與副本管理

(1) 容錯機(jī)制:Elasticsearch通過副本機(jī)制來提高數(shù)據(jù)的可靠性和可用性。當(dāng)主分片出現(xiàn)故障時,副本分片會自動提升為主分片,以繼續(xù)提供服務(wù)。

(2) 副本管理:Elasticsearch會根據(jù)配置為主分片創(chuàng)建副本分片。這些副本分片可以分布在不同的節(jié)點上,以確保在主分片出現(xiàn)故障時,數(shù)據(jù)仍然可以從副本分片中恢復(fù)。

6.分布式架構(gòu)與擴(kuò)展性

(1) 分布式架構(gòu):Elasticsearch的分布式架構(gòu)允許它橫向擴(kuò)展,以支持大規(guī)模數(shù)據(jù)集的存儲與處理。通過添加更多節(jié)點到集群中,Elasticsearch可以自動重新分配數(shù)據(jù)以平衡負(fù)載并提高性能。

(2) 擴(kuò)展性:Elasticsearch提供了靈活的擴(kuò)展選項,包括垂直擴(kuò)容(使用更強(qiáng)大的服務(wù)器)和水平擴(kuò)容(添加更多服務(wù)器)。然而,水平擴(kuò)容通常是更受歡迎的選擇,因為它可以更有效地利用資源并避免單點故障。

面試官:Elasticsearch中的分片和副本是如何工作的?分片和副本的大小和數(shù)量如何影響ES的性能?

1.分片(Shard)

(1) 定義:分片是Elasticsearch分發(fā)數(shù)據(jù)的單元。每個分片本身就是一個完整的搜索引擎(Lucene實例),它保存了全部數(shù)據(jù)中的一部分。

(2) 創(chuàng)建與分配:

當(dāng)創(chuàng)建一個新索引時,Elasticsearch會根據(jù)用戶指定的分片數(shù)量(通過number_of_shards參數(shù))創(chuàng)建主分片,并將這些分片分配到集群中的不同節(jié)點上。

分片的分配由Elasticsearch自動管理,確保它們分布在集群的不同節(jié)點上,以最大限度地提高系統(tǒng)的容錯能力和性能。

(3) 數(shù)據(jù)寫入:

對于寫操作(如創(chuàng)建、更新或刪除),Elasticsearch會將請求發(fā)送到包含相關(guān)分片的節(jié)點上執(zhí)行。

寫請求首先發(fā)送到主分片,主分片處理寫請求并將數(shù)據(jù)寫入到分片中,然后主分片將寫操作同步到所有的副本分片,確保數(shù)據(jù)的一致性。

(4) 數(shù)據(jù)讀?。?/p>

對于讀取操作,Elasticsearch可以從任何具有對應(yīng)分片(無論是主分片還是副本分片)的節(jié)點上獲取數(shù)據(jù)。

這允許查詢負(fù)載均衡,并且可以利用副本分片來增加搜索吞吐量。

2.副本(Replica)

(1) 定義:

副本是對主分片的冗余復(fù)制,用于提高數(shù)據(jù)的可用性和容錯性。

每個主分片都可以有一個或多個副本分片。

(2) 創(chuàng)建與分配:

Elasticsearch根據(jù)索引的副本設(shè)置(通過number_of_replicas參數(shù)),為每個主分片創(chuàng)建副本分片。

副本分片被分配到與主分片不同的節(jié)點上,以確保數(shù)據(jù)冗余和故障恢復(fù)能力。

(3) 故障恢復(fù):

如果某個節(jié)點宕機(jī)了,導(dǎo)致某些分片不可用,Elasticsearch會自動檢測到這個問題并嘗試使用副本分片來恢復(fù)服務(wù)。

Elasticsearch會將副本分片提升為主分片,并在集群中的其他節(jié)點上創(chuàng)建新的副本分片,以恢復(fù)數(shù)據(jù)冗余。

(4) 性能提升:

副本分片可以分擔(dān)讀請求,減少單個分片的讀負(fù)載,從而提高搜索性能和吞吐量。

如下所示是啟動2個ES節(jié)點,創(chuàng)建5個分片,1個副本的示例。

下面是啟動3個ES節(jié)點,創(chuàng)建5個分片,1個副本的示例。

下面再說說看分片和副本的大小和數(shù)量對ES性能的影響。

3.分片大小和數(shù)量對性能的影響

(1) 分片大?。?/p>

  • 寫入性能:較小的分片可以減少每個分片上的數(shù)據(jù)量,從而可能加快寫入速度,因為每次寫入操作涉及的數(shù)據(jù)量更少。然而,過小的分片可能導(dǎo)致過多的分片數(shù)量,增加管理開銷和I/O操作。相反,較大的分片可以處理更多的寫入請求,提高系統(tǒng)的寫入吞吐量,但過大的分片可能使故障恢復(fù)速度變慢。
  • 讀取性能:分片大小對讀取性能的影響相對復(fù)雜。較小的分片可能減少查詢時的數(shù)據(jù)掃描范圍,但也可能增加查詢時的分片間通信開銷。較大的分片可能提高查詢效率,但也可能導(dǎo)致查詢延遲增加,因為需要處理的數(shù)據(jù)量更大。

(2) 分片數(shù)量:

  • 寫入性能:更多的主分片可以提高寫入吞吐量,因為操作可以并行化到多個分片上。然而,每個分片都會消耗資源(CPU、內(nèi)存、磁盤),過多的分片會導(dǎo)致資源競爭,反而降低性能。
  • 讀取性能:讀取性能可以通過增加副本分片來提高,因為更多的副本可以處理更多的并發(fā)讀請求。然而,分片數(shù)量過多也可能導(dǎo)致查詢時的分片間通信開銷增加,影響讀取性能。

4.副本大小和數(shù)量對性能的影響

(1) 副本大?。?/p>

副本是數(shù)據(jù)的冗余拷貝,存儲在副本分片中。副本分片的大小與主分片相同,因為它們是對主分片的完整復(fù)制。因此,副本大小本身對性能沒有直接影響,但副本的數(shù)量和分布會影響性能。

(2) 副本數(shù)量:

提示:這里說的副本的數(shù)量是指ES對分片復(fù)制了幾份副本,而不是一份副本有多少個分片。

  • 讀取性能:增加副本分片數(shù)量可以提高系統(tǒng)的讀取性能,因為更多的副本可以處理更多的并發(fā)讀請求。副本分片還可以減少單個分片的讀負(fù)載,因為請求可以在多個副本之間均勻分配。
  • 寫入性能:每次寫入操作不僅要在主分片上執(zhí)行,還要在所有副本分片上重復(fù)。因此,增加副本分片數(shù)量會增加寫操作的負(fù)擔(dān),每次寫操作需要同步到更多的副本上。這可能導(dǎo)致寫入性能下降,特別是在資源有限的情況下。
  • 容錯能力:副本分片還可以提高系統(tǒng)的容錯能力。如果一個節(jié)點或分片失敗,Elasticsearch可以從副本中恢復(fù)數(shù)據(jù),幾乎不影響用戶查詢。更多的副本可以更快地恢復(fù)數(shù)據(jù),因為Elasticsearch有更多選項來重新分配和平衡網(wǎng)絡(luò)中的數(shù)據(jù)。

5.優(yōu)化建議

(1) 合理設(shè)置分片數(shù)量:

  • 根據(jù)數(shù)據(jù)量、硬件資源和使用場景來設(shè)置主分片的數(shù)量。通常建議將每個主分片的大小保持在幾十GB到幾百GB之間。
  • 對于需要頻繁更新或刪除的數(shù)據(jù),較小的分片(如10GB-20GB)可能更合適,以減少段合并的開銷。對于靜態(tài)數(shù)據(jù)或只增加不修改的數(shù)據(jù),更大的分片(接近50GB)通常更有效。

(2) 根據(jù)讀取負(fù)載調(diào)整副本數(shù)量:

  • 如果系統(tǒng)是讀取密集型的(如搜索或分析應(yīng)用),增加副本分片可以提供更好的讀取性能。
  • 在決定副本數(shù)量時,也要考慮集群的節(jié)點數(shù)量。至少應(yīng)該有足夠的節(jié)點來分配這些副本,以避免所有副本都在同一個節(jié)點上導(dǎo)致資源競爭。

(3) 監(jiān)控和調(diào)整:

  • 使用Elasticsearch的監(jiān)控工具(如Kibana Monitoring)定期檢查分片的健康和性能。
  • 如果檢測到性能瓶頸,可以根據(jù)具體情況調(diào)整分片和副本的數(shù)量。例如,使用Shrink API減少分片數(shù)量,或使用Split API增加分片數(shù)量。

面試官:說說看ES的倒排索引是如何實現(xiàn)的?

Elasticsearch使用倒排索引(Inverted Index)來存儲和檢索數(shù)據(jù)。倒排索引是一種數(shù)據(jù)結(jié)構(gòu),用于存儲每個詞(term)及其對應(yīng)的文檔ID列表(Posting List)。這種結(jié)構(gòu)使得Elasticsearch能夠快速地根據(jù)一個或多個詞找到包含這些詞的文檔。

ES的倒排索引包括以下結(jié)構(gòu):

1.Term Dictionary

Elasticsearch將所有的詞進(jìn)行排序,并使用二分法查找詞,以提高查找效率。這種排序后的詞列表被稱為Term Dictionary。

如下圖所示是正排索引,正排索引是以文檔的ID作為關(guān)鍵字,并且記錄文檔中每個字段的值信息,通過查詢id來把整條文檔拿出來。但是在查詢某一個keyword存在于哪些文檔的時候, 需要對所有文檔進(jìn)行掃描匹配。

這樣檢索效率比較低下:

再看倒排索引的Term Dictionary,倒排索引以字或詞作為關(guān)鍵字索引, 倒排索引建立的是分詞(Term)和文檔(Document)之間的映射關(guān)系。

2.倒排列表(Posting List)

倒排列表記載了出現(xiàn)過某個單詞的所有文檔的文檔列表。

列表中包含單詞在該文檔中出現(xiàn)的位置信息及頻率(作關(guān)聯(lián)性算分),每條記錄稱為一個倒排項(Posting)。

3.Term Index

由于Term Dictionary可能非常大,無法全部放入內(nèi)存,因此Elasticsearch引入了Term Index。Term Index類似于字典的索引頁,它包含了詞的一些前綴和對應(yīng)的Term Dictionary的block位置。通過Term Index,Elasticsearch可以快速定位到Term Dictionary的某個位置,然后從這個位置順序查找所需的詞。

4.FST(Finite State Transducers)

為了進(jìn)一步優(yōu)化Term Index,Elasticsearch使用了FST壓縮技術(shù)。FST是一種有限狀態(tài)機(jī),它將詞(字節(jié)序列)映射到任意輸出。通過FST,Elasticsearch可以將Term Index占用的空間進(jìn)一步縮小并緩存到內(nèi)存中,從而提高查找效率。FST的實現(xiàn)相對比較復(fù)雜,面試的時候答到Term Dictionary、倒排列表 和 Term Index即可,如果還想把FST答出來就要理解FST算法的原理。下面簡單描述下FST的構(gòu)造過程。我們對“cat”、 “deep”、 “do”、 “dog” 、“dogs”這5個單詞進(jìn)行插入構(gòu)建FST(注:必須已排序)。1)插入“cat”插入cat,每個字母形成一條邊,其中t邊指向終點。

2)插入“deep”與前一個單詞“cat”進(jìn)行最大前綴匹配,發(fā)現(xiàn)沒有匹配則直接插入,P邊指向終點。

3)插入“do”與前一個單詞“deep”進(jìn)行最大前綴匹配,發(fā)現(xiàn)是d,則在d邊后增加新邊o,o邊指向終點。

4)插入“dog”與前一個單詞“do”進(jìn)行最大前綴匹配,發(fā)現(xiàn)是do,則在o邊后增加新邊g,g邊指向終點。

5)插入“dogs”與前一個單詞“dog”進(jìn)行最大前綴匹配,發(fā)現(xiàn)是dog,則在g后增加新邊s,s邊指向終點。

最終我們得到了如上一個有向無環(huán)圖。利用該結(jié)構(gòu)可以很方便的進(jìn)行查詢,如給定一個term “dog”,我們可以通過上述結(jié)構(gòu)很方便的查詢存不存在,甚至我們在構(gòu)建過程中可以將單詞與某一數(shù)字、單詞進(jìn)行關(guān)聯(lián),從而實現(xiàn)key-value的映射。那么只要在每個節(jié)點或者指針上存儲該節(jié)點上單詞的倒排列表的地址就可以知道該單詞對應(yīng)的文檔ID有哪些了。

面試官:能說說看Elasticsearch寫入文檔的過程是怎么樣的嗎?

在介紹ES的寫入過程之前,先要介紹有關(guān)ES索引和段的基礎(chǔ)概念。

在ES中,索引(Index)是一個邏輯命名空間,包含一組文檔。每個索引由多個分片(Shard)組成,而每個分片又由多個segment組成。

segment是索引數(shù)據(jù)的實際存儲單元,而分片則是數(shù)據(jù)分布和并行處理的基本單位。當(dāng)查詢一個Elasticsearch索引時,查詢會在所有分片上執(zhí)行,進(jìn)而查詢到segment,然后合并所有結(jié)果。每一個段都是一個獨立的、不可變的文件集合,包含了完整索引中的一部分?jǐn)?shù)據(jù)(包括倒排索引和正排索引)。

我們可以理解為,ES寫入文檔最終是要將文檔寫入到段中,這個文檔才算進(jìn)入了倒排索引,能夠被搜索。

索引在 Lucene 中除表示所有段的集合外,還增加了提交點的概念。

為了提升寫的性能,Lucene并沒有每新增一條數(shù)據(jù)就增加一個段,而是采用延遲寫的策略,每當(dāng)有新增的數(shù)據(jù)時,就將其先寫入內(nèi)存中,然后批量寫入磁盤中。若有一個段被寫到硬盤,就會生成一個提交點,提交點就是一個列出了所有已知段和記錄所有提交后的段信息的文件。

再回過頭來說ES寫入文檔的過程,詳細(xì)描述如下:

1.寫入請求的接收與路由

(1) 接收請求:

客戶端向Elasticsearch集群中的任意節(jié)點發(fā)送寫入(Index)請求。

(2) 確定目標(biāo)分片:

接收請求的節(jié)點(作為協(xié)調(diào)節(jié)點)根據(jù)文檔的ID和索引的設(shè)置(如分片數(shù)量),使用哈希函數(shù)和模運(yùn)算來確定文檔應(yīng)該寫入到哪個主分片。

分片計算公式:shard_num = hash(_routing) % num_primary_shards。其中,_routing默認(rèn)情況下是文檔的ID,num_primary_shards是主分片的數(shù)量。

(3) 路由請求到目標(biāo)節(jié)點:

協(xié)調(diào)節(jié)點根據(jù)目標(biāo)分片的ID,通過集群狀態(tài)中的路由表找到該分片的主分片所在的節(jié)點,并將請求轉(zhuǎn)發(fā)給該節(jié)點。

2.在主分片上執(zhí)行寫入操作

(1) 內(nèi)存緩沖區(qū):

主分片接收到寫入請求后,首先將文檔存儲在內(nèi)存中的一個緩沖區(qū)(In-memory buffer)中。

(2) 記錄事務(wù)日志:

同時,為了確保數(shù)據(jù)的持久性和可靠性,Elasticsearch將每個寫入操作記錄到事務(wù)日志(Translog)中。

Translog是一個追加寫入的日志文件,它記錄了所有對索引的更改,以便在系統(tǒng)崩潰后恢復(fù)數(shù)據(jù)。

(3) 創(chuàng)建倒排索引:

在內(nèi)存緩沖區(qū)中,Elasticsearch將文檔轉(zhuǎn)換成倒排索引的形式,這個索引會在內(nèi)存中形成一個分段對象(Segment),詳情見下方的刷新操作(Refresh)。

倒排索引是Elasticsearch高效搜索的關(guān)鍵,它記錄了每個單詞在哪些文檔中出現(xiàn),以及出現(xiàn)的位置。

3.將數(shù)據(jù)同步到副本分片

(1) 異步復(fù)制:

一旦文檔被寫入到主分片,主分片會開始將數(shù)據(jù)異步地同步到其對應(yīng)的副本分片上。

副本分片是主分片的完整拷貝,它們可以處理搜索請求并提供數(shù)據(jù)恢復(fù)的能力。

(2) 等待確認(rèn):

主分片等待所有副本分片都成功寫入文檔后,才向協(xié)調(diào)節(jié)點發(fā)送確認(rèn)信息。

Elasticsearch的寫入一致性策略(如quorum)確保了在寫入數(shù)據(jù)時,必須有足夠數(shù)量的活躍分片(包括主分片和副本分片)處于可用狀態(tài)。

4.刷新與持久化

(1) 刷新操作(Refresh):

刷新操作會將內(nèi)存緩沖區(qū)中的數(shù)據(jù)創(chuàng)建成一個新的Lucene段(Segment),并將其添加到索引中。

刷新操作是周期性的,可以通過配置來控制刷新的頻率,它使得新寫入的數(shù)據(jù)可以被搜索到,但它不會將數(shù)據(jù)持久化到磁盤上。

(2) 持久化操作(Flush):

持久化操作會將內(nèi)存中的數(shù)據(jù)以及Translog中的更改寫入到磁盤上。

這意味著數(shù)據(jù)被真正寫入到了物理存儲中,而不僅僅是保存在操作系統(tǒng)的文件系統(tǒng)緩存中。

持久化操作會調(diào)用操作系統(tǒng)的fsync函數(shù)來確保數(shù)據(jù)被寫入磁盤,并且會清空相關(guān)的緩存和文件(如Translog)。

5.合并段(Segment Merging)

(1) 優(yōu)化存儲和搜索性能:

ElasticSearch 每次 refresh 一次都會生成一個新的 segment 文件,這樣下來 segment 文件會越來越多。因為每一個 segment 都會占用文件句柄、內(nèi)存、cpu資源,每個搜索請求都必須訪問每一個segment,這就意味著存在的 segment 越多,搜索請求就會變得更慢。

為了優(yōu)化存儲和搜索性能,Lucene會定期進(jìn)行段合并操作。

小的段會被合并到大的段中,然后這些大的段再被合并到更大的段。

(2) 合并過程:

合并過程在后臺進(jìn)行,不會中斷索引和搜索操作。ElasticSearch 有一個后臺進(jìn)程專門負(fù)責(zé) segment 的合并,定期執(zhí)行 merge 操作,將多個小 segment 文件合并成一個 segment,在合并時被標(biāo)識為 deleted 的文檔不會被寫入到新的 segment 中。

合并完成后,老的段會被刪除,然后將新的 segment 文件 flush 寫入磁盤。

然后創(chuàng)建一個新的 commit point 文件,標(biāo)識所有新的 segment 文件,并排除掉舊的 segement 和已經(jīng)被合并的小 segment。

面試官:Elasticsearch是如何實現(xiàn)master選舉的?

1.選舉機(jī)制概述

Elasticsearch的master選舉機(jī)制主要通過Zen Discovery插件(默認(rèn)插件)來實現(xiàn)。當(dāng)Elasticsearch集群啟動時,所有節(jié)點都處于一種“候選”狀態(tài),然后通過Zen Discovery機(jī)制相互發(fā)現(xiàn),并參與到主節(jié)點的選舉過程中。

2.選舉過程

(1) 節(jié)點發(fā)現(xiàn):

Elasticsearch集群中的節(jié)點通過Zen Discovery機(jī)制相互發(fā)現(xiàn),確保集群狀態(tài)的一致性。

(2) 候選者聲明:

每個節(jié)點在啟動時都會檢查自己的配置(如node.master設(shè)置為true),以確定自己是否有資格成為主節(jié)點候選者。

具備候選資格的節(jié)點會將自己添加到候選者列表中。

(3) 投票機(jī)制:

候選者節(jié)點會向集群中的其他所有節(jié)點發(fā)送投票請求。

每個節(jié)點在收到投票請求后,會根據(jù)一定的規(guī)則(如節(jié)點的健康狀況、存儲的數(shù)據(jù)量、負(fù)載情況等)來決定是否投票給該候選者。

投票過程遵循多數(shù)原則,即一個候選者必須獲得超過半數(shù)節(jié)點的選票才能成為主節(jié)點。

(4) 選舉結(jié)果:

如果某個候選者得到了超過半數(shù)的投票,那么它就會成為新的master節(jié)點。

如果兩個或更多的候選者得到了相同的票數(shù),那么集群將會再次進(jìn)行選舉,直到選出一個明確的master節(jié)點。

三、選舉過程中的關(guān)鍵要素

(1) 節(jié)點ID和版本號:

在選舉過程中,節(jié)點的ID和版本號也是重要的考慮因素。通常,版本號更高的節(jié)點會被優(yōu)先考慮作為主節(jié)點。

如果版本號相同,則會根據(jù)節(jié)點ID的大小來決定選舉結(jié)果(ID越小,優(yōu)先級越高)。

(2) 穩(wěn)定性檢查:

Elasticsearch會周期性地檢查當(dāng)前的主節(jié)點是否仍然有效。

如果主節(jié)點失去聯(lián)系或不可用,集群會再次啟動一個新的選舉過程來選出新的主節(jié)點。

(3) 持久化和同步:

主節(jié)點的選舉結(jié)果會被集群中的所有節(jié)點同步和持久化。

這確保了每個節(jié)點對當(dāng)前的主節(jié)點有一致的認(rèn)知,從而維護(hù)了集群的一致性。

面試官:ES集群的腦裂問題是如何產(chǎn)生的?如何避免ES集群發(fā)生腦裂?

1.基本概念

Elasticsearch集群中的腦裂問題(split-brain problem)是指在網(wǎng)絡(luò)分裂或節(jié)點故障的情況下,集群中的節(jié)點可能無法就主節(jié)點的選擇達(dá)成一致,導(dǎo)致多個節(jié)點各自認(rèn)為自己是主節(jié)點,從而引發(fā)數(shù)據(jù)不一致和潛在的數(shù)據(jù)丟失問題。

2.產(chǎn)生原因

(1) 網(wǎng)絡(luò)問題:

集群間的網(wǎng)絡(luò)延遲或中斷,導(dǎo)致一些節(jié)點無法訪問到主節(jié)點(Master Node),從而認(rèn)為主節(jié)點已經(jīng)失效。

在這種情況下,這些節(jié)點可能會選舉出新的主節(jié)點,并對原有的主節(jié)點上的分片和副本進(jìn)行標(biāo)記(如標(biāo)紅),然后分配新的主分片。

(2) 節(jié)點負(fù)載:

當(dāng)主節(jié)點的角色既為Master又為Data時,如果訪問量較大,可能會導(dǎo)致主節(jié)點停止響應(yīng)或處于假死狀態(tài)。

此時,其他節(jié)點得不到主節(jié)點的響應(yīng),會認(rèn)為主節(jié)點已經(jīng)掛掉,從而重新選舉主節(jié)點。

(3) JVM內(nèi)存回收:

Data節(jié)點上的Elasticsearch進(jìn)程占用的內(nèi)存較大時,可能會引發(fā)JVM的大規(guī)模內(nèi)存回收,導(dǎo)致Elasticsearch進(jìn)程失去響應(yīng)。

這種情況也可能導(dǎo)致節(jié)點認(rèn)為其他節(jié)點已經(jīng)失效,從而嘗試選舉新的主節(jié)點。

(4) 配置不當(dāng):

如果Elasticsearch集群的配置不當(dāng),如最小主節(jié)點數(shù)(Minimum Master Nodes)設(shè)置不正確,也可能導(dǎo)致腦裂問題的發(fā)生。

最小主節(jié)點數(shù)應(yīng)該設(shè)置為(N/2) + 1(其中N是具有主節(jié)點資格的節(jié)點數(shù)),以確保在集群分裂時只有一個主節(jié)點被選舉出來。

3.影響與后果

  • 數(shù)據(jù)不一致:在腦裂問題發(fā)生時,不同的節(jié)點組可能會執(zhí)行不同的寫操作,導(dǎo)致數(shù)據(jù)不一致。
  • 數(shù)據(jù)丟失:如果在腦裂問題發(fā)生期間,集群中的某些節(jié)點發(fā)生故障或宕機(jī),可能會導(dǎo)致數(shù)據(jù)丟失。

為了防止Elasticsearch集群中的腦裂問題,可以采取以下措施:

(1) 主節(jié)點選舉機(jī)制

  • Zen Discovery模塊:Elasticsearch使用Zen Discovery模塊進(jìn)行主節(jié)點選舉,確保集群中只有一個主節(jié)點管理集群元數(shù)據(jù)。
  • 仲裁節(jié)點數(shù)配置:合理配置discovery.zen.minimum_master_nodes,這個參數(shù)用于定義在選舉主節(jié)點時,集群中必須有多少個節(jié)點被認(rèn)為是活躍的,才能允許進(jìn)行主節(jié)點的選舉。

推薦的配置值是(N/2) + 1(向下取整),其中N是具有主節(jié)點資格的節(jié)點數(shù)。這個配置可以有效防止在網(wǎng)絡(luò)分區(qū)時形成多個主節(jié)點。

(2) 網(wǎng)絡(luò)配置與故障處理

①網(wǎng)絡(luò)超時與重試機(jī)制:

  • 配置網(wǎng)絡(luò)超時(如discovery.zen.ping_timeout)和重試機(jī)制,以減少網(wǎng)絡(luò)故障對集群的影響。
  • 適當(dāng)增加超時時間可以減少因網(wǎng)絡(luò)抖動導(dǎo)致的誤判,從而避免不必要的主節(jié)點重選。

②網(wǎng)絡(luò)分區(qū)檢測:定期進(jìn)行集群健康檢查,如果發(fā)現(xiàn)網(wǎng)絡(luò)分區(qū),集群會自動嘗試恢復(fù)并重新連接。

③網(wǎng)絡(luò)隔離:盡量避免將Elasticsearch集群部署在可能存在網(wǎng)絡(luò)隔離風(fēng)險的環(huán)境中,如跨數(shù)據(jù)中心部署時,要確保網(wǎng)絡(luò)連接的穩(wěn)定性和可靠性。

(3) 節(jié)點配置與負(fù)載管理

① 主節(jié)點與數(shù)據(jù)節(jié)點分離:

  • 將主節(jié)點(master node)與數(shù)據(jù)節(jié)點(data node)分離,以減輕主節(jié)點的負(fù)載,提高其穩(wěn)定性和響應(yīng)速度。
  • 可以通過配置node.master和node.data屬性來實現(xiàn)節(jié)點的角色分離。

關(guān)于node.master和node.data屬性的解釋如下:一個Elasticsearch集群是由許多Node構(gòu)成的,Node可以有不同的類型,通過以下配置,可以產(chǎn)生四種不同類型的Node:

conf/elasticsearch.yml:
    node.master: true/false
    node.data: true/false

四種不同類型的Node是一個node.master和node.data的true/false的兩兩組合。

當(dāng)node.master為true時,其表示這個node是一個master的候選節(jié)點,可以參與選舉。ES正常運(yùn)行時只能有一個master,多于1個時會發(fā)生腦裂。

當(dāng)node.data為true時,這個節(jié)點作為一個數(shù)據(jù)節(jié)點,會存儲分配在該node上的shard的數(shù)據(jù)并負(fù)責(zé)這些shard的寫入、查詢等。

② 負(fù)載均衡:

  • 在數(shù)據(jù)節(jié)點之間實現(xiàn)負(fù)載均衡,避免單個節(jié)點過載導(dǎo)致集群不穩(wěn)定。
  • 可以使用Elasticsearch的內(nèi)置負(fù)載均衡機(jī)制或外部負(fù)載均衡器來實現(xiàn)。

面試官:ES在高并發(fā)下如何保證讀寫一致性?

Elasticsearch在高并發(fā)環(huán)境下保證讀寫一致性,主要通過以下幾種機(jī)制來實現(xiàn):

1.最終一致性模型

Elasticsearch采用最終一致性模型,這意味著在理想情況下,系統(tǒng)會最終達(dá)到一致性,但可能在某些情況下會有短暫的不一致,尤其是在分布式系統(tǒng)中發(fā)生網(wǎng)絡(luò)分區(qū)或節(jié)點故障時。這種模型提供了高可用性和容錯能力,同時降低了嚴(yán)格一致性帶來的性能開銷。

2.事務(wù)日志(Translog)

作用:記錄所有對索引的更改操作,包括文檔的插入、更新和刪除。

寫前日志(Write-Ahead Logging, WAL):當(dāng)寫入請求到達(dá)時,Elasticsearch首先將數(shù)據(jù)寫入事務(wù)日志,然后再將其異步刷新到磁盤上的分片中。這種機(jī)制確保了在系統(tǒng)崩潰等異常情況下,已經(jīng)提交的數(shù)據(jù)不會丟失。

持久化:事務(wù)日志的使用對于處理高并發(fā)寫入請求至關(guān)重要,因為寫入操作只需要寫入事務(wù)日志,而不需要直接更新磁盤上的分片,因此寫入性能得到了極大的提升。同時,定期將事務(wù)日志的內(nèi)容寫入到一個新的日志文件中,并刪除舊的日志文件,以確保數(shù)據(jù)的持久化。

3.分片和副本

分片:Elasticsearch通過將數(shù)據(jù)分布在多個分片上來實現(xiàn)水平擴(kuò)展。每個索引由一個或多個分片組成,每個分片可以獨立存儲和處理數(shù)據(jù)。這種分片機(jī)制有助于將寫入和讀取請求分散到集群的不同節(jié)點上,從而提高并發(fā)處理能力。

副本:每個分片可以有零個或多個副本。副本是分片的完整拷貝,用于提高數(shù)據(jù)的可用性和容錯能力。當(dāng)原始分片不可用時(例如,由于節(jié)點故障),副本可以接管處理請求。通過合理配置分片和副本的數(shù)量,可以在集群中平衡負(fù)載,進(jìn)一步提高并發(fā)處理能力。

4.樂觀并發(fā)控制

版本號:Elasticsearch在每個文檔上維護(hù)版本號。每當(dāng)文檔被更新時,該版本號就會增加。

寫入操作:當(dāng)寫入操作請求使用一個特定版本時,Elasticsearch會檢查當(dāng)前存儲的版本與請求的版本是否匹配。如果匹配,則執(zhí)行更新操作;如果不匹配,則返回版本沖突錯誤。

沖突處理:如果兩個并發(fā)請求試圖更新同一個文檔,只有第一個請求會成功,第二個請求會收到一個版本沖突錯誤。應(yīng)用程序可以根據(jù)業(yè)務(wù)邏輯對這些沖突進(jìn)行處理,比如重試或者合并數(shù)據(jù)。

5.寫入一致性和讀取一致性控制

寫入一致性:通過設(shè)置write consistency,可以要求在寫操作時,必須等待多少個分片副本確認(rèn)成功才能返回。這可以提高數(shù)據(jù)的可靠性,但可能會增加延遲。例如:

  • quorum:等待多數(shù)副本確認(rèn)。
  • all:等待所有副本確認(rèn)。

讀取一致性:通過設(shè)置search consistency,可以保證讀取到的數(shù)據(jù)是某個時間點的一致視圖。例如:

  • 使用refresh機(jī)制,確保查詢時能夠看到剛剛寫入的數(shù)據(jù)。
  • 在分頁查詢時,可以使用search_after進(jìn)行基于游標(biāo)的查詢,以避免由于分頁查詢中的數(shù)據(jù)變化導(dǎo)致的不一致問題。
責(zé)任編輯:趙寧寧 來源: 程序員阿沛
相關(guān)推薦

2024-01-15 10:38:20

多級緩存數(shù)據(jù)一致性分布式緩存

2022-10-08 00:08:00

apiESFacebook

2022-10-19 12:22:53

并發(fā)扣款一致性

2023-12-20 08:18:34

ES索引誤刪

2021-12-13 11:54:13

SetEs6接口

2023-01-14 17:36:39

微服務(wù)注冊中心數(shù)據(jù)

2019-08-30 12:46:10

并發(fā)扣款查詢SQL

2024-04-26 11:16:28

MySQL數(shù)據(jù)庫

2010-04-09 17:45:06

Oracle索引

2021-11-08 15:59:01

MyBatis關(guān)聯(lián)開發(fā)

2025-02-26 12:19:52

2021-07-28 10:08:19

類加載代碼塊面試

2024-01-10 08:01:55

高并發(fā)場景悲觀鎖

2023-03-08 07:46:53

面試官優(yōu)化結(jié)構(gòu)體

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2024-09-11 22:51:19

線程通訊Object

2023-11-20 10:09:59

2009-08-10 16:40:03

C#索引器

2024-01-29 10:08:11

零拷貝Zero-copyCPU 拷貝

2024-02-27 15:23:48

RedLock算法Redis
點贊
收藏

51CTO技術(shù)棧公眾號