ElasticSearch集群搭建

8/9/2022 ElasticSearch

# 概述

# 单机 & 集群

单台 Elasticsearch 服务器提供服务,往往都有最大的负载能力,超过这个阈值,服务器性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中。

除了负载能力,单点服务器也存在其他问题:

  • 单台机器存储容量有限
  • 单服务器容易出现单点故障,无法实现高可用
  • 单服务的并发处理能力有限

配置服务器集群时,集群中节点数量没有限制,大于等于 2 个节点就可以看做是集群了。一般出于高性能及高可用方面来考虑集群中节点数量都是 3 个以上。

# 集群Cluster

一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。一个 Elasticsearch 集群有一个唯一的名字标识,这个名字默认就是 elasticsearch。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

# 节点Node

集群中包含很多服务器,一个节点就是其中的一个服务器。作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 Elasticsearch 集群中的哪些节点。

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做 elasticsearch 的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做 elasticsearch 的集群中。

在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何 Elasticsearch 节点,这时启动一个节点,会默认创建并加入一个叫做 elasticsearch 的集群。

# 集群搭建说明

  • 集群搭建同样会区分 7.x版本8.x 版本,其中,Windows下的集群搭建,8.x版本就不搞证书之类的了,linux下我们会使用https证书,毕竟实际生产环境大部分是linux

# Windows 集群搭建

# 7.X(7.8.0)集群搭建

# 集群准备

1、首先创建 es-cluster 文件夹,将 elasticsearch-7.8.0 复制三份,并修改文件名

ElasticSearch

2、修改集群文件目录下,每一个节点的 config/elasticsearch.yml 配置文件

    # 启动集群

    • 启动前先删除每个节点中的 data 目录中所有内容(如果存在)

    • 进入 bin 目录,分别双击执行 bin/elasticsearch.bat,启动节点服务器,启动后,会自动加入指定名称的集群,谁先启动就会成为 master

    # 8.X(8.3.3)集群搭建

    # 集群准备

    1、同样的,我们创建es-cluster文件夹,将 elasticsearch-8.3.3 复制三份,并修改文件名 2、分别修改每一个节点的 config/elasticsearch.yml 配置文件

      # 启动集群

      • 启动前先删除每个节点中的 data 目录中所有内容(如果存在)

      • 进入 bin 目录,分别双击执行 bin/elasticsearch.bat,启动节点服务器

        ElasticSearch

      # 测试集群

      • 查看集群状态:浏览器直接访问:http://127.0.0.1:7001/_cluster/health

        ElasticSearch

      • statu:当前集群在总体上是否工作正常,有三种颜色

        • green:所有的主分片和副本分片都正常运行
        • yellow:所有的主分片都正常运行,但不是所有副本分片都正常运行
        • red:有主分片没能正常运行
      • numnber_of_nodes:集群里多少个节点

      • numnber_of_data_nodes:集群里多少个节点可以存储数据

      向集群中的 node-7001 节点增加索引

      ElasticSearch

      在集群的node-1002节点查询刚刚添加的索引

      ElasticSearch

      # Linux集群

      # 7.X(7.8.0)集群搭建

      # 集群准备

      • 1、首先需要安装好 ElasticSearchLinux安装ES请参考
      • 2、安装完成后,同样的我们复制三份ES服务,最好是新建一个es-cluster文件夹来存放

      # 创建用户

      因为安全问题,Elasticsearch 不允许 root 用户直接运行,所以要在每个节点中创建新用户,在 root 用户中创建新用户

      useradd es # 新增用户
      passwd es # 设置密码
      userdel -r es # 如果错了,可以删除再加
      # 对文件夹赋权给es用户
      chown -R es /usr/local/es-cluster/node-7001 
      chown -R es /usr/local/es-cluster/node-7002
      chown -R es /usr/local/es-cluster/node-7003
      
      1
      2
      3
      4
      5
      6
      7

      # 修改ES配置文件

      • 分别修改各节点的 config/elasticsearch.yml 文件

        # 修改系统配置文件

        1、修改系统中允许应用最多创建多少文件等的限制权限。Linux 默认来说,一般限制应用最多创建的文件是 65535 个。但是 ES 至少需要 65536 的文件创建权限。

        2、修改系统中允许用户启动的进程开启多少个线程。默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启 1024个线程。必须修改限制数为 4096+。因为ES至少需要 4096 的线程池预备。ES在 5.x 版本之后,强制要求在 Linux 中不能使用 root 用户启动 ES 进程。所以必须使用其他用户启动 ES 进程才可以。

        3、Linux 低版本内核为线程分配的内存是 128K。4.x 版本的内核分配的内存更大。如果虚拟机的内存是 1G,最多只能开启 3000+ 个线程数。至少为虚拟机分配 1.5G 以上的内存。

        ES 可以对每个进程的文件数进行限制等,如果服务器内存或空间不足,可以通过修改配置文件,进行「裁剪」

        • 修改 /etc/security/limits.conf
        vim /etcsecurity/limits.conf
        # 在文件末尾中增加下面内容
        # 每个进程可以打开的文件数的限制
        es soft nofile 65536
        es hard nofile 65536
        
        1
        2
        3
        4
        5
        • 修改 /etc/security/limits.d/20-nproc.conf:
        vim /etc/security/limits.d/20-nproc.conf
        # 在文件末尾中增加下面内容
        # 每个进程可以打开的文件数的限制
        es soft nofile 65536
        es hard nofile 65536
        # 操作系统级别对每个用户创建的进程数的限制
        * hard nproc 4096
        # 注:* 带表 Linux 所有用户名称
        
        1
        2
        3
        4
        5
        6
        7
        8
        • 修改 /etc/sysctl.conf
        vim /etc/sysctl.conf
        # 在文件末尾中增加下面内容
        # 一个进程可以拥有的 VMA (虚拟内存区域)的数量,默认值为 65536
        vm.max_map_count=655360
        
        1
        2
        3
        4
        • 重新加载配置
        sysctl -p
        
        1

        # 启动集群

        • 使用 ES 用户分别在不同节点上启动 ES 服务器,-d 代表后台启动
        # 节点1
        cd /usr/local/es-cluster/node-7001
        bin/elasticsearch -d
        # 节点2
        cd /usr/local/es-cluster/node-7002
        bin/elasticsearch -d
        # 节点3
        cd /usr/local/es-cluster/node-7003
        bin/elasticsearch -d
        
        1
        2
        3
        4
        5
        6
        7
        8
        9

        # 8.X(8.3.3)集群搭建

        # 集群准备

        • 前期准备同7.x一致,这里就不再重复叙述
        • 准备三台机器或者单台都可以
        • 示例中ES/opt/module目录下

        # 集群规划

        IP 节点名称 节点角色 节点功能
        182.61.xx.43 es-node-1 Master,data 主+数据节点
        182.61.xx.44 es-node-2 Master,data 主+数据节点
        182.61.xx.45 es-node-3 Master,data 主+数据节点

        # 搭建集群

        1、创建新用户 es, 数据文件,证书目录, 并修改 Elasticsearch 文件拥有者

        # 新增 es 用户
        useradd es
        
        # 为 es 用户设置密码
        passwd es
        
        # 创建数据文件目录
        mkdir /opt/module/elasticsearch-8.3.3/data
        
        # 创建证书目录
        mkdir /opt/module/elasticsearch-8.3.3/config/certs
        
        #切换目录
        cd /opt/module/elasticsearch-8.3.3
        
        # 修改文件拥有者
        chown -R es:es /opt/module/elasticsearch-8.3.3
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17

        2、在第一台服务器节点 es-node-1 设置集群多节点通信密钥

        # 切换用户
        su es
        
        # 签发 ca 证书,过程中需按两次回车键
        bin/elasticsearch-certutil ca
        
        # 用 ca 证书签发节点证书,过程中需按三次回车键
        bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
        
        # 将生成的证书文件移动到 config/certs 目录中
        mv elastic-stack-ca.p12 elastic-certificates.p12 config/certs
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11

        3、在第一台服务器节点 es-node-1 设置集群多节点 HTTP 证书

        # 签发 Https 证书
        bin/elasticsearch-certutil http
        # 以下是每次要求输入时,需要输入的内容(注意看关键字词)
        1、Generate a CSR? 是否生成CSR,输入`【n】`
        
        2、use an existing CA? 是否使用已经存在的CA证书,输入`【y】`
        
        3、CA Path:certs/elastic-stack-ca.p12 指定证书路径
        
        4、Password for elastic-stack-ca.p12: 为证书输入密码,不用密码直接回车
        
        5、For how long should your certificate be valid? [5y] 20y 输入证书过期时间,输入20年`【20y】`
        
        6、generate a certificate per node? 是否为每个节点单独生成证书,输入`【n】`
        
        7、Is this correct[Y/n] y 输出连接到第一个节点的所有主机名称`【y】`
        
        8、Is this correct[Y/n] y 输出连接到第一个节点的所有主机 IP 地址`【y】`
        
        9、Do you wish to change any of these options? [y/N] n 不改变证书选项配置`【n】`
        
        10、What password do you want for you private key(s)? 不给证书加密,按键输入两次回车
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22

        4、解压刚刚生成的 zip

        # 解压文件
        unzip elasticsearch-ssl-http.zip
        
        1
        2
        • zip内容
        /elasticsearch
        |_ README.txt
        |_ http.p12
        |_ sample-elasticsearch.yml
        
        /kibana
        |_ README.txt
        |_ elasticsearch-ca.pem
        |_ sample-kibana.yml
        
        1
        2
        3
        4
        5
        6
        7
        8
        9

        5、将解压后的证书文件移动到 config/certs 目录中

        # 移动文件:其中kibana中的证书是提供给kibana通信使用的,具体配置查看目录中的README.txt
        mv elasticsearch/http.p12 kibana/elasticsearch-ca.pem config/certs
        
        1
        2

        6、修改主配置文件:config/elasticsearch.yml

        # 设置 ES 集群名称
        cluster.name: es-cluster
        
        # 设置集群中当前节点名称
        node.name: es-node-1
        # 节点角色 [主节点、数据节点]
        node.roles: [ master, data ]
        
        # 设置数据,日志文件路径
        path.data: /opt/module/elasticsearch-8.3.3/data
        path.logs: /opt/module/elasticsearch-8.3.3/log
        
        # 设置网络访问节点
        network.host: linux1
        
        # 设置网络访问端口
        http.port: 9200
        
        # 初始节点
        discovery.seed_hosts: ["linux1"]
        
        # 安全认证
        xpack.security.enabled: true
        xpack.security.enrollment.enabled: true
        xpack.security.http.ssl:
         enabled: true
         keystore.path: /opt/module/elasticsearch-8.3.3/config/certs/http.p12
         truststore.path: /opt/module/elasticsearch-8.3.3/config/certs/http.p12
        # 集群间安全通信配置
        xpack.security.transport.ssl:
         enabled: true
         verification_mode: certificate
         keystore.path:
        /opt/module/elasticsearch-8.3.3/config/certs/elastic-certificates.p12
         truststore.path:
        /opt/module/elasticsearch-8.3.3/config/certs/elastic-certificates.p12
        
        # 此处需注意,es-node-1 为上面配置的节点名称
        cluster.initial_master_nodes: ["es-node-1"]
        http.host: [_local_, _site_]
        ingest.geoip.downloader.enabled: false
        xpack.security.http.ssl.client_authentication: none
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42

        7、启动 ES 服务

        # 启动 ES 软件
        bin/elasticsearch
        
        1
        2
        • 注意1:第一次成功启动后,会显示密码,请记住,访问时需要。如果没记住,就通过ES的rest-password重置密码,详细操作请查看ElasticSearch安装中重置密码一节

        • 注意2:9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 http 协议 RESTful 端口。

        8、访问服务器节点 https://虚拟机地址:9200。因为配置了安全协议,所以使用 https 协议进行访问,但由于证书是自己生成的,并不 可靠,所以会有安全提示

        9、修改集群中其他节点的配置文件:config/elasticsearch.yml

        • linux2: 证书直接拷贝,其他步骤完全相同,配置文件中修改如下内容即可
        # 设置节点名称
        node.name: es-node-2
        # 设置网络访问主机
        network.host: linux2
        
        1
        2
        3
        4
        • linux3:证书直接拷贝,其他步骤完全相同,配置文件中修改如下内容即可
        # 设置节点名称
        node.name: es-node-3
        # 设置网络访问主机
        network.host: linux3
        
        1
        2
        3
        4

        10、依次启动集群的三台服务器节点, 不要忘记切换用户后再启动

        #linux1:
        ## 后台启动服务
        bin/elasticsearch -d
        
        #linux2:
        ## 后台启动服务
        bin/elasticsearch -d
        
        #linux3:
        ## 后台启动服务
        bin/elasticsearch -d
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11