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部分数据都可用时,集群健康为绿色,当复制分片不可用时,集群出于亚健康状态,为黄色,应该及时排查原因,

当主分片出现问题时,集群为红色,应该引起高度重视。