1.為什么要使用Elasticsearch?
? 當我們在商城中使用搜索功能時弟胀,隨著后期項目數(shù)據(jù)量的不斷增大,如果我們繼續(xù)使用以前數(shù)據(jù)庫模糊查詢的方式去查詢數(shù)據(jù)业筏,在百萬數(shù)據(jù)量的情況下到旦,效率非常低下;而Es是一種支持全文檢索的框架舶斧,特點是可以實時存儲和實時分析搜索引擎,并且當我們數(shù)據(jù)量很大的時候可以集群察皇,所以我們使用搜索功能時茴厉,可以把商品常用的名稱,價格什荣,描述矾缓,id等信息存儲到索引庫中,查詢的時候可以提高查詢速度稻爬。
2.elasticsearch 了解多少嗜闻,說說你們公司 es 的集群架構,索引數(shù)據(jù)大小因篇,分片有多少,以及一些調(diào)優(yōu)手段
?es 生產(chǎn)集群我們部署了 2臺機器笔横,每臺機器是 6 核 64G 的竞滓,集群總內(nèi)存是 128G。
我們 es 集群的日增量數(shù)據(jù)大概是 1000 萬條吹缔,每天日增量數(shù)據(jù)大概是 200MB商佑,每月增量數(shù)據(jù)大概是 3 億,8G厢塘。
目前線上有 5個索引茶没,每個索引的數(shù)據(jù)量大概是 10G肌幽,所以這個數(shù)據(jù)量之內(nèi),我們每個索引使用的是默認的5個shard(分片)抓半。
調(diào)優(yōu)手段一般是從三個方面去考慮的:
1.在設計階段的時候 使用別名進行索引管理喂急,每天凌晨定時對索引進行force_merge操作,針對合理的字段設置分詞器
2.在寫入的前笛求,副本數(shù)設置為0并且禁用刷新機制廊移,寫入過程中,采用bulk批量寫入;寫入后恢復副本數(shù)和刷新間隔探入。
3狡孔,在查詢的時候利用倒排索引機制,盡量使用keyword類型蜂嗽。
3苗膝、elasticsearch 的倒排索引是什么
我們傳統(tǒng)的檢索方式是通過遍歷整篇文章,逐個比對找到對應的關鍵詞位置植旧,而倒排索引是通過分詞策略辱揭,形成詞和文章的關系映射表,這種詞典+映射表的方式就是倒排索引隆嗅,有點類似于我們以前使用的新華字典界阁。倒排索引可極大的提高查詢效率。
4.elasticsearch 索引數(shù)據(jù)多了怎么辦胖喳,如何調(diào)優(yōu)泡躯,部署
1.在設計的時候可以基于模板+時間滾動方式創(chuàng)建索引,每天遞增數(shù)據(jù)丽焊,避免單個索引很大的情況出現(xiàn)较剃。
2.在存儲的時候,冷熱數(shù)據(jù)分開存儲,比如最近3天的數(shù)據(jù)作為熱數(shù)據(jù)技健,其他的作為冷數(shù)據(jù)写穴,冷數(shù)據(jù)的話,由于不會再寫入新數(shù)據(jù)了雌贱,可以考慮定期force_merge(強制合并)和shrink(壓縮)的方式進行處理啊送,節(jié)約空間和檢索效率
3.由于es支持動態(tài)擴展,所有可以多加幾臺機器來緩解集群壓力欣孤。
5.elasticsearch 是如何實現(xiàn) master 選舉的
前置條件:
(1)只有候選主節(jié)點(master:true)的節(jié)點才能成為主節(jié)點馋没。
(2)最小主節(jié)點數(shù)(min_master_nodes)的目的是防止腦裂。
實現(xiàn)步驟
第一步:確認候選主節(jié)點數(shù)達標降传,就是我們在Es.yml 設置的值
第二步:比較:先判定是否具備 master 資格篷朵,具備候選主節(jié)點資格的優(yōu)先返回;
若兩節(jié)點都為候選主節(jié)點,則 id 小的值會主節(jié)點声旺。注意這里的 id 為 string 類型笔链。
補充:master 節(jié)點的職責主要包括集群、節(jié)點和索引的管理腮猖,不負責文檔級
別的管理鉴扫;data 節(jié)點可以關閉 http 功能。
6.詳細描述一下 Elasticsearch 索引文檔的過程
這里的索引文檔應該理解為文檔寫入 ES缚够,創(chuàng)建索引的過程
第一步:客戶從集群某節(jié)點寫入數(shù)據(jù)幔妨,發(fā)送請求。(如果沒有指定路由/協(xié)調(diào)節(jié)點谍椅,
請求的節(jié)點扮演路由節(jié)點的角色误堡。)
第二步:節(jié)點 1 接受到請求后,使用文檔_id 來確定文檔屬于分片 0雏吭。而分片0屬于節(jié)點3锁施,請求會被轉到節(jié)點 3。分片 0 的主分片也分配到節(jié)點 3 上杖们;
第三步:節(jié)點 3 在主分片上執(zhí)行寫操作悉抵,成功后將請求并行轉發(fā)到節(jié)點1和節(jié)點 2 的副本分片上。所有的副本分片都報告成功摘完,節(jié)點3將向協(xié)調(diào)節(jié)點(節(jié)點 1)報告成功姥饰,節(jié)點 1 向請求客戶端報告寫入成功。
如果面試官再問:第二步中的文檔獲取分片的過程孝治?
回答:借助路由算法獲取列粪,路由算法就是根據(jù)路由和文檔 id 計算目標的分片id
7、Elasticsearch 在部署時谈飒,對 Linux 的設置有哪些優(yōu)化方法
1岂座、關閉緩存 swap;
2、堆內(nèi)存設置為:Min(節(jié).點內(nèi)存/2, 32GB);
3杭措、設置最大文件句柄數(shù)费什;
8、lucence 內(nèi)部結構是什么(待補充)
lucence?的核心分為:索引創(chuàng)建手素,索引搜索鸳址;
9、Elasticsearch 中的節(jié)點(比如共 20 個)泉懦,其中的 10 個選了一個 master稿黍,另外 10 個選了另一個 master,怎么辦祠斧?
這個主要是會涉及到腦裂的問題闻察。
1拱礁、當集群 master 候選數(shù)量大于等于 3 個時琢锋,可以通過設置最少投票通過數(shù)量
(discovery.zen.minimum_master_nodes)超過所有候選節(jié)點一半以上來解
決腦裂問題辕漂;
2、當候選數(shù)量為兩個時吴超,只能修改其中一個為master 候選钉嘹,其他作為 data
節(jié)點,避免腦裂問題
10鲸阻、客戶端在和ES集群連接時跋涣,如何選擇特定的節(jié)點執(zhí)行請求的?
客戶端是通過transport 模塊遠程連接一個 elasticsearch 集群鸟悴。它并不加入到集群中陈辱,只是簡單的獲得一個或者多個初始化的 transport 地址,并以 輪詢 的方式與這些地址進行通信细诸。
11.詳細描述一下 Elasticsearch 更新和刪除文檔的過程
刪除和更新也都是寫操作沛贪,但是 Elasticsearch 中的文檔是不可變的,因此不能被刪除或者改動震贵。我們在執(zhí)行刪除的時候利赋,其實不是真正的刪除了這個文檔,因為磁盤上每一個段都有一個.del文件猩系,刪除的時候會把文檔 在.del文件標記為已刪除媚送,但是在匹配查詢的時候依舊能匹配到,只是會在結果中把它過濾掉寇甸。更新也是一樣的塘偎,也會把舊的文檔在.del文件中標記為已刪除,但是查詢結果中也是能查到幽纷,只是在結果中會把標記了已刪除的文件過濾掉式塌。
12.詳細描述一下 Elasticsearch 搜索的過程
在搜索的時候,因為我們不知道對應的查詢會在哪些文檔里命中友浸,所以我們查詢索引中所有的分片峰尝。由于數(shù)據(jù)在每個分片中的排列并不等于在整個索引中的排列,因此有了如下兩個階段:查詢階段和取回階段(query then fetch)收恢,客戶端發(fā)送請求到某一個節(jié)點武学,這個節(jié)點會根據(jù)文檔id去匹配所有相應的分片并給每一個分片發(fā)送請求,接著會進行取回操作伦意,所有分片查詢完后把結果返回到這個節(jié)點進行整理火窒,最后返回給客戶端查詢結果。
參考文檔:http://www.reibang.com/p/7ce8891d6972
13.在 Elasticsearch 中驮肉,是怎么根據(jù)一個詞找到對應的倒排索引的熏矿?
首先我們應該了解一下什么是倒排索引,倒排索引就是通過分詞策略把分詞和文章形成一個關系映射表,這種詞典和映射表的方式就是我們的倒排索引票编,所以當我們?nèi)z索一個詞語的時候褪储,會根據(jù)文檔id去整個索引庫中去查詢到匹配的索引,然后返回給客戶端慧域。
14鲤竹、對于 GC 方面,在使用 Elasticsearch 時要注意什么昔榴?
了解了JVM后再來~
15.Elasticsearch 對于大數(shù)據(jù)量(上億量級)的聚合如何實現(xiàn)辛藻?
Elasticsearch 提供的首個近似聚合是 cardinality 度量。它提供一個字段的基數(shù)互订,即該字段的 distinct 或者 unique 值的數(shù)目吱肌。它是基于HLL算法的。HLL 會先對我們的輸入作哈希運算仰禽,然后根據(jù)哈希運算的結果中的bits做概率估算從而得到基數(shù)岩榆。
16、在并發(fā)情況下坟瓢,Elasticsearch 如果保證讀寫一致勇边?
1、可以通過版本號使用樂觀并發(fā)控制折联,以確保新版本不會被舊版本覆蓋粒褒,由應用層來處理具體的沖突;
2诚镰、另外對于寫操作奕坟,一致性級別 默認是只有當大多數(shù)分片可用時才允許寫操作。如果因為網(wǎng)絡等原因導致寫入副本失敗清笨,這樣該副本被認為故障月杉,分片將會在一個不同的節(jié)點上重建。
3抠艾、對于讀操作苛萎,可以通過設置 replication 保證操作在主分片和副本分片都完成后才會返回;也可以通過設置搜索請求參數(shù)來查詢主分片检号,確保文檔是最新版本腌歉。