Elasticsearch學(xué)習(xí)筆記(04) - 基本概念:集群、節(jié)點、分片和副本

簡介

Elasticsearch本身是一個分布式系統(tǒng),天然支持高可用和水平擴展。站在運維的角度,我們可能更加關(guān)注于部署和監(jiān)控。本章我們將講述一些核心的、基本的概念 -- 集群、節(jié)點、分片和副本。

架構(gòu)

我們知道,一個可靠的分布式系統(tǒng)必須具有高可用性和可擴展性。

  1. 高可用性
    • 服務(wù)可用性 - 允許部分節(jié)點停止服務(wù)
    • 數(shù)據(jù)可用性 - 部分節(jié)點丟失數(shù)據(jù),整個系統(tǒng)不會丟失數(shù)據(jù)
  2. 可擴展性
    • 請求量的上升、數(shù)據(jù)量的增加,集群系統(tǒng)有能力將數(shù)據(jù)分散到各個節(jié)點上,從而實現(xiàn)水平擴展

而在Elasticsearch中,其分布式架構(gòu)又帶來了以下好處

  1. 存儲的水平擴展
  2. 系統(tǒng)的高可用性,部分節(jié)點停止服務(wù),整個集群服務(wù)不受影響

Elasticsearch的分布式架構(gòu)

  1. 不同集群是通過集群名稱來區(qū)分的,默認集群名稱為elasticsearch
  2. 可在配置文件(elasticsearch.yml)中修改集群名稱,也可以在啟動命令中通過 cluster.name=${clusterName} 指定
  3. 一個集群可以有一個或多個節(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)信息
    1. 集群狀態(tài),維護了一個集群中的必要信息,包括:
      • 所有的節(jié)點信息
      • 所有的索引及其相關(guān)的Mapping和Setting信息
      • 分片的路由信息
    2. 任意節(jié)點都能修改信息的話,將導(dǎo)致數(shù)據(jù)不一致

2. Data節(jié)點和Coordinating節(jié)點

Data節(jié)點,可以保存數(shù)據(jù)的節(jié)點,在數(shù)據(jù)的水平擴展方面起到了很重要的作用。

Coordinating節(jié)點,負責(zé)接收客戶端請求,并將請求分發(fā)到合適的節(jié)點,最終又將結(jié)果進行匯總。每個節(jié)點默認都起到了 Coordinating節(jié)點 的作用

3. 其他節(jié)點

  1. Hot Node & Warm Node 。又叫冷熱節(jié)點,比如日志場景
  2. Machine Learning node 。跑機器學(xué)習(xí)的job
  3. tribe node deprecend 。開始被廢棄,使用Cross Cluster Search來代替

4. 節(jié)點的配置

  1. 開發(fā)環(huán)境,一個節(jié)點可承擔(dān)多種角色
  2. 生產(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é)點
    1. 一個分片就是一個運行的Lucene實例
    2. 主分片數(shù)在創(chuàng)建索引時指定,后續(xù)不允許修改,除非reindex
  • 副本分片,解決了數(shù)據(jù)高可用問題
    1. 副本分片數(shù)可動態(tài)調(diào)整
    2. 增加副本分片數(shù),一定程度上可提高服務(wù)可用性、讀吞吐量等

接下來,我們看一個節(jié)點和分片關(guān)系的例子。

節(jié)點和分片

在這個例子中,我們創(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ù)過小
    1. 后續(xù)無法增加節(jié)點來實現(xiàn)水平擴展
    2. 單個分片數(shù)據(jù)量太大,導(dǎo)致數(shù)據(jù)重新分配耗時
  • 分片數(shù)過大。7.0開始,默認主分片數(shù)由0更改為1,從而解決了over-sharding的問題
    1. 影響搜索結(jié)果相關(guān)性分數(shù),影響統(tǒng)計結(jié)果的準(zhǔn)確性
    2. 單個節(jié)點上過多分片,資源浪費,也會影響性能

集群的健康狀態(tài)

  1. green - 主副分片都正常
  2. yellow - 主分片全部正常分配,副本分片不能正常分配
  3. 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。

集群健康狀態(tài)

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

節(jié)點信息

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

分片信息

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

Stack Monitoring

除了Kibana,我們還可以通過監(jiān)控工具Cerebro來實時查看集群的情況。限于篇幅,本章不講解Cerebro。

總結(jié)

本章,我們站在運維的角度,宏觀地分析了集群、節(jié)點、分片和副本的概念,也了解了查看集群狀態(tài)的方式,例如Kibana的monitoring、Cerebro等等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容