Elasticsearch 第九篇:叢集配置與搭建

vincentfhr發表於2022-03-01

一、Elasticsearch 叢集理論基礎

       我們之所以使用 Elasticsearch,就是希望它能幫助我們儲存海量的資料,並且可以很快的將我們需要的資料查詢出來,即解決海量資料搜尋的問題,其次才是解決海量資料統計的問題。

       Elasticsearch 本身的設計就是分散式的,也是高可用性的。Elasticsearch 通過叢集,可以將資料分散式儲存,雖然一個節點(伺服器)的儲存空間有限,但是叢集就可以增加節點,橫向擴充套件儲存空間,同時,叢集還能將節點的資料聯合進行計算,允許部分節點出現異常但不影響整體的使用,這是 Elasticsearch 高可用性的表現。

       有人可能會問,資料分散式儲存就可以提高系統的高可用性嗎?其實,Elasticsearch 不是簡單的將資料分佈在若干節點(伺服器)上就可以的,這涉及到一些基本概念。當我們建立一個索引時,這個索引將被分成 n 個主分片,每個主分片又各自複製了 m 份,複製的分片簡稱為副分片,這樣一來,主分片、副分片一共 n*(m+1) 個,將主分片、副分片分佈在若干節點伺服器上,各個伺服器節點可以互相訪問,互相合作,就構成叢集,但是要注意,主分片和它對應的副分片一般不存放在同一節點上,這是因為如果一個分片和它對應的副分片都存放在一起,當這個節點出現問題,其它節點就找不到對應的資料,會造成資料丟失,從而影響Elasticsearch的計算結果,這也不符合叢集的理念。

       Elasticsearch 搭建叢集很簡單,每個節點配置一個節點名,各個打算連成叢集的節點都配置一樣的叢集名,然後各個節點可以互相訪問,便成為叢集。

二、叢集配置與搭建

     下面以 Windows10 單機為例,建立一個叢集,首先按下圖建好目錄,即是準備3個節點的叢集

      

      檔案目錄 node1、node2、node3 分別存放官方下載的 Elasticsearch 包,如下圖

      

        node1 資料夾 config 中的配置檔案 elasticsearch.yml  新增以下配置:

 #叢集名稱,保證唯一
cluster.name: logelasticsearch
#節點名稱,必須不一樣
node.name: node1
#必須為本機的ip地址
network.host: 0.0.0.0
http.host: 0.0.0.0
#服務埠號,在同一機器下必須不一樣
http.port: 9210
#叢集間通訊埠號,在同一機器下必須不一樣
transport.tcp.port: 9310
#設定叢集自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9310","0.0.0.0:9311","0.0.0.0:9312"]
#設定主節點
cluster.initial_master_nodes: node1
http.cors.enabled: true
http.cors.allow-origin: "*"

 

node2 資料夾 config 中的配置檔案 elasticsearch.yml  新增以下配置:

#叢集名稱,保證唯一
cluster.name: logelasticsearch
#節點名稱,必須不一樣
node.name: node2
#必須為本機的ip地址
network.host: 0.0.0.0
http.host: 0.0.0.0
#服務埠號,在同一機器下必須不一樣
http.port: 9211
#叢集間通訊埠號,在同一機器下必須不一樣
transport.tcp.port: 9311
#設定叢集自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9310","0.0.0.0:9311","0.0.0.0:9312"]
#設定主節點
cluster.initial_master_nodes: node1
http.cors.enabled: true
http.cors.allow-origin: "*"

 

node3 資料夾 config 中的配置檔案 elasticsearch.yml  新增以下配置:

#叢集名稱,保證唯一
cluster.name: logelasticsearch
#節點名稱,必須不一樣
node.name: node3
#必須為本機的ip地址
network.host: 0.0.0.0
http.host: 0.0.0.0
#服務埠號,在同一機器下必須不一樣
http.port: 9212
#叢集間通訊埠號,在同一機器下必須不一樣
transport.tcp.port: 9312
#設定叢集自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9310","0.0.0.0:9311","0.0.0.0:9312"]
#設定主節點
cluster.initial_master_nodes: node1
http.cors.enabled: true
http.cors.allow-origin: "*"

 

注意:上面的配置中,各個節點的名稱不一樣,但是叢集名稱都是 logelasticsearch,這樣3個節點的叢集配置完成。

開啟 powershell  啟動第一個節點:  

cd  E:\es-cluster\node1\bin   

./elasticsearch.bat

訪問    http://localhost:9210/

再用同樣的方式啟動第二個節點、第三個節點,分別訪問 http://localhost:9211/   、  http://localhost:9212/

啟動head外掛:

cd  D:\ES\elasticsearch-head-master

npm start

       訪問  http://localhost:9100/

這時候,叢集搭建完成,可以在head外掛上看一下效果。

 

三、建立索引

       上面已經建立好一個3個節點的叢集,現在建立一個索引,指定分片數是 3,每個分片複製 2份,建立語句如下:

PUT   http://localhost:9210/logdb
{ 
    "mappings": { 
        "properties": { 
            "ID": { 
                "type": "integer"
            },
            "Url": { 
                    "type": "text",
                    "analyzer":"ik_max_word" 
            },
            "Title": { 
                    "type": "text",
                    "analyzer":"ik_max_word" 
            }
        } 
    },
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 2
    }
}

 開啟head外掛,可以看到類似以下的效果圖:

從上圖就可以看出這個叢集的相關資訊:

    1. 叢集名稱是 logelasticsearch
    2. 叢集總共包含3個節點,分別是 node1、node2、node3
    3. 索引名稱是 logdb
    4. 索引包含3個分片,如上圖紅色框所示,分別存放在3個節點上,同時每個分片有2個備份,儲存在其他節點上

從上圖可以看出,如果節點 node1 掛了,那麼節點2完全可以找到全部的資料,因為節點2包含了 0、1、2 這三部分資料,

節點三也可以完全找到這三部分資料,這就是為什麼叢集可以提高系統的穩定性和高可用性。

當這9部分資料都可用時,叢集健康為綠色,當複製分片不可用時,叢集出於亞健康狀態,為黃色,應該及時排查原因,

當主分片出現問題時,叢集為紅色,應該引起高度重視。

 

相關文章