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