- 介紹java
他的核心概念就是去中心化。對於ES集羣外部來講,Es集羣就是一個總體,和任何一個節點的通訊和對整個總體集羣的通訊代價是相等的。node
一個索引默認會有一個副本(replicas),5個分片(shards);網絡
如圖:加密
- 節點blog
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來發起請求的時候,就會出現異常;對於節點客戶端就不會有這樣的狀況,因爲他就是屬於集羣中的節點,對於這些壞掉的節點,會踢出這個集羣,因此對於這個掛掉的節點,節點客戶端是不可見的。
如有錯誤,懇請指正,萬分感謝!!!