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

一、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

訪問    //localhost:9210/

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

啟動head插件:

cd  D:\ES\elasticsearch-head-master

npm start

       訪問  //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部分數據都可用時,集群健康為綠色,當複製分片不可用時,集群出於亞健康狀態,為黃色,應該及時排查原因,

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