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