Elasticsearch 5.X集群多節(jié)點(diǎn)角色配置深入詳解
問題引出
ES5.X節(jié)點(diǎn)類型多了ingest節(jié)點(diǎn)類型。
針對(duì)3個(gè)節(jié)點(diǎn)、5個(gè)節(jié)點(diǎn)或更多節(jié)點(diǎn)的集群,如何配置節(jié)點(diǎn)角色才能使得系統(tǒng)性能最優(yōu)呢?

ES2.X及之前版本節(jié)點(diǎn)角色概述

Elasticsearch集群中的三種角色
- master node:master 節(jié)點(diǎn)主要用于元數(shù)據(jù)(metadata)的處理,比如索引的新增、刪除、分片分配等。
- data node:data 節(jié)點(diǎn)上保存了數(shù)據(jù)分片。它負(fù)責(zé)數(shù)據(jù)相關(guān)操作,比如分片的 CRUD,以及搜索和整合操作。這些操作都比較消耗 CPU、內(nèi)存和 I/O 資源;
- client node:client 節(jié)點(diǎn)起到路由請(qǐng)求的作用,實(shí)際上可以看做負(fù)載均衡器。
其對(duì)應(yīng)的高性能集群拓?fù)浣Y(jié)構(gòu)模式為:
# 配置文件中給出了三種配置高性能集群拓?fù)浣Y(jié)構(gòu)的模式,如下:
# 1. 如果你想讓節(jié)點(diǎn)從不選舉為主節(jié)點(diǎn),只用來存儲(chǔ)數(shù)據(jù),可作為負(fù)載器
# node.master: false
# node.data: true
# 2. 如果想讓節(jié)點(diǎn)成為主節(jié)點(diǎn),且不存儲(chǔ)任何數(shù)據(jù),并保有空閑資源,可作為協(xié)調(diào)器
# node.master: true
# node.data: false
# 3. 如果想讓節(jié)點(diǎn)既不稱為主節(jié)點(diǎn),又不成為數(shù)據(jù)節(jié)點(diǎn),那么可將他作為搜索器,從節(jié)點(diǎn)中獲取數(shù)據(jù),生成搜索結(jié)果等
# node.master: false
# node.data: false
ES5.X節(jié)點(diǎn)角色清單

由于其他幾種類型節(jié)點(diǎn)和用途都很好理解,無非主節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、路由節(jié)點(diǎn)。
主節(jié)點(diǎn),主節(jié)點(diǎn)的主要職責(zé)是和集群操作相關(guān)的內(nèi)容,如創(chuàng)建或刪除索引,跟蹤哪些節(jié)點(diǎn)是群集的一部分,并決定哪些分片分配給相關(guān)的節(jié)點(diǎn)。穩(wěn)定的主節(jié)點(diǎn)對(duì)集群的健康是非常重要的。
node.master:true數(shù)據(jù)節(jié)點(diǎn),即Data節(jié)點(diǎn)。數(shù)據(jù)節(jié)點(diǎn)主要是存儲(chǔ)索引數(shù)據(jù)的節(jié)點(diǎn),主要對(duì)文檔進(jìn)行增刪改查操作,聚合操作等。數(shù)據(jù)節(jié)點(diǎn)對(duì)CPU、內(nèi)存、IO要求較高,在優(yōu)化的時(shí)候需要監(jiān)控?cái)?shù)據(jù)節(jié)點(diǎn)的狀態(tài),當(dāng)資源不夠的時(shí)候,需要在集群中添加新的節(jié)點(diǎn)。
node.data:true負(fù)載均衡節(jié)點(diǎn),也稱作 Client 節(jié)點(diǎn),也稱作客戶端節(jié)點(diǎn)。當(dāng)一個(gè)節(jié)點(diǎn)既不配置為主節(jié)點(diǎn),也不配置為數(shù)據(jù)節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)只能處理路由請(qǐng)求,處理搜索,分發(fā)索引操作等,從本質(zhì)上來說該客戶節(jié)點(diǎn)表現(xiàn)為智能負(fù)載平衡器。獨(dú)立的客戶端節(jié)點(diǎn)在一個(gè)比較大的集群中是非常有用的,他協(xié)調(diào)主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn),客戶端節(jié)點(diǎn)加入集群可以得到集群的狀態(tài),根據(jù)集群的狀態(tài)可以直接路由請(qǐng)求。
預(yù)處理節(jié)點(diǎn),也稱作 Ingest 節(jié)點(diǎn),在索引數(shù)據(jù)之前可以先對(duì)數(shù)據(jù)做預(yù)處理操作,所有節(jié)點(diǎn)其實(shí)默認(rèn)都是支持 Ingest 操作的,也可以專門將某個(gè)節(jié)點(diǎn)配置為 Ingest 節(jié)點(diǎn)。
Node.ingest:true-
Ingest的用途:
- Ingest節(jié)點(diǎn)和集群中的其他節(jié)點(diǎn)一樣,但是它能夠創(chuàng)建多個(gè)處理器管道,用以修改傳入文檔。類似最常用的Logstash過濾器已被實(shí)現(xiàn)為處理器。
- Ingest節(jié)點(diǎn) 可用于執(zhí)行常見的數(shù)據(jù)轉(zhuǎn)換和豐富。 處理器配置為形成管道。 在寫入時(shí),Ingest Node有20個(gè)內(nèi)置處理器,例如grok,date,gsub,小寫/大寫,刪除和重命名。
- 在批量請(qǐng)求或索引操作之前,Ingest節(jié)點(diǎn)攔截請(qǐng)求,并對(duì)文檔進(jìn)行處理。
這樣的處理器的一個(gè)例子可以是日期處理器,其用于解析字段中的日期。
另一個(gè)例子是轉(zhuǎn)換處理器,它將字段值轉(zhuǎn)換為目標(biāo)類型,例如將字符串轉(zhuǎn)換為整數(shù)。
ES5.X節(jié)點(diǎn)組合類型有多種類型,如何抉擇?
一個(gè)節(jié)點(diǎn)的缺省配置是:主節(jié)點(diǎn)+數(shù)據(jù)節(jié)點(diǎn)兩屬性為一身。對(duì)于3-5個(gè)節(jié)點(diǎn)的小集群來講,通常讓所有節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)和具有獲得主節(jié)點(diǎn)的資格。你可以將任何請(qǐng)求發(fā)送給任何節(jié)點(diǎn),并且由于所有節(jié)點(diǎn)都具有集群狀態(tài)的副本,它們知道如何路由請(qǐng)求。
通常只有較大的集群才能開始分離專用主節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)。對(duì)于許多用戶場(chǎng)景,路由節(jié)點(diǎn)根本不一定是必需的。
專用協(xié)調(diào)節(jié)點(diǎn)(也稱為client節(jié)點(diǎn)或路由節(jié)點(diǎn))從數(shù)據(jù)節(jié)點(diǎn)中消除了聚合/查詢的請(qǐng)求解析和最終階段,并允許他們專注于處理數(shù)據(jù)。
在多大程度上這對(duì)集群有好處將因情況而異。 通常我會(huì)說,在查詢大量使用情況下路由節(jié)點(diǎn)更常見。
ES5.X集群中如何設(shè)置節(jié)點(diǎn)角色
對(duì)于3個(gè)節(jié)點(diǎn)、5個(gè)節(jié)點(diǎn)甚至更多節(jié)點(diǎn)角色的配置,Elasticsearch官網(wǎng)、國內(nèi)外論壇、博客都沒有明確的定義。
我的思考如下:
- 1.對(duì)于Ingest節(jié)點(diǎn),如果我們沒有格式轉(zhuǎn)換、類型轉(zhuǎn)換等需求,直接設(shè)置為false。
- 2.3-5個(gè)節(jié)點(diǎn)屬于輕量級(jí)集群,要保證主節(jié)點(diǎn)個(gè)數(shù)滿足((節(jié)點(diǎn)數(shù)/2)+1)。
- 3.輕量級(jí)集群,節(jié)點(diǎn)的多重屬性如:Master&Data設(shè)置為同一個(gè)節(jié)點(diǎn)可以理解的。
- 4.如果進(jìn)一步優(yōu)化,5節(jié)點(diǎn)可以將Master和Data再分離。
config/elasticsearch.ymal中配置項(xiàng)說明
- cluster_name 集群名稱,默認(rèn)為elasticsearch,這里我們?cè)O(shè)置為es5.2.1Cluster
- node.name配置節(jié)點(diǎn)名,用來區(qū)分節(jié)點(diǎn)
- network.host 是配置可以訪問本節(jié)點(diǎn)的路由地址
- http.port 路由地址端口
- transport.tcp.port TCP協(xié)議轉(zhuǎn)發(fā)地址端口
- node.master 是否作為集群的主結(jié)點(diǎn) ,值為true或true
- node.data 是否存儲(chǔ)數(shù)據(jù),值為true或true
- discovery.zen.ping.unicast.hosts 用來配置所有用來組建集群的機(jī)器的IP地址,由于5.2.1新版本是不支持多播的,因此這個(gè)值需要提前設(shè)定好,當(dāng)集群需要擴(kuò)展的時(shí)候,該值都要做改變,增加新機(jī)器的IP地址,如果是在一個(gè)ip上,要把TCP協(xié)議轉(zhuǎn)發(fā)端口寫上
- discovery.zen.minimum_master_nodes 用來配置主節(jié)點(diǎn)數(shù)量的最少值,如果主節(jié)點(diǎn)數(shù)量低于該值,閉包范圍內(nèi)的集群將會(huì)停止服務(wù),之所以加粗體,是因?yàn)闀簳r(shí)尚未認(rèn)證,下面配置為1方便集群更容易形成,即使只有一個(gè)主節(jié)點(diǎn),也可以構(gòu)建集群
- gateway.* 網(wǎng)關(guān)的相關(guān)配置
- script.* indices.* 根據(jù)需求添加的配置(可選)
elasticsearch-5.2.1_1中的yaml文件
該結(jié)點(diǎn)作為master-node運(yùn)行
cluster.name: es5
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
該結(jié)點(diǎn)作為data-node運(yùn)行
node.name: node-2
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
該結(jié)點(diǎn)作為client-node運(yùn)行
cluster.name: es5
node.name: node-3
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9302
node.master: false
node.data: false
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
參考: