ES集群搭建与配置

声明:本篇文章除部分引用外,均为原创内容,如有雷同纯属巧合,引用转载请附上原文链接与声明。
阅读条件:读本篇文章需掌握基础linux命令用法,linux系统环境配置,英文文档阅读能力
注:本文若包含部分下载内容,本着一站式阅读的想法,本站提供其对应软件的直接下载方式,但是由于带宽原因下载缓慢是必然的,建立读者去相关官网进行下载,若某些软件禁止三方传播,请在主页上通过联系作者的方式将相关项目进行取消。

参考引用

文章大纲

  • 下载安装
  • 方法一
  • 一键化安装脚本
  • 方法二
  • 集群配置(包含认证以及LTS配置)
  • IK分词器安装
  • ES启动与密码设置
  • Java客户端TLS配置
一.下载安装

本文采用的ES版本为7.8.1,7.X和6.X在配置上已经有较大改变,特别是6.8.x之后,ES推出了官方的安全组件。本文建议采用7.X版本,以下均是根据7.X版本进行的介绍。

1.1 节点分配
本文的ES安装将采用三个节点,且均可成为主节点,各节点的配置见下表,使用的服务器集群环境,读者可适当调小配置

IP hostname es-node-name role CPU cores memory(GB)
172.16.4.93 slave1 node-1 主节点 16 48
172.16.4.95 slave2 node-2 主节点 16 48
172.16.4.117 slave3 node-3 主节点 16 48

1.2 下载安装ES7.8.1
若下载了7.X版本的读者可跳过此步,ES7.8.1下载传送门点此

1.3 下载安装JDK11
ES7.x支持JDK8,但是官方建议使用JDK11,原因将在下文介绍,JDK11下载传送门点此,这里官方支持很多种方式安装JDK11,笔者选择的下载压缩包版本(*.tar.gz)

1.4 下载ES7.8.1 IK分词器
关于IK分词器的介绍,这里不在赘述,更多信息请参考IK分词器介绍ES7.8.1IK分词器下载传送门

1.5 解压安装
在slave1节点上执行以下命令创建指定文件夹

mkdir -p /home/package

将之前下载的三个安装包上传至/home/package目录下,执行以下命令解压

tar -zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz
tar -zxvf jdk-11.0.7_linux-x64_bin.tar.gz

将相关内容转移到指定文件夹下,执行以下命令创建ES,JDK文件夹,并将解压后的内容转移到指定文件夹下。

mkdir -p /home/package/elasticsearch
mv /home/package/elasticsearch-7.8.1/* /home/package/elasticsearch/
rm -rf /home/package/elasticsearch-7.8.1
mkdir -p /home/package/jdk11
mv /home/package/jdk-11.0.7/* /home/package/jdk11/
rm -rf /home/package/jdk-11.0.7

配置JAVA_HOME

vim /etc/profile

添加如下配置

JAVA_HOME=/home/package/jdk11
PATH=${JAVA_HOME}/bin:${PATH}
export JAVA_HOME
export PATH

退出编辑,执行以下命令使配置生效

source /etc/profile

如果不能够执行,则将对 /root/.bash_profile /root/.bashrc进行同样的配置

查看java是否安装成功

java -version
# 得到如下结果则表明成功
java version "11.0.7" 2020-04-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.7+8-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.7+8-LTS, mixed mode)
方法一

在该方法中笔者提供一个完整的一键化安装脚本,通过执行该脚本可以在对指定的集群进行一件安装,并配置上相关的SSL参数,最后完成启动,操作特别简单,适合部署ES集群的新手。

1.1 一键化安装脚本
一键化安装脚本下载传送门

下载完成后,将会得到deploy-es.tar.gz压缩文件,里面是执行所需要的脚本,读者只需要运行其中一个脚本即可,其他脚本为运行时依赖脚本,首先执行以下命令对其进行解压

tar -zxvf ./deploy-es.tar.gz

解压完成后会得到如下文件格式

给安装脚本赋予可执行权限

chmod 777 ./install-es.sh

声明一个文本文件,这里我命名为node_ips.txt,对文本文件添加以下内容,将集群中所有节点的ip填入该文本文件中,每一行填写一个ip,这里我填入我的es集群节点ip,脚本将按行读取所有需要安装es服务的ip

执行以下命令,开始对集群安装ES服务,并对其进行正确参数配置,并完成最后的启动。执行install-es.sh脚本开始进行安装,执行该脚本需要传入四个参数

  • es的安装包资源所在位置
  • es服务需要安装的目标目录(最后不要以/结尾)
  • 需要安装es服务的ip地址文本文件位置
  • es内置用户的密码(不设置默认为123456)
./install-es.sh elasticsearch-7.8.1-linux-x86_64.tar.gz /home/package node_ips.txt 123456

首先会得到如下提醒信息,若满足则按任意键即可继续,这里我们继续安装,若不满足则按下ctrl + c终止该脚本的运行,提醒的内容如下

  • 必须将正在操作的机器和即将安装ES服务的集群机器之间的ssh配置完成,使操作的机器能够通过ssh root用户免密登录到ES集群上的任何节点
  • 必须在所有待安装es服务的节点上已经完成了对于java的安装(这里提一句,读者完全可以参照笔者提供的脚本自己实现一个一键化安装所有es节点上的java服务)
  • es节点上的java版本不能低于jdk8

选择继续安装后,会得到如下结果,首先会输出需要安装es服务的所有节点列表,紧接其后是当es集群初始启动时的初始化主节点,这里的计算规则请参考方法二中的脚本注释,然后选择是安装还是卸载,如果选择卸载,则会卸载所有es节点上的es服务以及删除es目录,选择安装则会先通过卸载的方式清空环境,而后再执行安装过程,这里选择安装(输入1,回车)

在安装完成后会得到如下信息,表示安装完成,此时跳转方法二第五步设置java客户端连接密码即可。亦可通过es-head的方式对集群进行访问。

方法二

相较于方法一通过笔者提供的一键化脚本,傻瓜式地完成ES集群安装以及SSL配置,方法二适合于开发运维人员学习,以下步骤均为方法二的实现步骤,每一个必要配置上均留有相关注释,方法一提供的脚本本质上是对方法二的脚本封装。

二.集群配置

这里先对slave1节点进行配置,其余的slave节点均是一样的操作(除CA配置文件生成步骤不同外)

2.1 执行相关的脚本
将以下命令写入脚本并运行,仔细查看每一项命令前的注释,其中有对于认证的配置,其中使用了认证的文件,以及是否开启认证的配置。认证文件将在后文生成。

#!/bin/bash

# 声明 es 安装位置,根据自己安装包的位置灵活调配
ELASTIC_SEARCH_HOME=/home/package/elasticsearch

# 修改系统配置文件 /etc/sysctl.conf
sed -i '/^vm.max_map_count/d' /etc/sysctl.conf
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
# 修改系统配置文件 /etc/security/limits.conf
sed -i '/^* soft nofile /d' /etc/security/limits.conf
sed -i '/^* hard nofile /d' /etc/security/limits.conf
sed -i '/^* soft nproc /d' /etc/security/limits.conf
sed -i '/^* hard nproc /d' /etc/security/limits.conf
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 131072" >> /etc/security/limits.conf
echo "* soft nproc 4096" >> /etc/security/limits.conf
echo "* hard nproc 4096" >> /etc/security/limits.conf
# 修改系统配置文件 /etc/security/limits.d/20-nproc.conf
sed -i '/^\*          soft    nproc     /d' /etc/security/limits.d/20-nproc.conf
echo "*          soft    nproc     4096" >> /etc/security/limits.d/20-nproc.conf
sysctl -p

# 修改es配置文件 elasticsearch.yml
echo "cluster.name: elasticsearch" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 此处的node.name 根据上文的配置进行修改,每个节点的名称不一致
echo "node.name: node-1" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "network.host: 0.0.0.0" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "http.port: 9200" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "http.cors.enabled: true" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "http.cors.allow-origin: \"*\"" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "node.master: true" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "node.data: true" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 开启xpack安全认证,默认为false
echo "xpack.security.enabled: true" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 集群间开启ssl通信
echo "xpack.security.transport.ssl.enabled: true" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 设置认证模式为 certificate模式,即只对证书进行认证,默认是 full模式,即对ip,dns,certificate全部进行筛选
echo "xpack.security.transport.ssl.verification_mode: certificate" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 用于认证的证书文件,将在后文进行生成
echo "xpack.security.transport.ssl.keystore.path: elastic-certificates.p12" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
echo "xpack.security.transport.ssl.truststore.path: elastic-certificates.p12" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 节点的ip列表,这里填入所有的es节点的ip地址
echo "discovery.seed_hosts: ["172.16.4.93","172.16.4.95","172.16.4.117"]" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml
# 默认的初始化主节点,这里设置初始化的时候93,95为主节点,这里可以填入的主节点个数有一个最小值
# 计算公式为 所有能够成为master节点数:n /2 + 1, 在这里我所有的节点均能成为主节点 所以个数为 3 /2 + 1 = 2,即需要选择两个节点作为初始化的主节点
echo "cluster.initial_master_nodes: ["172.16.4.93","172.16.4.95"]" >> ${ELASTIC_SEARCH_HOME}/config/elasticsearch.yml

# jvm options
sed -i "/^-Xms1g/d" ${ELASTIC_SEARCH_HOME}/config/jvm.options
sed -i "/^-Xmx1g/d" ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "-Xms31g" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "-Xmx31g" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
sed -i "/^8-13:-XX:+UseConcMarkSweepGC/d" ${ELASTIC_SEARCH_HOME}/config/jvm.options
sed -i "/^8-13:-XX:CMSInitiatingOccupancyFraction=75/d" ${ELASTIC_SEARCH_HOME}/config/jvm.options
sed -i "/^8-13:-XX:+UseCMSInitiatingOccupancyOnly/d" ${ELASTIC_SEARCH_HOME}/config/jvm.options
# es 7.x 用于兼容jdk10之前,因为在之前GC都是使用的 标记整理算法 而 jdk11开始支持G1 GC。而G1 GC的效率是更高的,更加适合ES,所以ES7.X建议使用JDK11
echo "8-10:-XX:+UseConcMarkSweepGC" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "8-10:-XX:CMSInitiatingOccupancyFraction=75" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "8-10:-XX:+UseCMSInitiatingOccupancyOnly" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "11-:-XX:+UseG1GC" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "11-:-XX:G1ReservePercent=25" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options
echo "11-:-XX:InitiatingHeapOccupancyPercent=30" >> ${ELASTIC_SEARCH_HOME}/config/jvm.options

# 生成用于运行 es 的用户
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
chown -R elsearch:elsearch ${ELASTIC_SEARCH_HOME}

2.2 生成用于认证的CA证书
按顺序执行以下命令,在需要填入密码时,笔者全部是直接默认回车,即不设置密码,后文关于CA证书认证的密码均直接回车,未填写,若读者进行了设置,则需要在相应的地方填入对应的密码即可。
执行以下命令,会在es目录下生成elastic-stack-ca.p12文件,用于生成相应的证书文件

/home/package/elasticsearch/bin/elasticsearch-certutil ca

执行以下命令生成节点使用的实例证书文件,执行后会在es目录下生成elastic-certificates.p12实例证书文件,用户认证实例间的通信,以及客户端的通信,由于本文的认证模式仅仅使用的是certificate模式,所以如果需要新增节点,则只需要把elastic-certificates.p12放在新增的节点上即。

/home/package/elasticsearch/bin/elasticsearch-certutil cert --ca /home/package/elasticsearch/elastic-stack-ca.p12

在2.1中配置的证书文件默认是ES_HOME/config/下,所以执行以下命令,将生成的实例证书文件进行转移位置

mv /home/package/elasticsearch/elastic-certificates.p12 /home/package/elasticsearch/config/
三.IK分词器安装

执行以下命令将IK分词器解压到ESplugin下

mkdir -p /home/package/elasticsearch/plugins/analysis-ik/
unzip /home/package/elasticsearch-analysis-ik-7.8.1.zip -d /home/package/elasticsearch/plugins/analysis-ik/

此时ES的大部分配置已经完毕,需要将以上操作对其他剩余节点进行相同的操作即可,唯一需要注意的有两个修改

  • 根据操作的节点来修改2.1中的脚本中的node.name字段值
  • 其他节点不需要再进行2.2步,取而代之的是之前的节点在2.2节中生成的elastic-certificates.p12文件拷贝到本节点/home/package/elasticsearch/config/ 目录下

最后执行在所有节点上执行以下命令

chown -R elsearch:elsearch /home/package/elasticsearch/
四.ES启动及密码设置

在每个节点上依次执行以下命令启动es

su elsearch
cd /home/package/elasticsearch/
./bin/elasticsearch

启动完成后,在任意节点上执行以下命令用于初始化登录密码,这里需要指定准确的密码,实际上是初始化es已内置的认证用户登录密码,笔者这里都是使用的123456,线上环境需要设置得复杂一些。

cd /home/package/elasticsearch/
./bin/elasticsearch-setup-passwords interactive

至此所以ES服务端的设置已经安装完毕,以下步骤是检验ES是否安装成功且集群已经稳定运行。

笔者使用的chrome浏览器,支持es-head的插件,进入chrome 插件商城搜索elasticsearch即可看到。读者若继续安装kinbana,或者其他方式,这里不再赘述

安装完成后,进入es-head,首次进入需要输入用户名和密码,这里使用之前生成密码的用户
elastic/123456。进入后可看到三个节点组成的集群,且集群状态值是绿色表明集群健康。

五.Java客户端的认证设置

直接上代码,可以看到,在setting配置中也新增了对于ssl的配置,需要将2.1中生成的elastic-certificates.p12保存到java能够访问的位置即可,这里笔者放在的/home/certificate/elastic-certificates.p12

public TransportClient transportClient() throws UnknownHostException {
    List<String> hostList = Lists.newArrayList(hosts.replaceAll(" ", "").split(HOST_SEPARATOR));
    Settings settings = Settings.builder()
            .put("cluster.name", cluster)
            .put("xpack.security.user", new StringJoiner(":").add(username).add(password).toString())
            .put("xpack.security.transport.ssl.enabled", true)
            .put("xpack.security.transport.ssl.verification_mode", "certificate")
            .put("xpack.security.transport.ssl.keystore.path", "/home/certificate/elastic-certificates.p12")
            .put("xpack.security.transport.ssl.truststore.path", "/home/certificate/elastic-certificates.p12")
            .build();
    PreBuiltXPackTransportClient transportClient = new PreBuiltXPackTransportClient(settings);
    for (String host : hostList) {
        transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(host), port));
    }
    return transportClient;
}