ElasticSearch面試題上

ElasticSearch是一個基于Lucene的搜索服務(wù)器秧耗。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口劳翰。Elasticsearch是用Java語言開發(fā)的盯拱,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎兔沃。ElasticSearch用于云計算中,能夠達到實時搜索级及,穩(wěn)定乒疏,可靠,快速饮焦,安裝使用方便怕吴。官方客戶端在Java、.NET(C#)县踢、PHP转绷、Python、Apache Groovy硼啤、Ruby和許多其他語言中都是可用的议经。根據(jù)DB-Engines的排名顯示,Elasticsearch是最受歡迎的企業(yè)搜索引擎,其次是Apache Solr煞肾,也是基于Lucene咧织。
Elasticsearch 面試題1、elasticsearch 了解多少籍救,說說你們公司 es 的集群架構(gòu)习绢,索引數(shù)據(jù)大小,分片有多少蝙昙,以及一些調(diào)優(yōu)手段 闪萄。2、elasticsearch 的倒排索引是什么3奇颠、elasticsearch 索引數(shù)據(jù)多了怎么辦桃煎,如何調(diào)優(yōu),部署4大刊、elasticsearch 是如何實現(xiàn) master 選舉的5为迈、詳細(xì)描述一下 Elasticsearch 索引文檔的過程6、詳細(xì)描述一下 Elasticsearch 搜索的過程缺菌?7葫辐、Elasticsearch 在部署時,對 Linux 的設(shè)置有哪些優(yōu)化方法8伴郁、lucence 內(nèi)部結(jié)構(gòu)是什么耿战?9、Elasticsearch 是如何實現(xiàn) Master 選舉的焊傅?10剂陡、Elasticsearch 中的節(jié)點(比如共 20 個),其中的 10 個選了一個master狐胎,另外 10 個選了另一個 master鸭栖,怎么辦?11握巢、客戶端在和集群連接時晕鹊,如何選擇特定的節(jié)點執(zhí)行請求的?12暴浦、詳細(xì)描述一下 Elasticsearch 索引文檔的過程溅话。
1、elasticsearch 了解多少歌焦,說說你們公司 es 的集群架構(gòu)飞几,索引數(shù)據(jù)大小,分片有多少独撇,以及一些調(diào)優(yōu)手段 屑墨。面試官:想了解應(yīng)聘者之前公司接觸的 ES 使用場景窟社、規(guī)模,有沒有做過比較大規(guī)模的索引設(shè)計绪钥、規(guī)劃、調(diào)優(yōu)关炼。解答:如實結(jié)合自己的實踐場景回答即可程腹。比如:ES 集群架構(gòu) 13 個節(jié)點,索引根據(jù)通道不同共 20+索引儒拂,根據(jù)日期寸潦,每日遞增 20+,索引:10 分片社痛,每日遞增 1 億+數(shù)據(jù)见转,每個通道每天索引大小控制:150GB 之內(nèi)。僅索引層面調(diào)優(yōu)手段:1.1蒜哀、設(shè)計階段調(diào)優(yōu)(1)根據(jù)業(yè)務(wù)增量需求斩箫,采取基于日期模板創(chuàng)建索引,通過 roll over API 滾動索引撵儿;(2)使用別名進行索引管理乘客;(3)每天凌晨定時對索引做 force_merge 操作,以釋放空間淀歇;(4)采取冷熱分離機制易核,熱數(shù)據(jù)存儲到 SSD,提高檢索效率浪默;冷數(shù)據(jù)定期進行 shrink操作牡直,以縮減存儲;(5)采取 curator 進行索引的生命周期管理纳决;(6)僅針對需要分詞的字段碰逸,合理的設(shè)置分詞器;(7)Mapping 階段充分結(jié)合各個字段的屬性阔加,是否需要檢索花竞、是否需要存儲等〉а疲……..1.2约急、寫入調(diào)優(yōu)(1)寫入前副本數(shù)設(shè)置為 0;(2)寫入前關(guān)閉 refresh_interval 設(shè)置為-1苗分,禁用刷新機制厌蔽;(3)寫入過程中:采取 bulk 批量寫入;(4)寫入后恢復(fù)副本數(shù)和刷新間隔摔癣;(5)盡量使用自動生成的 id奴饮。1.3纬向、查詢調(diào)優(yōu)(1)禁用 wildcard;(2)禁用批量 terms(成百上千的場景)戴卜;(3)充分利用倒排索引機制逾条,能 keyword 類型盡量 keyword;(4)數(shù)據(jù)量大時候投剥,可以先基于時間敲定索引再檢索师脂;(5)設(shè)置合理的路由機制。1.4江锨、其他調(diào)優(yōu)部署調(diào)優(yōu)吃警,業(yè)務(wù)調(diào)優(yōu)等。上面的提及一部分啄育,面試者就基本對你之前的實踐或者運維經(jīng)驗有所評估了酌心。2、elasticsearch 的倒排索引是什么面試官:想了解你對基礎(chǔ)概念的認(rèn)知挑豌。解答:通俗解釋一下就可以安券。傳統(tǒng)的我們的檢索是通過文章,逐個遍歷找到對應(yīng)關(guān)鍵詞的位置氓英。而倒排索引完疫,是通過分詞策略,形成了詞和文章的映射關(guān)系表债蓝,這種詞典+映射表即為倒排索引壳鹤。有了倒排索引,就能實現(xiàn) o(1)時間復(fù)雜度的效率檢索文章了饰迹,極大的提高了檢索效率芳誓。


image.png

學(xué)術(shù)的解答方式:倒排索引,相反于一篇文章包含了哪些詞啊鸭,它從詞出發(fā)锹淌,記載了這個詞在哪些文檔中出現(xiàn)過,由兩部分組成——詞典和倒排表赠制。加分項:倒排索引的底層實現(xiàn)是基于:FST(Finite State Transducer)數(shù)據(jù)結(jié)構(gòu)赂摆。lucene 從 4+版本后開始大量使用的數(shù)據(jù)結(jié)構(gòu)是 FST。FST 有兩個優(yōu)點:(1)空間占用小钟些。通過對詞典中單詞前綴和后綴的重復(fù)利用烟号,壓縮了存儲空間;(2)查詢速度快政恍。O(len(str))的查詢時間復(fù)雜度汪拥。3、elasticsearch 索引數(shù)據(jù)多了怎么辦篙耗,如何調(diào)優(yōu)迫筑,部署面試官:想了解大數(shù)據(jù)量的運維能力宪赶。解答:索引數(shù)據(jù)的規(guī)劃,應(yīng)在前期做好規(guī)劃脯燃,正所謂“設(shè)計先行搂妻,編碼在后”,這樣才能有效的避免突如其來的數(shù)據(jù)激增導(dǎo)致集群處理能力不足引發(fā)的線上客戶檢索或者其他業(yè)務(wù)受到影響辕棚。如何調(diào)優(yōu)欲主,正如問題 1 所說,這里細(xì)化一下:3.1 動態(tài)索引層面基于模板+時間+rollover api 滾動創(chuàng)建索引坟募,舉例:設(shè)計階段定義:blog 索引的模板格式為:blog_index_時間戳的形式,每天遞增數(shù)據(jù)邑狸。這樣做的好處:不至于數(shù)據(jù)量激增導(dǎo)致單個索引數(shù)據(jù)量非常大懈糯,接近于上線 2 的32 次冪-1,索引存儲達到了 TB+甚至更大单雾。一旦單個索引很大赚哗,存儲等各種風(fēng)險也隨之而來,所以要提前考慮+及早避免硅堆。3.2 存儲層面冷熱數(shù)據(jù)分離存儲屿储,熱數(shù)據(jù)(比如最近 3 天或者一周的數(shù)據(jù)),其余為冷數(shù)據(jù)渐逃。對于冷數(shù)據(jù)不會再寫入新數(shù)據(jù)够掠,可以考慮定期 force_merge 加 shrink 壓縮操作,節(jié)省存儲空間和檢索效率茄菊。3.3 部署層面一旦之前沒有規(guī)劃疯潭,這里就屬于應(yīng)急策略。結(jié)合 ES 自身的支持動態(tài)擴展的特點面殖,動態(tài)新增機器的方式可以緩解集群壓力竖哩,注意:如果之前主節(jié)點等規(guī)劃合理,不需要重啟集群也能完成動態(tài)新增的脊僚。4相叁、elasticsearch 是如何實現(xiàn) master 選舉的面試官:想了解 ES 集群的底層原理,不再只關(guān)注業(yè)務(wù)層面了辽幌。解答:前置前提:(1)只有候選主節(jié)點(master:true)的節(jié)點才能成為主節(jié)點增淹。(2)最小主節(jié)點數(shù)(min_master_nodes)的目的是防止腦裂。核對了一下代碼乌企,核心入口為 findMaster埠通,選擇主節(jié)點成功返回對應(yīng) Master,否則返回 null逛犹。選舉流程大致描述如下:第一步:確認(rèn)候選主節(jié)點數(shù)達標(biāo)端辱,elasticsearch.yml 設(shè)置的值discovery.zen.minimum_master_nodes梁剔;第二步:比較:先判定是否具備 master 資格,具備候選主節(jié)點資格的優(yōu)先返回舞蔽;若兩節(jié)點都為候選主節(jié)點荣病,則 id 小的值會主節(jié)點。注意這里的 id 為 string 類型渗柿。題外話:獲取節(jié)點 id 的方法个盆。1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name

2ip port heapPercent heapMax id name復(fù)制代碼5、詳細(xì)描述一下 Elasticsearch 索引文檔的過程面試官:想了解 ES 的底層原理朵栖,不再只關(guān)注業(yè)務(wù)層面了颊亮。解答:這里的索引文檔應(yīng)該理解為文檔寫入 ES,創(chuàng)建索引的過程陨溅。文檔寫入包含:單文檔寫入和批量 bulk 寫入终惑,這里只解釋一下:單文檔寫入流程。記住官方文檔中的這個圖门扇。


image.png

第一步:客戶寫集群某節(jié)點寫入數(shù)據(jù)雹有,發(fā)送請求。(如果沒有指定路由/協(xié)調(diào)節(jié)點臼寄,請求的節(jié)點扮演路由節(jié)點的角色霸奕。)第二步:節(jié)點 1 接受到請求后,使用文檔_id 來確定文檔屬于分片 0吉拳。請求會被轉(zhuǎn)到另外的節(jié)點质帅,假定節(jié)點 3。因此分片 0 的主分片分配到節(jié)點 3 上留攒。第三步:節(jié)點 3 在主分片上執(zhí)行寫操作临梗,如果成功,則將請求并行轉(zhuǎn)發(fā)到節(jié)點 1和節(jié)點 2 的副本分片上稼跳,等待結(jié)果返回盟庞。所有的副本分片都報告成功,節(jié)點 3 將向協(xié)調(diào)節(jié)點(節(jié)點 1)報告成功汤善,節(jié)點 1 向請求客戶端報告寫入成功什猖。如果面試官再問:第二步中的文檔獲取分片的過程?回答:借助路由算法獲取红淡,路由算法就是根據(jù)路由和文檔 id 計算目標(biāo)的分片 id 的過程不狮。1shard = hash(_routing) % (num_of_primary_shards)復(fù)制代碼6、詳細(xì)描述一下 Elasticsearch 搜索的過程在旱?面試官:想了解 ES 搜索的底層原理摇零,不再只關(guān)注業(yè)務(wù)層面了。解答:搜索拆解為“query then fetch” 兩個階段桶蝎。query 階段的目的:定位到位置驻仅,但不取谅畅。步驟拆解如下:(1)假設(shè)一個索引數(shù)據(jù)有 5 主+1 副本 共 10 分片,一次請求會命中(主或者副本分片中)的一個噪服。(2)每個分片在本地進行查詢毡泻,結(jié)果返回到本地有序的優(yōu)先隊列中。(3)第 2)步驟的結(jié)果發(fā)送到協(xié)調(diào)節(jié)點粘优,協(xié)調(diào)節(jié)點產(chǎn)生一個全局的排序列表仇味。fetch 階段的目的:取數(shù)據(jù)。路由節(jié)點獲取所有文檔雹顺,返回給客戶端丹墨。
7、Elasticsearch 在部署時嬉愧,對 Linux 的設(shè)置有哪些優(yōu)化方法面試官:想了解對 ES 集群的運維能力贩挣。解答:(1)關(guān)閉緩存 swap;(2)堆內(nèi)存設(shè)置為:Min(節(jié)點內(nèi)存/2, 32GB);(3)設(shè)置最大文件句柄數(shù);(4)線程池+隊列大小根據(jù)業(yè)務(wù)需要做調(diào)整英染;(5)磁盤存儲 raid 方式——存儲有條件使用 RAID10揽惹,增加單節(jié)點性能以及避免單節(jié)點存儲故障被饿。8四康、lucence 內(nèi)部結(jié)構(gòu)是什么?面試官:想了解你的知識面的廣度和深度狭握。解答:


image.png

Lucene 是有索引和搜索的兩個過程闪金,包含索引創(chuàng)建,索引论颅,搜索三個要點哎垦。可以基于這個脈絡(luò)展開一些恃疯。9漏设、Elasticsearch 是如何實現(xiàn) Master 選舉的?(1)Elasticsearch 的選主是 ZenDiscovery 模塊負(fù)責(zé)的今妄,主要包含 Ping(節(jié)點之間通過這個 RPC 來發(fā)現(xiàn)彼此)和 Unicast(單播模塊包含一個主機列表以控制哪些節(jié)點需要 ping 通)這兩部分郑口;(2)對所有可以成為 master 的節(jié)點(node.master: true)根據(jù) nodeId 字典排序,每次選舉每個節(jié)點都把自己所知道節(jié)點排一次序盾鳞,然后選出第一個(第 0 位)節(jié)點犬性,暫且認(rèn)為它是 master 節(jié)點。(3)如果對某個節(jié)點的投票數(shù)達到一定的值(可以成為 master 節(jié)點數(shù) n/2+1)并且該節(jié)點自己也選舉自己腾仅,那這個節(jié)點就是 master乒裆。否則重新選舉一直到滿足上述條件。(4)補充:master 節(jié)點的職責(zé)主要包括集群推励、節(jié)點和索引的管理鹤耍,不負(fù)責(zé)文檔級別的管理肉迫;data 節(jié)點可以關(guān)閉 http 功能*。10惰蜜、Elasticsearch 中的節(jié)點(比如共 20 個)昂拂,其中的 10 個選了一個 master,另外 10 個選了另一個 master抛猖,怎么辦格侯?(1)當(dāng)集群 master 候選數(shù)量不小于 3 個時,可以通過設(shè)置最少投票通過數(shù)量(discovery.zen.minimum_master_nodes)超過所有候選節(jié)點一半以上來解決腦裂問題财著;(3)當(dāng)候選數(shù)量為兩個時联四,只能修改為唯一的一個 master 候選,其他作為 data節(jié)點撑教,避免腦裂問題朝墩。11、客戶端在和集群連接時伟姐,如何選擇特定的節(jié)點執(zhí)行請求的收苏?TransportClient 利用 transport 模塊遠程連接一個 elasticsearch 集群。它并不加入到集群中愤兵,只是簡單的獲得一個或者多個初始化的 transport 地址鹿霸,并以 輪詢 的方式與這些地址進行通信。12秆乳、詳細(xì)描述一下 Elasticsearch 索引文檔的過程懦鼠。協(xié)調(diào)節(jié)點默認(rèn)使用文檔 ID 參與計算(也支持通過 routing),以便為路由提供合適的分片屹堰。shard = hash(document_id) % (num_of_primary_shards)復(fù)制代碼(1)當(dāng)分片所在的節(jié)點接收到來自協(xié)調(diào)節(jié)點的請求后肛冶,會將請求寫入到 MemoryBuffer,然后定時(默認(rèn)是每隔 1 秒)寫入到 Filesystem Cache扯键,這個從 MomeryBuffer 到 Filesystem Cache 的過程就叫做 refresh睦袖;(2)當(dāng)然在某些情況下,存在 Momery Buffer 和 Filesystem Cache 的數(shù)據(jù)可能會丟失荣刑,ES 是通過 translog 的機制來保證數(shù)據(jù)的可靠性的馅笙。其實現(xiàn)機制是接收到請求后,同時也會寫入到 translog 中 嘶摊,當(dāng) Filesystem cache 中的數(shù)據(jù)寫入到磁盤中時延蟹,才會清除掉,這個過程叫做 flush叶堆;(3)在 flush 過程中阱飘,內(nèi)存中的緩沖將被清除,內(nèi)容被寫入一個新段,段的 fsync將創(chuàng)建一個新的提交點沥匈,并將內(nèi)容刷新到磁盤蔗喂,舊的 translog 將被刪除并開始一個新的 translog。(4)flush 觸發(fā)的時機是定時觸發(fā)(默認(rèn) 30 分鐘)或者 translog 變得太大(默認(rèn)為 512M)時高帖;
image.png

補充:關(guān)于 Lucene 的 Segement:(1)Lucene 索引是由多個段組成缰儿,段本身是一個功能齊全的倒排索引。(2)段是不可變的散址,允許 Lucene 將新的文檔增量地添加到索引中乖阵,而不用從頭重建索引。(3)對于每一個搜索請求而言预麸,索引中的所有段都會被搜索瞪浸,并且每個段會消耗CPU 的時鐘周、文件句柄和內(nèi)存吏祸。這意味著段的數(shù)量越多对蒲,搜索性能會越低。(4)為了解決這個問題贡翘,Elasticsearch 會合并小段到一個較大的段蹈矮,提交新的合并段到磁盤,并刪除那些舊的小段鸣驱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泛鸟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丐巫,更是在濱河造成了極大的恐慌谈况,老刑警劉巖勺美,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递胧,死亡現(xiàn)場離奇詭異,居然都是意外死亡赡茸,警方通過查閱死者的電腦和手機缎脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來占卧,“玉大人遗菠,你說我怎么就攤上這事』眩” “怎么了辙纬?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叭喜。 經(jīng)常有香客問我贺拣,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任譬涡,我火速辦了婚禮闪幽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涡匀。我一直安慰自己盯腌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布陨瘩。 她就那樣靜靜地躺著腕够,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舌劳。 梳的紋絲不亂的頭發(fā)上燕少,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音蒿囤,去河邊找鬼客们。 笑死,一個胖子當(dāng)著我的面吹牛材诽,可吹牛的內(nèi)容都是我干的底挫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脸侥,長吁一口氣:“原來是場噩夢啊……” “哼建邓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睁枕,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤官边,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后外遇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體注簿,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年跳仿,在試婚紗的時候發(fā)現(xiàn)自己被綠了诡渴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡菲语,死狀恐怖妄辩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情山上,我是刑警寧澤眼耀,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站佩憾,受9級特大地震影響锥咸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜父泳,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望把敢。 院中可真熱鬧,春花似錦谅辣、人聲如沸修赞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柏副。三九已至,卻和暖如春蚣录,著一層夾襖步出監(jiān)牢的瞬間割择,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工萎河, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荔泳,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓虐杯,卻偏偏與公主長得像玛歌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子擎椰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344