es彙總

https://blog.csdn.net/feifeidepop/article/details/83281050

 

es 集羣搭建 https://www.cnblogs.com/jstarseven/p/6803054.html

 

https://blog.csdn.net/airfish20000/article/details/77131280

 

https://www.jianshu.com/p/700bf669d951

 

1、es是如何實現master選舉的

 

(1)、elasticsearch的選主是ZenDiscovery模塊負責的,主要包含Ping(節點之間通過這個RPC來發現彼此)和Unicast(單播模塊包含一個主機列表以控制哪些節點需要ping通)

(2)、對所有可以成爲master的節點(node.master:true)根據nodeid字典排序,每次選舉每個節點都把自己所知道的節點排一次序,然後選出第一個(第0個)節點,暫且認爲它是master節點

(3)、如果對某個節點的投票數達到一定的值(一般認爲n/2+1)並且該節點自己也選舉自己,那這個節點就是master,否則重新選舉一直到滿足上述條件

補充:master節點的職責主要包含集羣、節點和索引的管理,不負責文檔級別的管理;data節點可以關閉http功能。

 

2、es中的節點(比如20個),其中10個選了一個節點作爲master,另外10個選了另一個節點作爲master

 

   (1) 、當集羣master候選數量不小於3時,可以通過設置最少投票通過數量(discovery.zen.minimum_master_nodes)超過所有候選節點一半以上來解決腦裂問題

 (2)、當候選數量爲兩個時,只能修改爲唯一的一個master候選,其他作爲data節點,避免腦裂問題

 

3、辨析es索引和lucence索引

 

es索引是組織數據的邏輯空間(好比數據庫),1個Elasticsearch的索引有1個或者多個分片(默認5個),分片對應實際存儲數據的Lucene的索引,分片自身就是一個搜索引擎,每個分片0或者多個副本。

es索引還包含“type”,用於邏輯上隔離索引中的數據。在es索引中,給定一個type,它的所有文檔會擁有相同的屬性,就像表的schema

Index == Database Types == Tables Properties == Schema

4、節點類型

 

(1)、主節點:控制es集羣,負責集羣中的操作,比如創建/刪除一個索引,跟蹤集羣中的節點,分配分片到節點。主節點處理集羣的狀態並廣播到其他節點,並接受其他節點的確認響應。

每個節點都可以通過設置node.master 爲true 成爲主節點

(2)、數據節點:持有數據和倒排索引。默認情況下,每個節點都可以通過設置node.data爲true成爲數據節點。如果使用一個專門的主節點,應該設置node.data爲false。

(3)、客戶端節點:node.master和node.data都設置爲false,那麼該節點就是一個客戶端節點,扮演一個負載均衡的角色,將到來的請求路由到集羣中的各個節點。

es 集羣中作爲客戶端接入的節點叫協調節點。協調節點會將客戶端請求路由到集羣合適的分片上。對於讀請求來說,協調節點每次會選擇不同的分片處理請求,以實現負載均衡。

 

5、存儲模型

 

es使用了Apache Lucene,後者是使用java開發的全文檢索工具庫,其內部使用的是被稱爲倒排索引的數據結構,其設計是爲全文檢索結果的低延遲提供服務。文檔是es的是數據單位,對文檔中的此項進行分詞,並創建區重詞項的有序列表,將詞項與其在文檔中出現的位置列表管理立案,便形成了倒排索引。

 

6、詳細描述一下es索引文檔的過程

 

這裏的索引文檔應該理解爲文檔寫入es,即創建索引的過程

 

文檔寫入包括單文檔寫入和bulk批量寫入,這裏只解釋單文檔寫入

 

注:

(1)、協調節點默認使用文檔ID參與計算(也支持通過routing),以便爲路由提供合適的分片

shard = hash(document_id) % (num_of_primary_shards)

(2)、當分片所在的節點接收到來自協調節點的請求後,會將請求寫入Memory Buffer,然後定時(默認每隔1秒)寫入到Filesystem Cache,這個從Memory Buffer到Filesystem Cache的過程叫做refresh

(3)、當然在某些情況下,存在Memory Buffer和Filesystem Cache數據可能會丟失,ES通過translog極致保證數據的可靠性。實現極致是接收到請求後,同時也會寫入translog中,當Filesystem Cache中數據寫入到磁盤中時,纔會清除掉,這個過程叫做flush。

(4)、在flush過程中,內存中的緩存將被請出,內容被寫入一個新段,段的fsync將創建一個新的提交點,並將內容刷新到磁盤,舊的translog將被刪除並開始一個新的translog

flush出發的時機是定時觸發(默認30分鐘)或者translog變得太大(521M)時。

 

7、更新和刪除過程

 

磁盤上每個段都有一個相應的.del文件,當傷處請求發送後,文檔並沒有真正被刪除,而是在.del文件被標記爲刪除。該文檔依然能匹配查詢,但是會在結果中被過濾掉。當段合併時,在.del文件中被標記爲刪除的文檔將不會被寫入新段。

在新的文檔創建時,es會爲該文檔指定一個版本號。執行更新時,舊版的文檔在.del文件被標記會刪除。

 

 

8、搜索過程

 

兩階段過程 Query+Fetch

query

(1)、協調節點將查詢請求路由到索引的全部分片

(2)、每個分片獨立查詢(from+size),併爲查詢結果創建一個優先隊列,以相關性得分排序,全部分片都將匹配文檔的ID及其相關性得到返回給協調節點。

(3)、協調節點創建一個優先隊列並對所有結果進行全局排序

 

fetch

當協調節點在生成的全局有序的文檔列表中,爲全部結果排好序後,它將向包含原始文檔的分片發起請求。全部分片填充文檔信息並將其返回給協調節點。

 

 

9、倒排索引

 

通過分詞策略,形成詞和文章的映射關係表,這種詞和映射表即爲倒排索引

 

底層實現: FST 數據結構

1)空間佔用小 通過對詞典中單詞前綴和後綴重複利用,壓縮了存儲空間

2)查詢速度快 O(len(str))的查詢時間複雜度

 

原理示例

 

10、es部署時,對Linux的設置有哪些調優方法(考察對es的運維能力)

 

(1)、關閉緩存swap

(2)、堆內存設置爲min (節點內存/2, 32G)

(3)、設置最大文件句柄數

(4)、線程池+隊列大小根據業務需要做調整

(5)、磁盤存儲raid方式-----存儲有條件使用RAID10,增加單節點性能以及比秒單節點存儲故障

 

11、在併發情況下,es如何保證讀寫一致

1)、可以通過版本號使用樂觀併發控制,以確保新版本不會被舊版本覆蓋,由應用層來處理具體的衝突

2)、另外對於寫操作,一致性級別支持quonum/one/all,默認爲quonum,即只有當大多數分片可用時才允許寫操作。即使大多數可用,也可能存在因爲網絡等原因導致寫入副本失敗,這樣該副本被認爲故障,分片將會在一個不同的節點重建。

3)、對於讀操作,可以設置replication爲sync,這使得操作在主分片和副本分片都完成纔會返回。

 

 

12、es 瞭解多少,說說你們公司的es集羣架構,索引數據大小,分片有多少,以及一些調優手段。

 

es 集羣架構13個節點,索引根據通道不同共20+索引,根據日期,每日遞增20+,索引:10分片,每日遞增1億+數據。每個通道每天索引大小控制:150G左右

 

僅索引層次調優手段

一、設計階段調優

1)、根據業務增量需求,採取基於日期模板創建索引,通過roll_over API滾動索引

2)、使用別名進行索引管理

3)、每天凌晨定時對索引force_merge操作,以釋放空間

4)、採取冷熱分離機制,熱數據存儲到SSD,提高索引效率;冷數據頂起進行shrink操作,以縮減存儲。

5)、採用curator進行索引的生命週期管理;

6)、僅針對需要分詞的字段,合理設置分詞器。

 

二、寫入調優

1)、寫入前副本數設置爲0

2)、寫入前關閉refresh_interval設置爲-1,禁用刷新機制

3)、寫入過程,採用bulk批量寫入

4)、寫入後恢復副本數和刷新間隔

5)、儘量使用自動生成的id

 

三、查詢調優

1)、禁用wildcard --- 類似mysql like

2)、禁用批量terms(成百上千的場景)

3)、充分利用倒排索引機制,能keyword類型儘量keyword

4)、數據量大時候,可以先基於時間敲定索引再檢索。

5)、設置合理的路由機制

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章