當咱們啓動Elasticsearch的實例,就會啓動至少一個節點。相同集羣名的多個節點的鏈接就組成了一個集羣,在默認狀況下,集羣中的每一個節點均可以處理http請求,和集羣節點的數據傳輸,集羣中全部的節點都知道集羣中其餘全部的節點,能夠將客戶端請求轉發到適當的節點。節點有如下類型:node
主(master)節點:在一個節點上當node.master設置爲True(默認)的時候,它有資格被選做爲主節點,控制整個集羣。網絡
數據(data)節點:在一個節點上node.data設置爲True(默認)的時候。該節點保存數據和執行數據相關的操做,如增刪改查,搜索,和聚合。elasticsearch
客戶端節點:當一個節點的node.master和node.data都設置爲false的時候,它既不能保持數據也不能成爲主節點,該節點能夠做爲客戶端節點,能夠響應用戶的狀況,並把相關操做發送到其餘節點。優化
部落節點: 當一個節點配置tribe.*的時候,它是一個特殊的客戶端,它能夠鏈接多個集羣,在全部鏈接的集羣上執行搜索和其餘操做。spa
默認狀況下,節點配置是一個主節點和一個數據節點。這是很是方便的小集羣,但隨着集羣的發展,分離主節點和數據節點將變得很是重要。命令行
節點協調,搜索請求或批量增長索引請求等可能涉及在不一樣的數據節點上操做。在這些請求會分紅兩個階段,一是接收客戶端的請求 ,二是協調節點執行相關操做。當數據分散在不一樣的節點上的時候,協調節點將請求轉發到數據節點,每一個數據節點在本地執行請求並把結果傳輸給協調節點,而後協調節點收集各個數據節點的結果轉換成一個單一的請求結果返回。因此須要客戶端有足夠的內存和cpu來處理各個節點的返回結果。code
主資格節點的主要職責是和集羣操做相關的內容,如建立或刪除索引,跟蹤哪些節點是羣集的一部分,並決定哪些分片分配給相關的節點。穩定的主節點對集羣的健康是很是重要的。默認狀況下任何一個集羣中的節點都有可能被選爲主節點。索引數據和搜索查詢等操做會佔用大量的cpu,內存,io資源,爲了確保一個集羣的穩定,分離主節點和數據節點是一個比較好的選擇。索引
雖然主節點也能夠協調節點,路由搜索和從客戶端新增數據到數據節點,但最好不要使用這些專用的主節點。一個重要的原則是,儘量作儘可能少的工做。建立一個獨立的主節點的配置爲:內存
node.master: true node.data: false
爲了防止數據丟失,配置discovery.zen.minimum_master_nodes設置是相當重要的(默認爲1),每一個主節點應該知道造成一個集羣的最小數量的主資格節點的數量。解析一下:ci
假設咱們有一個集羣。有3個主資格節點,當網絡發生故障的時候,有可能其中一個節點不能和其餘節點進行通訊了。這個時候,當discovery.zen.minimum_master_nodes設置爲1的時候,就會分紅兩個小的獨立集羣,當網絡好的時候,就會出現數據錯誤或者丟失數據的狀況。當discovery.zen.minimum_master_nodes設置爲2的時候,一個網絡中有兩個主資格節點,能夠繼續工做,另外一部分,因爲只有一個主資格節點,則不會造成一個獨立的集羣,這個時候當網絡回覆的時候,節點又會重新加入集羣。設置這個值的原則是:
(master_eligible_nodes / 2)+ 1。
這個參數也能夠動態設置:
PUT _cluster/settings
{ "transient": { "discovery.zen.minimum_master_nodes": 2 } }
本文由賽克 藍德(secisland)原創,轉載請標明做者和出處。
數據節點主要是存儲索引數據的節點,主要對文檔進行增刪改查操做,聚合操做等。數據節點對cpu,內存,io要求較高,在優化的時候須要監控數據節點的狀態,當資源不夠的時候,須要在集羣中添加新的節點。數據節點的配置以下:
node.master: false node.data: true
當主節點和數據節點配置都設置爲false的時候,該節點只能處理路由請求,處理搜索,分發索引操做等,從本質上來講該客戶節點表現爲智能負載平衡器。獨立的客戶端節點在一個比較大的集羣中是很是有用的,他協調主節點和數據節點,客戶端節點加入集羣能夠獲得集羣的狀態,根據集羣的狀態能夠直接路由請求。
警告:添加太多的客戶端節點對集羣是一種負擔,由於主節點必須等待每個節點集羣狀態的更新確認!客戶節點的做用不該被誇大 , 數據節點也能夠起到相似的做用。配置以下:
node.master: false node.data: false
數據節點路徑設置:
每個主節點和數據節點都須要知道分片,索引,元數據的物理存儲位置,path.data默認位爲 $ES_HOME/data,能夠經過配置文件 elasticsearch.yml進行修改,例如:
path.data: /var/elasticsearch/data
這個設置也能夠在命令行上執行,例如:
elasticsearch --path.data /var/elasticsearch/data
這個路徑最好進行單獨配置,這樣Elasticsearch的目錄和數據的目錄就會分開。當刪除了Elasticsearch主目錄的時候,不會影響到數據。經過rpm安裝默認是分來的。
數據目錄能夠被多個節點共享,甚至能夠屬於不一樣的集羣,爲了防止多個節點共享相同的數據路徑,能夠在配置文件elasticsearch.yml中添加:node.max_local_storage_nodes: 1
注意:在相同的數據目錄不要運行不一樣類型的節點(例如:master, data, client)這會致使意外的數據丟失。
部落節點能夠跨越多個集羣,它能夠接收每一個集羣的狀態,而後合併成一個全局集羣的狀態,它能夠讀寫全部節點上的數據,部落節點在elasticsearch.yml中的配置以下:
tribe: t1: cluster.name: cluster_one t2: cluster.name: cluster_two
T1和T2是任意的名字表明鏈接到每一個集羣。上面的示例配置兩集羣鏈接,名稱分別是T1和T2。默認狀況下部落節點經過廣播能夠作爲客戶端鏈接每個集羣。大多數狀況下,部落節點能夠像單節點同樣對集羣進行操做。
注意:如下操做將和單節點操做不一樣,
若是兩個集羣的名稱相同,部落節點只會鏈接其中一個。
因爲沒有主節點,當設置local爲true的是,主節點的讀操做會被自動的執行,例如:集羣統計,集羣健康度。
主節點級別的寫操做將被拒絕,這些應該是在一個集羣進行。
部落節點能夠經過塊(block)設置全部的寫操做和全部的元數據操做,例如:
tribe: blocks: write: true metadata: true
部落節點能夠也能夠在選中的索引塊中進行配置,例如:
tribe: blocks: write.indices: hk*,ldn* metadata.indices: hk*,ldn*
當多個集羣有相同的索引名的時候,默認狀況下,部落的節點將選擇其中一個。這能夠經過tribe.on_conflict setting進行配置,能夠設置排除那些索引或者指定固定的部落名稱。
賽克藍德(secisland)後續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。也歡迎加入secisland公衆號進行關注。