Java最新突擊面試筆記總結—ElasticSearch面試內容

搜索引擎面試題

題目和解答來自於中華石杉和本身整理總結而得,但願可以有所幫助。 搜索引擎主要考察ElasticSearch 以及對應底層的Lucene技術。 主要面試題集中於:node

  1. es分佈式架構原理
  2. es的插入與查詢
  3. es在數據量很大的狀況下如何提升性能
  4. es在生產集羣的部署架構是什麼,每一個索引有多大的數據量,每一個索引有多少分片

1. es分佈式架構原理

首先須要明白es是如何存儲數據的,es把對應的數據轉換爲index。基於倒排索引的方式,每一個index上存儲了多個type類型,每一個type對應一個document。而一個index會被分紅多個shard(默認是5個)。 在分佈式部署時,每一個shard會被複制,即一個shard有primary和replica 每一個es進程存儲的是不一樣shard的primary和replica。es集羣多個節點,會自動選舉一個節點爲master節點,這個master節點其實就是幹一些管理的工做的,好比維護索引元數據拉,負責切換primary shard和replica shard身份拉,之類的。 3cWgYV.png面試

2. es的數據寫入與讀取

2.1 es數據的寫入

2.1.1 es數據的寫入過程

注意,客戶端是能夠在任意節點進行寫入數據的,與Kakfa不一樣。 1)客戶端選擇一個node發送請求過去,這個node就是coordinating node(協調節點) 2)coordinating node,對document進行路由獲得對應應該存儲到哪一個shard,將請求轉發給對應的node(有primary shard) 3)實際的node上的primary shard處理請求,而後將數據同步到replica node 4)coordinating node,若是發現primary node和全部replica node都搞定以後,就返回響應結果給客戶端 3cWXlD.png架構

2.1.2 es數據的寫入原理

es數據寫入原理主要能夠分爲4個操做:負載均衡

  1. refresh
  2. commit
  3. flush
  4. merge
操做觸發條件 操做過程
refresh 1. 每隔1s進行一次refresh操做<br/>2. buffer已滿,則進行一次refresh操做 1. buffer將數據寫入segment file<br>2. 清空buffer
commit 1. 每隔30分鐘執行一次translog<br/>2. translog日誌已滿 1. 會主動進行一次refresh操做,把buffer中的數據寫入到segment file<br>2. 生成一個 commit point 文件標識這次操做一件把buffer數據執行到了哪個segment文件<br/>3. 執行flush操做
flush commit操做中 1. 把file system上的文件所有強制fsync(持久化)到磁盤<br/>2. 清空translog文件<br/>3. 生成一個新的translog文件
merge 後臺檢查 1. 將多個segment文件合併爲一個文件,並把.del文件刪除<br/>2. commit log 更新標識目前的segment<br/>3. 打開segmentfile 到file cache 以供快速搜索<br/>4. 刪除舊的segment file

3chLse.png

2.2 es數據的讀取

2.2.1 讀取數據

使用RestFul API向對應的node發送查詢請求,根據did來判斷在哪一個shard上,返回的是primary和replica的node節點集合 這樣會負載均衡地把查詢發送到對應節點,以後對應節點接收到請求,將document數據返回協調節點,協調節點把document返回給客戶端 3cI6RP.png分佈式

2.2.2 全文檢索

(1) 客戶端使用RestFul API向對應的node發送查詢請求
(2)協調節點將請求轉發到全部節點(primary或者replica)全部節點將對應的數據查詢以後返回對應的doc id 返回給協調節點
(3)協調節點將doc進行排序聚合
(4) 協調節點再根據doc id 把查詢請求發送到對應shard的node,返回document性能

3 es在數據量很大的狀況下如何提升性能

3.1 filesystem

es每次走fileSystem cache查詢速度是最快的 因此將每一個查詢的數據50% 容量 = fileSystem cache 容量。搜索引擎

3.2 數據預熱

數據預熱是指,每隔一段時間,將熱數據 手動在後臺查詢一遍,將熱數據刷新到fileSystem cache上設計

3.3 冷熱分離

相似於MySQL的分表分庫 將熱數據單獨創建一個索引 分配3臺機器只保持熱機器的索引 另外的機器保持冷數據的索引,但有一個問題,就是事先必須知道哪些是熱數據 哪些是冷數據日誌

3.4. document設計

在使用es時 避免使用複雜的查詢語句(Join 、聚合),就是在創建索引時, 就根據查詢語句創建好對應的元數據。blog

3.5 實際設計

採用elasticSearch + Hbase的架構方式。es中只存放少許關鍵數據創建索引,經過es查詢到doc id 再去Hbase中查詢完整的數據信息。

4 es在生產集羣的部署架構是什麼,每一個索引有多大的數據量,每一個索引有多少分片

生產環境部署狀況 (1)es生產集羣咱們部署了5臺機器,每臺機器是6核64G的,集羣總內存是320G
(2)咱們es集羣的日增量數據大概是2000萬條,天天日增量數據大概是500MB, 每個月增量數據大概是6億,15G。目前系統已經運行了幾個月,如今es集羣裏數據總量大概是100G左右。
(3)目前線上有5個索引(這個結合大家本身業務來,看看本身有哪些數據能夠放es的), 每一個索引的數據量大概是20G,因此這個數據量以內,咱們每一個索引分配的是8個shard,比默認的5個shard多了3個shard。

更多原創內容歡迎關注: 公衆號:木對林三的成長 v❤:lh18708107810

相關文章
相關標籤/搜索