Elasticsearch原理與調優

2021-10-01 20:59:39 字數 3107 閱讀 4653

解答:

前置前提:

(1)只有候選主節點(master:true)的節點才能成為主節點。

(2)最小主節點數(min_master_nodes)的目的是防止腦裂。

核對了一下**,核心入口為 findmaster,選擇主節點成功返回對應 master,否則返回 null。選舉流程大致描述如下:

第一步:確認候選主節點數達標,elasticsearch.yml 設定的值

discovery.zen.minimum_master_nodes;

第二步:比較:先判定是否具備 master 資格,具備候選主節點資格的優先返回;

若兩節點都為候選主節點,則 id 小的值會主節點。注意這裡的 id 為 string 型別。

題外話:獲取節點 id 的方法。

解答:這裡的索引文件應該理解為文件寫入 es,建立索引的過程。

文件寫入包含:單文件寫入和批量 bulk 寫入,這裡只解釋一下:單文件寫入流程。

記住官方文件中的這個圖。

第一步:客戶寫集群某節點寫入資料,傳送請求。(如果沒有指定路由/協調節點,請求的節點扮演路由節點的角色。)

第二步:節點 1 接受到請求後,使用文件_id 來確定文件屬於分片 0。請求會被轉到另外的節點,假定節點 3。因此分片 0 的主分片分配到節點 3 上。

第三步:節點 3 在主分片上執行寫操作,如果成功,則將請求並行**到節點 1和節點 2 的副本分片上,等待結果返回。所有的副本分片都報告成功,節點 3 將向協調節點(節點 1)報告成功,節點 1 向請求客戶端報告寫入成功。

如果面試官再問:第二步中的文件獲取分片的過程?

回答:借助路由演算法獲取,路由演算法就是根據路由和文件 id 計算目標的分片 id 的過程。

shard=hash(_routing)%(num_of_primary_shards)
解答:

搜尋拆解為「query then fetch」 兩個階段。

query 階段的目的:定位到位置,但不取。

步驟拆解如下:

(1)假設乙個索引資料有 5 主+1 副本 共 10 分片,一次請求會命中(主或者副本分片中)的乙個。

(2)每個分片在本地進行查詢,結果返回到本地有序的優先佇列中。

(3)第 2)步驟的結果傳送到協調節點,協調節點產生乙個全域性的排序列表。

fetch 階段的目的:取資料。

路由節點獲取所有文件,返回給客戶端。

解答:(1)關閉快取 swap;

(2)堆記憶體設定為:min(節點記憶體/2, 32gb);

(3)設定最大檔案控制代碼數;

(4)執行緒池+佇列大小根據業務需要做調整;

(5)磁碟儲存 raid 方式——儲存有條件使用 raid10,增加單節點效能以及避免單節點儲存故障。

(1)elasticsearch 的選主是 zendiscovery 模組負責的,主要包含 ping(節點之間通過這個 rpc 來發現彼此)和 unicast(單播模組包含乙個主機列表以控制哪些節點需要 ping 通)這兩部分;

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

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

(4)補充:master 節點的職責主要包括集群、節點和索引的管理,不負責文件級別的管理;data 節點可以關閉 http 功能。

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

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

transportclient 利用 transport 模組遠端連線乙個 elasticsearch 集群。它並不加入到集群中,只是簡單的獲得乙個或者多個初始化的 transport 位址,並以 輪詢 的方式與這些位址進行通訊。

協調節點預設使用文件 id 參與計算(也支援通過 routing),以便為路由提供合適的分片。

shard=hash(document_id)%(num_of_primary_shards)
(1)當分片所在的節點接收到來自協調節點的請求後,會將請求寫入到 memorybuffer,然後定時(預設是每隔 1 秒)寫入到 filesystem cache,這個從 momerybuffer 到 filesystem cache 的過程就叫做 refresh;

(2)當然在某些情況下,存在 momery buffer 和 filesystem cache 的資料可能會丟失,es 是通過 translog 的機制來保證資料的可靠性的。其實現機制是接收到請求後,同時也會寫入到 translog 中 ,當 filesystem cache 中的資料寫入到磁碟中時,才會清除掉,這個過程叫做 flush;

(3)在 flush 過程中,記憶體中的緩衝將被清除,內容被寫入乙個新段,段的 fsync將建立乙個新的提交點,並將內容重新整理到磁碟,舊的 translog 將被刪除並開始乙個新的 translog。

(4)flush 觸發的時機是定時觸發(預設 30 分鐘)或者 translog 變得太大(預設為 512m)時;

補充:關於 lucene 的 segement:

(1)lucene 索引是由多個段組成,段本身是乙個功能齊全的倒排索引。

(2)段是不可變的,允許 lucene 將新的文件增量地新增到索引中,而不用從頭重建索引。

(3)對於每乙個搜尋請求而言,索引中的所有段都會被搜尋,並且每個段會消耗cpu 的時鐘周、檔案控制代碼和記憶體。這意味著段的數量越多,搜尋效能會越低。

(4)為了解決這個問題,elasticsearch 會合併小段到乙個較大的段,提交新的合併段到磁碟,並刪除那些舊的小段。

Elasticsearch 架構原理

elasticsearch的一些架構設計,對我們做效能調優 故障處理,具有非常重要的影響。下面將從elasticsearch的準實時索引的實現 自動發現 rounting和replica的讀寫過程,shard的allocate控制 在傳統的資料庫中,乙個欄位存乙個值,但是這對於全文搜尋是不足的。想要...

Elasticsearch 架構原理

elasticsearch的一些架構設計,對我們做效能調優 故障處理,具有非常重要的影響。下面將從elasticsearch的準實時索引的實現 自動發現 rounting和replica的讀寫過程,shard的allocate控制 在傳統的資料庫中,乙個欄位存乙個值,但是這對於全文搜尋是不足的。想要...

elasticsearch原理分析

集群內部原理 1 主節點 master node 主節點負責集群層面的相關操作,管理集群變更。通過配置 node.master true 預設 使節點具有被選舉為 master 的資格。主節點是全域性唯一的,將從有資格成為master的節點中進行選舉。2 資料節點 data node 負責儲存資料 ...