Elasticsearch 集群直接數據、協調、主節點混用在一個節點,有比較大的風險嗎?
0、問題引出
最近陸續收到三個問題:
- 問題 1:
elasticsearch master 節點報錯:
java.lang.Exception: java.lang.OutOfMemoryError: Java heap space
master jvm 配置的 24G 內存都報錯, 主節點和協調節點混在一個節點,沒有獨立協調節點。
- 問題 2:
我這邊后來的業務都是直接數據、協調、主節點混用在一個節點。
有比較大的風險嗎?
圖片
- 問題 3:
打擾下,請教一個問題
Elasticsearch 7.10版本,16個數據節點,沒有區分角色,16C64G,節點分片均勻。
現象是3天前開始,每到21點開始,其中一個es節點讀io比較其他節點高一倍,到凌晨2點又自己恢復了。
看機器帶寬也沒有明顯增加,機器iowait很高,有啥排查思路不?
圖片
這三個問題本質都和節點角色劃分以及集群規模大了應該獨立協調節點、獨立主節點有關系。
本文帶大家一起深入了解Elasticsearch中的不同節點角色及其職責。
這里先簡單介紹一下節點的概念:一個節點是Elasticsearch的一個運行實例,可以看作一臺服務器(物理或虛擬),負責存儲數據并參與集群的各種操作(比如搜索、索引、數據處理等)。
在實際的 Elasticsearch 部署中,節點并不是“一視同仁”的。根據分配的角色,節點可能負責協調集群、存儲數據或預處理數據。理解這些節點角色對于設計一個可擴展、高性能且容錯的 Elasticsearch 集群至關重要。
在這篇文章中,我們將詳細講解五種節點角色及其職責,并通過通俗易懂的例子幫助大家快速掌握這些概念。
文章內容包括:
圖片
- 主節點(Master Node)
- 數據節點(Data Node)
- 協調節點(Coordinating Only Node)
- 攝入節點(Ingest Node)
- 投票節點(Voting Node)
好了,廢話不多說,讓我們直接進入正題!
1. 主節點(Master Node)
主節點就 像Elasticsearch 集群的“大腦”或“管理者”。它的主要職責是維護整個集群的健康和組織,而不是直接存儲數據或處理搜索查詢(除非它同時被配置為其他角色)。
1.1 主節點做什么?——用途
圖片
- 跟蹤節點:知道集群中有哪些節點在運行。
- 管理索引:負責創建或刪除索引。
- 分配數據分片:決定數據(分片)存儲在哪些節點上。
- 處理集群變化:當有節點加入或退出時,更新集群狀態。
1.2 主節點示例
假設我們的Elasticsearch集群有3個節點:
- 節點A
- 節點B
- 節點C
其中節點A是主節點。
1.2.1 場景1:創建新索引
當我們發送請求創建一個新索引(比如“products”)時:
- 主節點A接收請求。
- 主節點決定:
創建多少個分片(shards)。
將這些分片分配到哪些節點(比如,主分片放在節點B,副本分片放在節點C)。
- 主節點A通知其他節點關于新索引和分片的信息。
- 主節點A本身并不存儲數據(除非它也被配置為數據節點),只是負責指揮。
1.2.2 場景2:節點故障
如果節點B宕機:
圖片
- 主節點A檢測到節點B不可用。
- 主節點重新分配節點B上的分片到其他節點(比如節點C)。
- 通知集群中所有節點更新狀態,確保集群保持平衡和可用。
1.3 如何配置主節點?
在elasticsearch.yml
配置文件中,設置如下:
node:
name:master-node-1# 節點名稱
master:true # 設置為true,表示這是主節點
data:false # 不存儲數據
ingest:false # 不處理數據攝入
cluster:
name:my-cluster
initial_master_nodes:["node-A"]# 集群首次啟動時指定的主節點
discovery:
seed_hosts:["node-A","node-B","node-C"]# 用于發現其他節點的列表
如果想讓主節點同時作為數據節點,只需將data: true
即可。但大規模多節點集群務必慎重,最好獨立節點角色。
2. 數據節點(Data Node)
數據節點是 Elasticsearch 的“存儲主力”。它負責存儲索引中的數據(以分片的形式),并處理數據的搜索和索引操作。
2.1 舉個例子
舉個餐廳的例子,廚師就是數據節點。
服務員(協調節點)把訂單交給廚師,廚師負責烹飪(存儲和處理數據),然后把成品菜(查詢結果)交給服務員。
圖片
2.2 如何配置數據節點?
在elasticsearch.yml
中,設置:
node:
data: true
2.3 一個常見問題
如果集群只有一個節點,且只配置為數據節點,它能處理用戶搜索請求嗎???
答案是:不能。
如果只有一個節點,且只配置為數據節點,它無法處理用戶請求,因為協調工作需要其他角色。
如果是單節點集群,建議使用默認配置(不顯式設置任何角色),這樣節點會同時承擔所有角色(協調、主節點、數據節點等)。
3. 協調節點(Coordinating Only Node)
協調節點就像 Elasticsearch 集群中的“交通指揮員”。
它不存儲數據,也不是主節點,而是負責接收用戶的請求(比如搜索或索引),并將這些請求分發到正確的節點。
3.1 協調節點做什么?
- 接收用戶請求(比如搜索或存儲數據)。
- 將請求轉發給相關的數據節點。
- 收集數據節點的響應。
- 將結果匯總后返回給用戶。
協調節點不執行存儲或搜索的“重(讀音 zhong)活”,只負責管理和分發任務。
圖片
3.2 舉個例子
想象我們在一家餐廳:
- 我們向服務員(協調節點)點單,點了三道菜。
- 服務員把訂單分發給廚房的三個廚師(數據節點),每個廚師負責一道菜。
- 廚師做好菜后,服務員把三道菜收集起來,端到我們面前。
服務員并不自己做菜,只是負責溝通。這就是協調節點的角色。
3.3 如何配置協調節點?
默認情況下,如果以下配置都設置為false
,節點就是協調節點:
node:
master: false
data: false
ingest: false
4. 攝入節點(Ingest Node)
攝入節點是 Elasticsearch 中的“數據預處理器”。
它在數據被索引(類似插入數據庫)之前,對數據進行清洗、轉換或豐富處理。
圖片
4.1 有點抽象?來看個例子
假設我們去餐廳點菜,但我們說得很快,還夾雜了不同的語言。
餐廳經理(攝入節點)會:
- 聽清楚我們的訂單。
- 修正拼寫或語言錯誤。
- 確認訂單內容,添加下單時間等信息。
- 將整理好的訂單交給廚房(數據節點)。
同樣,在 Elasticsearch 中,攝入節點會處理原始數據,比如清洗、格式化或添加額外信息,然后將處理后的數據發送到索引存儲。
4.2 工作流程
- 用戶發送請求到Elasticsearch,請求先到達協調節點。
- 如果請求中包含管道(pipeline)屬性,協調節點將數據轉發到攝入節點。
- 攝入節點根據管道規則處理數據(比如格式化、添加字段)。
- 處理后的數據返回給協調節點,再由協調節點發送到數據節點存儲。
圖片
4.3 如何配置攝入節點?
在elasticsearch.yml
中,設置:
node:
ingest: true
關于管道(pipeline)的具體配置,比如如何定義數據轉換規則,可以參考咱們之前的公眾號文章。
5. 投票節點(Voting Node)
投票節點參與主節點的選舉過程,幫助維持集群的穩定性。僅投票主節點候選是參與主節點選舉但永遠不會成為主節點的節點。它們的角色是在選舉過程中提供投票,特別是在需要打破平局(tiebreaker)時非常有用。
Elasticsearch 通過多數投票機制選擇主節點。
實話說,這個咱們用的真不太多。
- 一方面原因,早期版本沒有這種類型節點角色;
- 另一方面原因,集群規模還遠沒有那么大。
https://www.elastic.co/docs/deploy-manage/distributed-architecture/clusters-nodes-shards/node-roles
5.1 為什么需要投票節點?
在一個大型集群中,我們可能不希望所有節點都參與主節點選舉(會增加復雜性)。
投票節點專門負責投票,確保主節點選舉順利進行。
5.2 如何配置投票節點?
在elasticsearch.yml
中,設置:
node:
roles: [master, voting_only]
5.3 投票過程示例
假設集群有 7 個節點,其中 3 個是主節點候選(Node-A、Node-B、Node-C), 4 個是投票節點(Node-D、Node-E、Node-F、Node-H):
- 投票節點投票:
Node-D、Node-E投給Node-A。
Node-F投給Node-B。
Node-H投給Node-C。
- Node-A獲得最多票(2票),成為主節點。
圖片
5.4 投票依據是什么?
投票節點會根據以下因素選擇主節點:
- 響應速度:哪個節點響應最快。
- 健康狀態:節點是否過載或斷連。
- 網絡穩定性:連接是否可靠。
5.5 什么時候觸發主節點選舉?
- 集群啟動時。
- 當前主節點失敗。
- 有新節點加入集群。
6、總結
以讀者問題引出,讓大家提前關注到 Elasticsearch 角色劃分的重要性。
通過這篇文章,我們詳細介紹了Elasticsearch的五種節點角色及其職責:
圖片
- 主節點:管理集群,協調分片分配。
- 數據節點:存儲和處理數據。
- 協調節點:處理用戶請求,分發任務并匯總結果。
- 攝入節點:預處理數據,清洗或豐富數據。
- 投票節點:參與主節點選舉,確保集群穩定。