搜索引擎面試題
題目和解答來自于中華石杉和自己整理總結(jié)而得堪置,希望能夠有所幫助。
搜索引擎主要考察ElasticSearch 以及對應(yīng)底層的Lucene技術(shù)宏胯。
主要面試題集中于:
- es分布式架構(gòu)原理
- es的插入與查詢
- es在數(shù)據(jù)量很大的情況下如何提高性能
- es在生產(chǎn)集群的部署架構(gòu)是什么供置,每個索引有多大的數(shù)據(jù)量进鸠,每個索引有多少分片
1. es分布式架構(gòu)原理
首先需要明白es是如何存儲數(shù)據(jù)的媳握,es把對應(yīng)的數(shù)據(jù)轉(zhuǎn)換為index碱屁。基于倒排索引的方式蛾找,每個index上存儲了多個type類型娩脾,每個type對應(yīng)一個document。而一個index會被分成多個shard(默認(rèn)是5個)打毛。
在分布式部署時柿赊,每個shard會被復(fù)制,即一個shard有primary和replica 每個es進(jìn)程存儲的是不同shard的primary和replica幻枉。es集群多個節(jié)點碰声,會自動選舉一個節(jié)點為master節(jié)點,這個master節(jié)點其實就是干一些管理的工作的熬甫,比如維護(hù)索引元數(shù)據(jù)拉胰挑,負(fù)責(zé)切換primary shard和replica shard身份拉,之類的椿肩。
2. es的數(shù)據(jù)寫入與讀取
2.1 es數(shù)據(jù)的寫入
2.1.1 es數(shù)據(jù)的寫入過程
注意瞻颂,客戶端是可以在任意節(jié)點進(jìn)行寫入數(shù)據(jù)的,與Kakfa不同郑象。
1)客戶端選擇一個node發(fā)送請求過去贡这,這個node就是coordinating node(協(xié)調(diào)節(jié)點)
2)coordinating node,對document進(jìn)行路由得到對應(yīng)應(yīng)該存儲到哪個shard厂榛,將請求轉(zhuǎn)發(fā)給對應(yīng)的node(有primary shard)
3)實際的node上的primary shard處理請求藕坯,然后將數(shù)據(jù)同步到replica node
4)coordinating node,如果發(fā)現(xiàn)primary node和所有replica node都搞定之后噪沙,就返回響應(yīng)結(jié)果給客戶端
2.1.2 es數(shù)據(jù)的寫入原理
es數(shù)據(jù)寫入原理主要可以分為4個操作:
- refresh
- commit
- flush
- merge
操作觸發(fā)條件 | 操作過程 | |
---|---|---|
refresh | 1. 每隔1s進(jìn)行一次refresh操作 2. buffer已滿,則進(jìn)行一次refresh操作 |
1. buffer將數(shù)據(jù)寫入segment file 2. 清空buffer |
commit | 1. 每隔30分鐘執(zhí)行一次translog 2. translog日志已滿 |
1. 會主動進(jìn)行一次refresh操作吐根,把buffer中的數(shù)據(jù)寫入到segment file 2. 生成一個 commit point 文件標(biāo)識此次操作一件把buffer數(shù)據(jù)執(zhí)行到了哪一個segment文件 3. 執(zhí)行flush操作 |
flush | commit操作中 | 1. 把file system上的文件全部強制fsync(持久化)到磁盤 2. 清空translog文件 3. 生成一個新的translog文件 |
merge | 后臺檢查 | 1. 將多個segment文件合并為一個文件正歼,并把.del文件刪除 2. commit log 更新標(biāo)識目前的segment 3. 打開segmentfile 到file cache 以供快速搜索 4. 刪除舊的segment file |
2.2 es數(shù)據(jù)的讀取
2.2.1 讀取數(shù)據(jù)
使用RestFul API向?qū)?yīng)的node發(fā)送查詢請求,根據(jù)did來判斷在哪個shard上拷橘,返回的是primary和replica的node節(jié)點集合
這樣會負(fù)載均衡地把查詢發(fā)送到對應(yīng)節(jié)點局义,之后對應(yīng)節(jié)點接收到請求,將document數(shù)據(jù)返回協(xié)調(diào)節(jié)點冗疮,協(xié)調(diào)節(jié)點把document返回給客戶端
2.2.2 全文檢索
(1) 客戶端使用RestFul API向?qū)?yīng)的node發(fā)送查詢請求
(2)協(xié)調(diào)節(jié)點將請求轉(zhuǎn)發(fā)到所有節(jié)點(primary或者replica)所有節(jié)點將對應(yīng)的數(shù)據(jù)查詢之后返回對應(yīng)的doc id 返回給協(xié)調(diào)節(jié)點
(3)協(xié)調(diào)節(jié)點將doc進(jìn)行排序聚合
(4) 協(xié)調(diào)節(jié)點再根據(jù)doc id 把查詢請求發(fā)送到對應(yīng)shard的node萄唇,返回document
3 es在數(shù)據(jù)量很大的情況下如何提高性能
3.1 filesystem
es每次走fileSystem cache查詢速度是最快的
所以將每個查詢的數(shù)據(jù)50% 容量
= fileSystem cache 容量。
3.2 數(shù)據(jù)預(yù)熱
數(shù)據(jù)預(yù)熱是指术幔,每隔一段時間另萤,將熱數(shù)據(jù)
手動在后臺查詢一遍,將熱數(shù)據(jù)刷新到fileSystem cache上
3.3 冷熱分離
類似于MySQL的分表分庫
將熱數(shù)據(jù)單獨建立一個索引 分配3臺機(jī)器只保持熱機(jī)器的索引
另外的機(jī)器保持冷數(shù)據(jù)的索引,但有一個問題四敞,就是事先必須知道哪些是熱數(shù)據(jù) 哪些是冷數(shù)據(jù)
3.4. document設(shè)計
在使用es時 避免使用復(fù)雜的查詢語句(Join 泛源、聚合),就是在建立索引時忿危,
就根據(jù)查詢語句建立好對應(yīng)的元數(shù)據(jù)达箍。
3.5 實際設(shè)計
采用elasticSearch + Hbase的架構(gòu)方式。es中只存放少量關(guān)鍵數(shù)據(jù)建立索引铺厨,通過es查詢到doc id 再去Hbase中查詢完整的數(shù)據(jù)信息缎玫。
4 es在生產(chǎn)集群的部署架構(gòu)是什么,每個索引有多大的數(shù)據(jù)量解滓,每個索引有多少分片
生產(chǎn)環(huán)境部署情況
(1)es生產(chǎn)集群我們部署了5臺機(jī)器赃磨,每臺機(jī)器是6核64G的,集群總內(nèi)存是320G
(2)我們es集群的日增量數(shù)據(jù)大概是2000萬條伐蒂,每天日增量數(shù)據(jù)大概是500MB煞躬,
每月增量數(shù)據(jù)大概是6億,15G逸邦。目前系統(tǒng)已經(jīng)運行了幾個月恩沛,現(xiàn)在es集群里數(shù)據(jù)總量大概是100G左右。
(3)目前線上有5個索引(這個結(jié)合你們自己業(yè)務(wù)來缕减,看看自己有哪些數(shù)據(jù)可以放es的)雷客,
每個索引的數(shù)據(jù)量大概是20G,所以這個數(shù)據(jù)量之內(nèi)桥狡,我們每個索引分配的是8個shard搅裙,比默認(rèn)的5個shard多了3個shard。
更多原創(chuàng)內(nèi)容歡迎關(guān)注:
公眾號:木對林三的成長
v?:lh18708107810