1. 程式人生 > >ElasticSearch -- 理論學習

ElasticSearch -- 理論學習

- 介紹

    他的核心概念就是去中心化。對於ES叢集外部來說,Es叢集就是一個整體,和任何一個節點的通訊和對整個整體叢集的通訊代價是相等的。

    一個索引預設會有一個副本(replicas),5個分片(shards);

如圖:

- 節點

ES有3種節點,分別為主節點,資料節點和客戶端節點。

1. 主節點

以3臺機器為例,會自動選舉主節點,一旦主節點掛掉,另外2臺會有一臺升級為主節點。3臺叢集在掛掉任何一臺都可以繼續工作。主節點主要負責建立和刪除索引,跟蹤節點,對節點的發現和刪除。同時可以管理分片和副本的狀態。

2. 資料節點

主要是用來儲存資料的節點。主要對文件資料進行增刪查改以及聚合查詢操作。此節點由於是和資料打交道,一般會有很多Io操作,所以這些節點會耗大量的記憶體和cpu。

3. 客戶端節點

    即非主節點,也非資料節點。比如Transport Client, Node Client。他能處理路由請求,搜尋請求,分發索引等。實際上來說,他就是資料節點和主節點的橋樑,負責協調二者。

    遍歷方式:每次請求通過AtomicInteger進行原子加1(超過最大值後設置為0),按當前可用client數取模。

- 1. 節點客戶端(Node Client)

    節點客戶端是叢集中的節點,不是主節點也不是資料節點。但是由於他是叢集中節點的一部分,他可以輕鬆的探知整個節點的狀態,包括其他節點的位置,分片在節點上的分配,資料分配的位置等等。正因為他已經是叢集中的一部分,所以叢集中的其他節點都會嘗試和他建立Tcp連線。

    此時如果叢集十分龐大,或者有很多節點客戶端,這時候開銷就會非常大。因為他和其他節點聯絡密切,所以他一直具有最新的叢集狀態。當有請求進來,可以跳過網路跳轉,直接聯絡其他節點,減少整體工作量,並不會出現雙跳。

- 2. 傳輸客戶端(Transport Client)

    輕量級,不需要像節點客戶端一樣加入叢集,只作為叢集和應用之間的傳輸通訊。他只需要服務嗅探整個叢集,收集各個節點的資料,最後一期返回給客戶端。由於用java編寫,他是在JVM上執行(這裡涉及到GC,後續再談),速度很快,可以實現序列化,因此對Es例項的操作幾乎沒有開銷。後續在對叢集進行傳輸的時候,還會支援加密以及身份驗證。

    工作時他會遍歷所有可以連線的節點的client,但是很有可能這個節點本身是不可用的。比如正在修復資料、還未加入叢集等等。因此這裡會發生雙跳,當遍歷到node1,但是資料在node2,此時會先轉發到node1,再通過node1轉發到node2。

注意點:

由於節點客戶端和傳輸客戶端的差異,會出現當某一個節點掛掉的時候:對於傳輸客戶端來說,這個節點成功連線了,但是當使用client來發起請求的時候,就會出現異常;對於節點客戶端就不會有這樣的情況,由於他就是屬於叢集中的節點,對於這些壞掉的節點,會踢出這個叢集,所以對於這個掛掉的節點,節點客戶端是不可見的。

若有錯誤,懇請指正,萬分感謝!!!