git上發現了網友總結的Elasticsearch BAT大廠面試題。只有題目,部分有答案,但不全。 正好抽出一些時間一塊兒梳理一下。html
既然是面試題,每一個人都會有本身的結合業務場景的答案,沒有很是標準的答案。 歡迎你們留言拍磚指正。node
面試官
:想了解應聘者以前公司接觸的ES使用場景、規模,有沒有作過比較大規模的索引設計、規劃、調優。 解答
: 如實結合本身的實踐場景回答便可。 好比:ES集羣架構13個節點,索引根據通道不一樣共20+索引,根據日期,每日遞增20+,索引:10分片,每日遞增1億+數據, 每一個通道天天索引大小控制:150GB以內。git
僅索引層面調優手段:github
部署調優,業務調優等。面試
上面的說起一部分,面試者就基本對你以前的實踐或者運維經驗有所評估了。算法
面試官
:想了解你對基礎概念的認知。 解答
:通俗解釋一下就能夠。api
傳統的咱們的檢索是經過文章,逐個遍歷找到對應關鍵詞的位置。 而倒排索引,是經過分詞策略,造成了詞和文章的映射關係表,這種詞典+映射表即爲倒排索引。 有了倒排索引,就能實現o(1)時間複雜度
的效率檢索文章了,極大的提升了檢索效率。 緩存
倒排索引,相反於一篇文章包含了哪些詞,它從詞出發,記載了這個詞在哪些文檔中出現過,由兩部分組成——詞典和倒排表。數據結構
加分項
:倒排索引的底層實現是基於:FST(Finite State Transducer)數據結構。 lucene從4+版本後開始大量使用的數據結構是FST。FST有兩個優勢:架構
面試官
:想了解大數據量的運維能力。 解答
:索引數據的規劃,應在前期作好規劃,正所謂「設計先行,編碼在後」,這樣纔能有效的避免突如其來的數據激增致使集羣處理能力不足引起的線上客戶檢索或者其餘業務受到影響。 如何調優,正如問題1所說,這裏細化一下:
基於模板+時間+rollover api滾動
建立索引,舉例:設計階段定義:blog索引的模板格式爲:blog_index_時間戳的形式,天天遞增數據。
這樣作的好處:不至於數據量激增致使單個索引數據量很是大,接近於上線2的32次冪-1,索引存儲達到了TB+甚至更大。
一旦單個索引很大,存儲等各類風險也隨之而來,因此要提早考慮+及早避免。
冷熱數據分離存儲
,熱數據(好比最近3天或者一週的數據),其他爲冷數據。 對於冷數據不會再寫入新數據,能夠考慮按期force_merge加shrink壓縮操做,節省存儲空間和檢索效率。
一旦以前沒有規劃,這裏就屬於應急策略。 結合ES自身的支持動態擴展的特色,動態新增機器的方式能夠緩解集羣壓力,注意:若是以前主節點等規劃合理
,不須要重啓集羣也能完成動態新增的。
面試官
:想了解ES集羣的底層原理,再也不只關注業務層面了。 解答
: 前置前提:
這個我看了各類網上分析的版本和源碼分析的書籍,雲裏霧裏。 覈對了一下代碼,核心入口爲findMaster,選擇主節點成功返回對應Master,不然返回null。選舉流程大體描述以下:
題外話:獲取節點id的方法。
GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name
ip port heapPercent heapMax id name
127.0.0.1 9300 39 1.9gb Hk9w Hk9wFwU
複製代碼
面試官
:想了解ES的底層原理,再也不只關注業務層面了。 解答
: 這裏的索引文檔應該理解爲文檔寫入ES,建立索引的過程。 文檔寫入包含:單文檔寫入和批量bulk寫入,這裏只解釋一下:單文檔寫入流程。
記住官方文檔中的這個圖。
路由節點
的角色。)
第二步:節點1接受到請求後,使用文檔_id來肯定文檔屬於分片0。請求會被轉到另外的節點,假定節點3。所以分片0的主分片分配到節點3上。
第三步:節點3在主分片上執行寫操做,若是成功,則將請求並行轉發到節點1和節點2的副本分片上,等待結果返回。全部的副本分片都報告成功,節點3將向協調節點(節點1)報告成功,節點1向請求客戶端報告寫入成功。
若是面試官再問:第二步中的文檔獲取分片的過程? 回答:藉助路由算法獲取,路由算法就是根據路由和文檔id計算目標的分片id的過程。
shard = hash(_routing) % (num_of_primary_shards)
複製代碼
面試官
:想了解ES搜索的底層原理,再也不只關注業務層面了。 解答
: 搜索拆解爲「query then fetch」 兩個階段。 query階段的目的:定位到位置,但不取。 步驟拆解以下:
fetch階段的目的:取數據。 路由節點獲取全部文檔,返回給客戶端。
面試官
:想了解對ES集羣的運維能力。 解答
:
面試官
:想了解你的知識面的廣度和深度。 解答
:
Lucene是有索引和搜索的兩個過程,包含索引建立,索引,搜索三個要點。能夠基於這個脈絡展開一些。
#小結 看到題目後,感受熟悉又陌生。真正要在面試的時候講出來,須要下一番功夫
深刻理解。 爲了求證回答的相對準確性
,我翻看了源碼、官方文檔和部分有深度的博文。 Elasticsearch路還很長,別無他法,惟有死磕!
題目來源: github.com/randian666/… www.cnblogs.com/luckcs/arti…
核心參考: 一、www.cnblogs.com/LBSer/p/411… 二、blog.csdn.net/njpjsoftdev… 三、elasticsearch.cn/book/elasti… 四、www.cnblogs.com/forfuture19… 五、《Elasticsearch源碼解析和優化實踐》