您現在的位置是:首頁 > 棋牌

2019年常見ElasticSearch面試題答案詳細解析

  • 由 程式設計師追風 發表于 棋牌
  • 2021-10-21
簡介2、elasticsearch 的倒排索引是什麼3、elasticsearch 索引資料多了怎麼辦,如何調優,部署4、elasticsearch 是如何實現 master 選舉的5、詳細描述一下 Elasticsearch 索引文件的過程6

倒排索引怎麼解決

前言

ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放原始碼釋出,是一種流行的企業級搜尋引擎。ElasticSearch用於雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。官方客戶端在Java、。NET(C#)、PHP、Python、Apache Groovy、Ruby和許多其他語言中都是可用的。根據DB-Engines的排名顯示,Elasticsearch是最受歡迎的企業搜尋引擎,其次是Apache Solr,也是基於Lucene。

2019年常見ElasticSearch面試題答案詳細解析

Elasticsearch 面試題

1、elasticsearch 瞭解多少,說說你們公司 es 的叢集架構,索引資料大小,分片有多少,以及一些調優手段 。

2、elasticsearch 的倒排索引是什麼

3、elasticsearch 索引資料多了怎麼辦,如何調優,部署

4、elasticsearch 是如何實現 master 選舉的

5、詳細描述一下 Elasticsearch 索引文件的過程

6、詳細描述一下 Elasticsearch 搜尋的過程?

7、Elasticsearch 在部署時,對 Linux 的設定有哪些最佳化方法

8、lucence 內部結構是什麼?

9、Elasticsearch 是如何實現 Master 選舉的?

10、Elasticsearch 中的節點(比如共 20 個),其中的 10 個選了一個master,另外 10 個選了另一個 master,怎麼辦?

11、客戶端在和叢集連線時,如何選擇特定的節點執行請求的?

12、詳細描述一下 Elasticsearch 索引文件的過程。

2019年常見ElasticSearch面試題答案詳細解析

1、elasticsearch 瞭解多少,說說你們公司 es 的叢集架構,索引資料大小,分片有多少,以及一些調優手段 。

面試官:想了解應聘者之前公司接觸的 ES 使用場景、規模,有沒有做過比較大規模的索引設計、規劃、調優。

解答:如實結合自己的實踐場景回答即可。

比如:ES 叢集架構 13 個節點,索引根據通道不同共 20+索引,根據日期,每日遞增 20+,索引:10 分片,每日遞增 1 億+資料,每個通道每天索引大小控制:150GB 之內。

僅索引層面調優手段:

1.1、設計階段調優

(1)根據業務增量需求,採取基於日期模板建立索引,透過 roll over API 滾動索引;

(2)使用別名進行索引管理;

(3)每天凌晨定時對索引做 force_merge 操作,以釋放空間;

(4)採取冷熱分離機制,熱資料儲存到 SSD,提高檢索效率;冷資料定期進行 shrink操作,以縮減儲存;

(5)採取 curator 進行索引的生命週期管理;

(6)僅針對需要分詞的欄位,合理的設定分詞器;

(7)Mapping 階段充分結合各個欄位的屬性,是否需要檢索、是否需要儲存等。……。。

1.2、寫入調優

(1)寫入前副本數設定為 0;

(2)寫入前關閉 refresh_interval 設定為-1,禁用重新整理機制;

(3)寫入過程中:採取 bulk 批次寫入;

(4)寫入後恢復副本數和重新整理間隔;

(5)儘量使用自動生成的 id。

1.3、查詢調優

(1)禁用 wildcard;

(2)禁用批次 terms(成百上千的場景);

(3)充分利用倒排索引機制,能 keyword 型別儘量 keyword;

(4)資料量大時候,可以先基於時間敲定索引再檢索;

(5)設定合理的路由機制。

1.4、其他調優

部署調優,業務調優等。

上面的提及一部分,面試者就基本對你之前的實踐或者運維經驗有所評估了。

2、elasticsearch 的倒排索引是什麼

面試官:想了解你對基礎概念的認知。

解答:通俗解釋一下就可以。

傳統的我們的檢索是透過文章,逐個遍歷找到對應關鍵詞的位置。

而倒排索引,是透過分詞策略,形成了詞和文章的對映關係表,這種詞典+對映表即為倒排索引。有了倒排索引,就能實現 o(1)時間複雜度的效率檢索文章了,極大的提高了檢索效率。

2019年常見ElasticSearch面試題答案詳細解析

學術的解答方式:

倒排索引,相反於一篇文章包含了哪些詞,它從詞出發,記載了這個詞在哪些文件中出現過,由兩部分組成——詞典和倒排表。

加分項:倒排索引的底層實現是基於:FST(Finite State Transducer)資料結構。

lucene 從 4+版本後開始大量使用的資料結構是 FST。FST 有兩個優點:

(1)空間佔用小。透過對詞典中單詞字首和字尾的重複利用,壓縮了儲存空間;

(2)查詢速度快。O(len(str))的查詢時間複雜度。

3、elasticsearch 索引資料多了怎麼辦,如何調優,部署

面試官:想了解大資料量的運維能力。

解答:索引資料的規劃,應在前期做好規劃,正所謂“設計先行,編碼在後”,這樣才能有效的避免突如其來的資料激增導致叢集處理能力不足引發的線上客戶檢索或者其他業務受到影響。

如何調優,正如問題 1 所說,這裡細化一下:

3.1 動態索引層面

基於模板+時間+rollover api 滾動建立索引,舉例:設計階段定義:blog 索引的模板格式為:blog_index_時間戳的形式,每天遞增資料。這樣做的好處:不至於資料量激增導致單個索引資料量非常大,接近於上線 2 的32 次冪-1,索引儲存達到了 TB+甚至更大。

一旦單個索引很大,儲存等各種風險也隨之而來,所以要提前考慮+及早避免。

3.2 儲存層面

冷熱資料分離儲存,熱資料(比如最近 3 天或者一週的資料),其餘為冷資料。

對於冷資料不會再寫入新資料,可以考慮定期 force_merge 加 shrink 壓縮操作,節省儲存空間和檢索效率。

3.3 部署層面

一旦之前沒有規劃,這裡就屬於應急策略。

結合 ES 自身的支援動態擴充套件的特點,動態新增機器的方式可以緩解叢集壓力,注意:如果之前主節點等規劃合理,不需要重啟叢集也能完成動態新增的。

4、elasticsearch 是如何實現 master 選舉的

面試官:想了解 ES 叢集的底層原理,不再只關注業務層面了。

解答:

前置前提:

(1)只有候選主節點(master:true)的節點才能成為主節點。

(2)最小主節點數(min_master_nodes)的目的是防止腦裂。

核對了一下程式碼,核心入口為 findMaster,選擇主節點成功返回對應 Master,否則返回 null。選舉流程大致描述如下:

第一步:確認候選主節點數達標,elasticsearch。yml 設定的值

discovery。zen。minimum_master_nodes;

第二步:比較:先判定是否具備 master 資格,具備候選主節點資格的優先返回;

若兩節點都為候選主節點,則 id 小的值會主節點。注意這裡的 id 為 string 型別。

題外話:獲取節點 id 的方法。

1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name

2ip port heapPercent heapMax id name

5、詳細描述一下 Elasticsearch 索引文件的過程

面試官:想了解 ES 的底層原理,不再只關注業務層面了。

解答:

這裡的索引文件應該理解為文件寫入 ES,建立索引的過程。

文件寫入包含:單文件寫入和批次 bulk 寫入,這裡只解釋一下:單文件寫入流程。

記住官方文件中的這個圖。

2019年常見ElasticSearch面試題答案詳細解析

第一步:客戶寫叢集某節點寫入資料,傳送請求。(如果沒有指定路由/協調節點,請求的節點扮演路由節點的角色。)

第二步:節點 1 接受到請求後,使用文件_id 來確定文件屬於分片 0。請求會被轉到另外的節點,假定節點 3。因此分片 0 的主分片分配到節點 3 上。

第三步:節點 3 在主分片上執行寫操作,如果成功,則將請求並行轉發到節點 1和節點 2 的副本分片上,等待結果返回。所有的副本分片都報告成功,節點 3 將向協調節點(節點 1)報告成功,節點 1 向請求客戶端報告寫入成功。

如果面試官再問:第二步中的文件獲取分片的過程?

回答:藉助路由演算法獲取,路由演算法就是根據路由和文件 id 計算目標的分片 id 的過程。

1shard = hash(_routing) % (num_of_primary_shards)

6、詳細描述一下 Elasticsearch 搜尋的過程?

面試官:想了解 ES 搜尋的底層原理,不再只關注業務層面了。

解答:

搜尋拆解為“query then fetch” 兩個階段。

query 階段的目的:定位到位置,但不取。

步驟拆解如下:

(1)假設一個索引資料有 5 主+1 副本 共 10 分片,一次請求會命中(主或者副本分片中)的一個。

(2)每個分片在本地進行查詢,結果返回到本地有序的優先佇列中。

(3)第 2)步驟的結果傳送到協調節點,協調節點產生一個全域性的排序列表。

fetch 階段的目的:取資料。

路由節點獲取所有文件,返回給客戶端。

2019年常見ElasticSearch面試題答案詳細解析

7、Elasticsearch 在部署時,對 Linux 的設定有哪些最佳化方法

面試官:想了解對 ES 叢集的運維能力。

解答:

(1)關閉快取 swap;

(2)堆記憶體設定為:Min(節點記憶體/2, 32GB);

(3)設定最大檔案控制代碼數;

(4)執行緒池+佇列大小根據業務需要做調整;

(5)磁碟儲存 raid 方式——儲存有條件使用 RAID10,增加單節點效能以及避免單節點儲存故障。

8、lucence 內部結構是什麼?

面試官:想了解你的知識面的廣度和深度。

解答:

2019年常見ElasticSearch面試題答案詳細解析

Lucene 是有索引和搜尋的兩個過程,包含索引建立,索引,搜尋三個要點。可以基於這個脈絡展開一些。

9、Elasticsearch 是如何實現 Master 選舉的?

(1)Elasticsearch 的選主是 ZenDiscovery 模組負責的,主要包含 Ping(節點之間透過這個 RPC 來發現彼此)和 Unicast(單播模組包含一個主機列表以控制哪些節點需要 ping 通)這兩部分;

(2)對所有可以成為 master 的節點(node。master: true)根據 nodeId 字典排序,每次選舉每個節點都把自己所知道節點排一次序,然後選出第一個(第 0 位)節點,暫且認為它是 master 節點。

(3)如果對某個節點的投票數達到一定的值(可以成為 master 節點數 n/2+1)並且該節點自己也選舉自己,那這個節點就是 master。否則重新選舉一直到滿足上述條件。

(4)補充:master 節點的職責主要包括叢集、節點和索引的管理,不負責文件級別的管理;data 節點可以關閉 http 功能*。

10、Elasticsearch 中的節點(比如共 20 個),其中的 10 個

選了一個 master,另外 10 個選了另一個 master,怎麼辦?

(1)當叢集 master 候選數量不小於 3 個時,可以透過設定最少投票透過數量(discovery。zen。minimum_master_nodes)超過所有候選節點一半以上來解決腦裂問題;

(3)當候選數量為兩個時,只能修改為唯一的一個 master 候選,其他作為 data節點,避免腦裂問題。

11、客戶端在和叢集連線時,如何選擇特定的節點執行請求的?

TransportClient 利用 transport 模組遠端連線一個 elasticsearch 叢集。它並不加入到叢集中,只是簡單的獲得一個或者多個初始化的 transport 地址,並以 輪詢 的方式與這些地址進行通訊。

12、詳細描述一下 Elasticsearch 索引文件的過程。

協調節點預設使用文件 ID 參與計算(也支援透過 routing),以便為路由提供合適的分片。

shard = hash(document_id) % (num_of_primary_shards)

(1)當分片所在的節點接收到來自協調節點的請求後,會將請求寫入到 MemoryBuffer,然後定時(預設是每隔 1 秒)寫入到 Filesystem Cache,這個從 MomeryBuffer 到 Filesystem Cache 的過程就叫做 refresh;

(2)當然在某些情況下,存在 Momery Buffer 和 Filesystem Cache 的資料可能會丟失,ES 是透過 translog 的機制來保證資料的可靠性的。其實現機制是接收到請求後,同時也會寫入到 translog 中 ,當 Filesystem cache 中的資料寫入到磁碟中時,才會清除掉,這個過程叫做 flush;

(3)在 flush 過程中,記憶體中的緩衝將被清除,內容被寫入一個新段,段的 fsync將建立一個新的提交點,並將內容重新整理到磁碟,舊的 translog 將被刪除並開始一個新的 translog。

(4)flush 觸發的時機是定時觸發(預設 30 分鐘)或者 translog 變得太大(預設為 512M)時;

2019年常見ElasticSearch面試題答案詳細解析

補充:關於 Lucene 的 Segement:

(1)Lucene 索引是由多個段組成,段本身是一個功能齊全的倒排索引。

(2)段是不可變的,允許 Lucene 將新的文件增量地新增到索引中,而不用從頭重建索引。

(3)對於每一個搜尋請求而言,索引中的所有段都會被搜尋,並且每個段會消耗CPU 的時鐘周、檔案控制代碼和記憶體。這意味著段的數量越多,搜尋效能會越低。

(4)為了解決這個問題,Elasticsearch 會合並小段到一個較大的段,提交新的合併段到磁碟,並刪除那些舊的小段。

最後

歡迎大家一起交流,喜歡文章記得關注我點個贊喲,感謝支援!

Top