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ù)雜度的效率檢索文章了饰迹,極大的提高了檢索效率芳誓。
學(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 寫入终惑,這里只解釋一下:單文檔寫入流程。記住官方文檔中的這個圖门扇。
第一步:客戶寫集群某節(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)是什么?面試官:想了解你的知識面的廣度和深度狭握。解答:
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)時高帖;
補充:關(guān)于 Lucene 的 Segement:(1)Lucene 索引是由多個段組成缰儿,段本身是一個功能齊全的倒排索引。(2)段是不可變的散址,允許 Lucene 將新的文檔增量地添加到索引中乖阵,而不用從頭重建索引。(3)對于每一個搜索請求而言预麸,索引中的所有段都會被搜索瞪浸,并且每個段會消耗CPU 的時鐘周、文件句柄和內(nèi)存吏祸。這意味著段的數(shù)量越多对蒲,搜索性能會越低。(4)為了解決這個問題贡翘,Elasticsearch 會合并小段到一個較大的段蹈矮,提交新的合并段到磁盤,并刪除那些舊的小段鸣驱。