簡介
Elasticsearch本身是一個分布式系統(tǒng),天然支持高可用和水平擴展。站在運維的角度,我們可能更加關(guān)注于部署和監(jiān)控。本章我們將講述一些核心的、基本的概念 -- 集群、節(jié)點、分片和副本。
架構(gòu)
我們知道,一個可靠的分布式系統(tǒng)必須具有高可用性和可擴展性。
- 高可用性
- 服務(wù)可用性 - 允許部分節(jié)點停止服務(wù)
- 數(shù)據(jù)可用性 - 部分節(jié)點丟失數(shù)據(jù),整個系統(tǒng)不會丟失數(shù)據(jù)
- 可擴展性
- 請求量的上升、數(shù)據(jù)量的增加,集群系統(tǒng)有能力將數(shù)據(jù)分散到各個節(jié)點上,從而實現(xiàn)水平擴展
而在Elasticsearch中,其分布式架構(gòu)又帶來了以下好處
- 存儲的水平擴展
- 系統(tǒng)的高可用性,部分節(jié)點停止服務(wù),整個集群服務(wù)不受影響
Elasticsearch的分布式架構(gòu)
- 不同集群是通過集群名稱來區(qū)分的,默認集群名稱為elasticsearch
- 可在配置文件(elasticsearch.yml)中修改集群名稱,也可以在啟動命令中通過
cluster.name=${clusterName}指定 - 一個集群可以有一個或多個節(jié)點
節(jié)點
一個節(jié)點,其實是一個Elasticsearch的實例。節(jié)點本質(zhì)上是一個Java進程。一臺機器可運行多個Elasticsearch進程。但是,在生產(chǎn)環(huán)境中,我們建議一臺機器運行一個Elasticsearch實例。
每個節(jié)點都有自己的名字,可以在配置文件中配置,也可以在啟動命令中通過 -E node.name=${nodeName} 指定。
每個節(jié)點啟動之后,系統(tǒng)會分配一個全局唯一的uid,保存在data目錄下。
節(jié)點根據(jù)其用途和場景,可分為很多種,參考官網(wǎng)的節(jié)點說明。
1. Master-eligible節(jié)點和Master節(jié)點
- 每個節(jié)點啟動后,默認就是一個Master-eligible節(jié)點,但可通過
node:master = false來禁止 - Master-eligible節(jié)點可參加選主流程,有機會成為Master節(jié)點
- 當(dāng)?shù)谝粋€節(jié)點啟動的時候,它會將自己選舉成為Master節(jié)點
- 每個節(jié)點都會保存集群的狀態(tài),只有Mater節(jié)點才可修改集群的狀態(tài)信息
- 集群狀態(tài),維護了一個集群中的必要信息,包括:
- 所有的節(jié)點信息
- 所有的索引及其相關(guān)的Mapping和Setting信息
- 分片的路由信息
- 任意節(jié)點都能修改信息的話,將導(dǎo)致數(shù)據(jù)不一致
- 集群狀態(tài),維護了一個集群中的必要信息,包括:
2. Data節(jié)點和Coordinating節(jié)點
Data節(jié)點,可以保存數(shù)據(jù)的節(jié)點,在數(shù)據(jù)的水平擴展方面起到了很重要的作用。
Coordinating節(jié)點,負責(zé)接收客戶端請求,并將請求分發(fā)到合適的節(jié)點,最終又將結(jié)果進行匯總。每個節(jié)點默認都起到了 Coordinating節(jié)點 的作用
3. 其他節(jié)點
- Hot Node & Warm Node 。又叫冷熱節(jié)點,比如日志場景
- Machine Learning node 。跑機器學(xué)習(xí)的job
- tribe node deprecend 。開始被廢棄,使用Cross Cluster Search來代替
4. 節(jié)點的配置
- 開發(fā)環(huán)境,一個節(jié)點可承擔(dān)多種角色
- 生產(chǎn)環(huán)境,應(yīng)設(shè)置單一節(jié)點角色
| 節(jié)點類型 | 配置參數(shù) | 默認值 |
|---|---|---|
| master.eligible節(jié)點 | node.master | true |
| Data節(jié)點 | node.data | true |
| Ingest節(jié)點 | node.ingest | true |
| Coordinating節(jié)點 | 無 | 無 |
| Machine Learning節(jié)點 | node.ml | true |
分片
在Elasticsearch中,分片分為兩種。主分片(Primary shard) & 副本分片(Replica shard)。
- 主分片,解決了數(shù)據(jù)水平擴展問題??梢詫?shù)據(jù)分布到集群內(nèi)的所有節(jié)點
- 一個分片就是一個運行的Lucene實例
- 主分片數(shù)在創(chuàng)建索引時指定,后續(xù)不允許修改,除非reindex
- 副本分片,解決了數(shù)據(jù)高可用問題
- 副本分片數(shù)可動態(tài)調(diào)整
- 增加副本分片數(shù),一定程度上可提高服務(wù)可用性、讀吞吐量等
接下來,我們看一個節(jié)點和分片關(guān)系的例子。

在這個例子中,我們創(chuàng)建了一個blogs的索引,其主分片數(shù)為3,副本分片為1。
同時,我們有3個節(jié)點,分別為Node1、Node2、Node3,每個節(jié)點都包含一個主分片和副本分片,且當(dāng)前主分片和當(dāng)前主分片關(guān)聯(lián)的副本分片并不在同一個節(jié)點上。
通過這種機制,即使某一個節(jié)點宕掉了,也不會影響整個集群的功能。
【注意】:關(guān)于分片數(shù)的設(shè)定,需要提前做好容量規(guī)劃。
- 分片數(shù)過小
- 后續(xù)無法增加節(jié)點來實現(xiàn)水平擴展
- 單個分片數(shù)據(jù)量太大,導(dǎo)致數(shù)據(jù)重新分配耗時
- 分片數(shù)過大。7.0開始,默認主分片數(shù)由0更改為1,從而解決了
over-sharding的問題- 影響搜索結(jié)果相關(guān)性分數(shù),影響統(tǒng)計結(jié)果的準(zhǔn)確性
- 單個節(jié)點上過多分片,資源浪費,也會影響性能
集群的健康狀態(tài)
- green - 主副分片都正常
- yellow - 主分片全部正常分配,副本分片不能正常分配
- red - 有主分片不能分配,比如:服務(wù)器磁盤容量使用超過85%時,創(chuàng)建一個新的索引
在Kibana中,我們可以通過一些接口來查看集群的信息,包括健康狀態(tài)、節(jié)點、分片等。
通過接口 - GET _cluster/health,我們可以看到集群的健康狀態(tài)。集群名為clusterName,狀態(tài)為green,節(jié)點數(shù)為2,激活的主分片數(shù)為6,激活的所有分片數(shù)為12。

通過接口 - GET _cat/nodes,我們可以看到節(jié)點的信息

通過接口 - GET _cat/shards,我們可以看到分片的信息

在Kibana的Stack Monitoring中,我們可以通過直觀的UI界面,來比較全面地查看這些信息。

除了Kibana,我們還可以通過監(jiān)控工具Cerebro來實時查看集群的情況。限于篇幅,本章不講解Cerebro。
總結(jié)
本章,我們站在運維的角度,宏觀地分析了集群、節(jié)點、分片和副本的概念,也了解了查看集群狀態(tài)的方式,例如Kibana的monitoring、Cerebro等等。