ElasticSearch集群搭建

在生产环境中使用 ElasticSearch 时,一般会使用集群模式(分片+副本)提高服务的可用性,另外,集群部署相对于单机部署有更多的存储空间,可存储的数据量更大。

安装前准备

  1. 选择合适的版本

    前往 Elastic官网 下载安装包。不同版本的 ElasticSearch 及 SDK 差异较大,需要根据应用选择合适的版本部署。较早的项目多为 6.x 的版本,此版本仍有 _doc 的类型,到了 7.x 版本开始便移除了类型,贸然选择最新版本可能导致代码与 ElasticSearch 之间不兼容,应谨慎选择 ElasticSearch 的大版本。

  2. 集群规划

    ElasticSearch 集群要求至少部署三个节点以保证可用性。在部署前要规划好服务器以及ES服务占用的端口,以下是部署规划:

    主机IP地址 ES提供服务端口 ES集群通信端口
    10.231.176.18 9200 9300
    10.231.176.19 9200 9300
    10.231.176.20 9200 9300

    由于 ElasticSearch 的日志与数据文件会随着使用增长,在安装配置前需要查看磁盘空间来规划安装、日志、数据的目录,避免因为磁盘空间不足导致无法正常提供服务。如果使用量较大单台机器无法满足存储要求,可使用 NFS 等可扩展的文件系统。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@hadoop1 bin]# df -h
    文件系统 容量 已用 可用 已用% 挂载点
    devtmpfs 63G 0 63G 0% /dev
    tmpfs 63G 0 63G 0% /dev/shm
    tmpfs 63G 12M 63G 1% /run
    tmpfs 63G 0 63G 0% /sys/fs/cgroup
    /dev/mapper/centos-root 50G 2.3G 48G 5% /
    /dev/sda1 1014M 150M 865M 15% /boot
    /dev/mapper/centos-home 418G 6.4G 411G 2% /home
    tmpfs 13G 0 13G 0% /run/user/0
    tmpfs 13G 0 13G 0% /run/user/1000

    执行命令后可以看到,空间最大的数据盘挂载目录为 /home 目录,将 ElasticSearch 部署在该目录下,日志、数据也存放在该目录下。

  3. 修改服务器配置

    由于 ElasticSearch 需要使用到大量的内存,控制虚拟内存映射区,操作大量文件,因此需要调整系统参数,否则无法正常启动。

    1
    2
    // 错误一
    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    Elasticsearch 拥有的最大内存权限太小,至少需要 262144。切换到 root 用户以后调整 vm.max_map_count 参数值,执行 vi /etc/sysctl.conf,追加 vm.max_map_count=262144 或其他合适的数值即可。

    1
    2
    3
    // 错误二
    ERROR: [1] bootstrap checks failed
    [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

    Elasticsearch 进程可操作的文件句柄太小,至少需要 65535。切换到 root 用户以后,执行 /etc/security/limits.conf,追加以下内容:

    1
    2
    3
    4
    * soft nproc 655350
    * hard nproc 655350
    * soft nofile 65536
    * hard nofile 65536

    修改完成以后使用 ulimit -S -n 查看参数。

部署步骤

  1. 上传 elasticsearch-7.17.15-linux-x86_64.tar.gz 到规划集群服务器的 /home 目录下并解压,然后创建存储数据与日志的文件夹。

    1
    2
    cd /home
    tar -zxvf elasticsearch-7.17.15-linux-x86_64.tar.gz
  2. 创建用户并授权相应目录的读写权限

    出于安全性考虑,官方编译发行的 ElasticSearch 禁止使用 root 用户启动,需要创建一个普通用户,并将对应目录授予读写权限。

    1
    2
    3
    4
    cd ./elasticsearch-7.17.15
    mkdir esdata && eslogs
    useradd elasticsearch
    chown -R elasticsearch:elasticsearch /home/elasticsearch-7.17.15
  3. 切换到普通用户,修改 ES 的配置文件

    1
    2
    su elasticsearch
    vi config/elasticsearch.yml

    对每台服务器的原有配置文件项进行以下的新增或修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 修改为自己的ES集群名称即可,用于区分当前节点是否为某个集群之一
    cluster.name: elasticsearch-cluster
    # 节点名称,在集群内不重复即可
    node.name: es-node-1
    # 该节点是否存储数据
    node.data: true
    path.data: /home/elasticsearch-7.17.15/esdata
    path.logs: /home/elasticsearch-7.17.15/eslogs
    network.host: 0.0.0.0
    http.port: 9200
    transport.tcp.port: 9300
    # 根据实际部署规划修改,将所有节点IP填入
    discovery.seed_hosts: ["10.231.176.18", "10.231.176.19", "10.231.176.20"]
    # 根据实际配置文件修改,将所有节点名称填入
    cluster.initial_master_nodes: ["es-node-1", "es-node-2", "es-node-3"]
    # 如果不需要 Kibana 和 Logstash 可以不用配置跨域选项
    http.cors.enabled: true
    http.cors.allow-origin: "*"
  4. 修改 ES 的 JVM 配置文件

    1
    vi config/jvm.options

    根据服务器实际情况设置 XmxXms 的值,需要注意的是 xmx 和 xms 的数值需要设置为一样的。

  5. 启动 ElasticSearch

    1
    ./bin/elasticsearch -d

    每个集群节点都启动完成后,可以访问 http://ip:port 验证集群是否可用,只要页面展示的 cluster_uuid 不为 _na_ ,那么集群的部署已经完成了。

启用basic密码认证(可选)

出于安全和权限管理考虑,可以为 ElasticSearch 集群启用基于 HTTP Basic 认证的密码。执行步骤如下:

  1. vi config/elasticsearch.yml 修改配置文件,新增以下配置:

    1
    2
    3
    4
    5
    6
    xpack.security.enabled: true
    xpack.license.self_generated.type: basic
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
  2. 生成集群间通信使用到的证书,并将证书文件发送到其他节点上

    1
    2
    3
    bin/elasticsearch-certutil cert -out config/elastic-certificates.p12
    scp elastic-certificates.p12 root@10.231.176.19:/home/elasticsearch-7.17.15/config/
    scp elastic-certificates.p12 root@10.231.176.20:/home/elasticsearch-7.17.15/config/
  3. 重启每个节点的 ElasticSearch 服务,保证服务是启动的,然后使用内置的 elasticsearch-setup-password 脚本设置密码,执行以下命令后,依次输入密码即可,密码会自动在集群间同步,无需多次设置。

    1
    bin/elasticsearch-setup-passwords interactive