Elasticsearch 7.7.1 集群安装

1.前提条件

  1. 安装前确保集群已经完成 基础环境配置
  2. 本次安装的 Elasticsearch 软件版本为:7.7.1
  3. 基于 RPM 包的方式安装,可适用于 RedHat 7/8、CentOS 7/8 以及其他衍生的发行版,比如 AlmaLinux 8 等。
  4. 支持的芯片包括:x86 和 ARM64,对应的安装包分别为:elasticsearch-7.7.1-x86_64.rpmelasticsearch-7.7.1-aarch64.rpm

2.环境准备

  1. 集群中共有3个节点,分别为:ecs12ecs13ecs14。对应的 hosts 表如下:

    ecs12  192.168.11.12
    ecs13  192.168.11.13
    ecs14  192.168.11.14
    
  2. Elasticsearch 的数据目录定为:/data/elasticsearch

  3. 在每个节点上解压安装并配置环境变量

    rpm -ivh elasticsearch-7.7.1-x86_64.rpm 
    # 设置环境变量
    export PATH=$PATH:/usr/share/elasticsearch/bin
    

    建议将环境变量配置到 /etc/profile 中永久生效。

3.证书及配置文件准备

3.1 生成证书

在集群的一个节点上配置即可,当前在 ecs12 上生成 CA:

# 在 ecs12 上生成 CA
cd /usr/share/elasticsearch
elasticsearch-certutil ca

然后生成证书以及私钥:

elasticsearch-certutil cert --ca elastic-stack-ca.p12

执行完后会在当前目录下会生成 elastic-certificates.p12 文件。

将生成的 CA 移动到 Elasticsearch 的证书目录:

# 创建 Elasticsearch 证书目录
mkdir /etc/elasticsearch/cert
mv elastic-stack-ca.p12 elastic-certificates.p12 /etc/elasticsearch/cert

最后将 CA 和证书文件远程发送到其他的节点:

scp -r /etc/elasticsearch/cert ecs13:/etc/elasticsearch
scp -r /etc/elasticsearch/cert ecs14:/etc/elasticsearch

在每台机器上设置权限:

# 所有机器都需要执行
chown -R elasticsearch:elasticsearch /etc/elasticsearch/cert

3.2 修改配置文件

由于 Elasticsearch 各个节点上的配置文件基本上是一致的,所以建议先在其中一个节点上进行配置,最后再一块同步至其他节点进行修改,我们下面以 ecs12 为例进行配置。

首先在 ecs12 上编辑 JVM 配置文件 /etc/elasticsearch/jvm.options 修改其中 JVM 堆的大小,默认只有 1GB 可用:

-Xms1g
-Xmx1g

这个值的设置一定不要超过机器总内存的一半,另外需要将相当大部分的内存留给文件缓存以及系统本身的使用,同时还应该避免堆内存配置过大导致长时间的 GC,根据经验最大不要超过 26GB。假设当前机器只运行 Elasticsearch 而没有其他服务,假设机器总内存大小为 M(单位为 GB),我们推荐按照下面的公式设置:

\begin{aligned} JVM_{heap} = min(0.4M, 26) \end{aligned}

对于计算结果直接取整即可,根据上面公式,可以总结出下表:

服务器内存 JVM 堆内存
4GB 1GB
8GB 3GB
16GB 6GB
32GB 12GB
64GB 25GB
128GB 26GB
256GB 26GB

在实际配置时可以参考上表来进行配置,通常情况下推荐独立部署,但假如存在与其他软件混合部署的情况下应该按照实际的可用内存进行配置。

同时 -Xms-Xmx 要配置成相同的值,避免内存的频繁创建和回收。

假如我们当前设置为 8GB,则配置如下:

-Xms8g
-Xmx8g

配置完成后保存。

然后继续在 ecs12 上修改配置文件 /etc/elasticsearch/elasticsearch.yaml

# 集群名称, 所有节点必须配置相同名称
cluster.name: es7-cluster
# 节点名称, 每个节点唯一,配置为主机名即可
node.name: ecs12
# 数据存放目录
path.data: /data/elasticsearch
# 日志存放目录 默认即可
path.logs: /var/log/elasticsearch
# 开启内存锁定 避免换出
bootstrap.memory_lock: true
# 该节点的 IP 地址
network.host: 192.168.11.12
# HTTP 端口号
http.port: 9200
# 集群发现节点配置
discovery.seed_hosts: ["192.168.11.12:9300", "192.168.11.13:9300","192.168.11.14:9300"]
# 参与选举的节点名称 
cluster.initial_master_nodes: ["ecs12","ecs13","ecs14"]
# 开启 X-PACK 安全
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/cert/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/cert/elastic-certificates.p12

然后将配置文件远程发送到其他节点:

# 在ecs12上执行
cd /etc/elasticsearch
scp jvm.options elasticsearch.yml ecs13:`pwd`
scp jvm.options elasticsearch.yml ecs14:`pwd`

其他节点修改配置文件只需要修改 node.namenetwork.host 项,其他配置项无需修改。

然后在每个节点上编辑服务文件:

systemctl edit elasticsearch.service 

输入如下内容:

[Service]
LimitMEMLOCK=infinity

注意编辑器不是 vim,直接输入即可,然后按 Ctrl + X 快捷键,然后输入 Y 直接回车即可保存,保存后查看文件确认:

cat /etc/systemd/system/elasticsearch.service.d/override.conf

没问题然后就可以刷新服务文件:

systemctl daemon-reload

4.启动 Elasticsearch 集群

4.1 初始化数据目录

在所有节点创建数据目录并设置权限:

# 在所有节点执行
mkdir /data/elasticsearch
chown -R elasticsearch:elasticsearch /data/elasticsearch/

4.2. 启动服务

在所有节点启动服务:

systemctl start elasticsearch.service
# 查看服务状态
systemctl status elasticsearch.service

启动可能比较慢,耐心等待启动成功。如果启动失败可以查看状态或输出:

journalctl -u elasticsearch.service 

4.3 初始化密码

在其中一台机器上比如 ecs12 上初始化用户的密码:

# auto 表示自动生成密码,也可以用 interactive 自己依次设置密码
elasticsearch-setup-passwords auto

执行完此命令后,自动生成的密码会打印在控制台上:

这些密码可以保存一下,如果需要修改 elastic 用户的密码可以执行:

# <password> 部分使用新的密码替换即可
curl -XPOST -u elastic "192.168.11.12:9200/_security/user/elastic/_password" -H 'Content-Type: application/json' -d'{"password" : "<password>"}'

执行完后会提示输入原密码,把上面自动生成的 elastic 用户的密码输入即可修改。

5.验证

请求任意一个节点查看集群状态和节点情况:

# <password> 替换为密码
curl -u 'elastic:<password>' "ecs12:9200"

返回内容如下:

{
  "name" : "ecs12",
  "cluster_name" : "es7-cluster",
  "cluster_uuid" : "hfPAkzLGThO6NFc8c82TMg",
  "version" : {
    "number" : "7.7.1",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
    "build_date" : "2020-05-28T16:30:01.040088Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

查看节点情况:

curl -u 'elastic:<password>' ecs12:9200/_cat/nodes?v

返回如下:

ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.11.12           52          98   7    1.45    2.08     2.24 dilmrt    -      ecs12
192.168.11.14           39          97   6    1.22    0.92     0.98 dilmrt    -      ecs14
192.168.11.13           36          99   7    2.41    1.48     1.44 dilmrt    *      ecs13

6.常见问题

6.1 参数 xpack.security.enabled 和 xpack.security.transport.ssl.enabled

当前在配置过程中同时开启了 xpack.security.enabledxpack.security.transport.ssl.enabled,Elasticsearch 对于所有的非试用集群要求如果开启 xpack.security.enabled 则必须要开启 xpack.security.transport.ssl.enabled,否则将会报错无法启动。

6.2 证书必须放置到 /etc/elasticsearch 配置文件目录下

默认的 CA 会生成到 /usr/share/elasticsearch 下,无论原始目录有没有权限,最终仍然需要放到 /etc/elasticsearch/cert 下,否则会报错如下:

ElasticsearchSecurityException[failed to load SSL configuration [xpack.security.transport.ssl]]; nested: ElasticsearchException[failed to initialize SSL TrustManager - access to read truststore file [/usr/share/elasticsearch/elastic-certificates.p12] is blocked; SSL resources should be placed in the [/etc/elasticsearch] directory]; nested: AccessControlException[access denied ("java.io.FilePermission" "/usr/share/elasticsearch/elastic-certificates.p12" "read")];
Nov 21 17:21:02 ecs12 systemd-entrypoint[2960025]: Likely root cause: java.security.AccessControlException: access denied ("java.io.FilePermission" "/usr/share/elasticsearch/elastic-certificates.p12" "read")

这个是 Elasticsearch 对证书位置的要求,一定要放到正确的目录下才可以。

6.3 生成证书时报错 No such file or directory

上面在执行命令:elasticsearch-certutil cert --ca elastic-stack-ca.p12 时如果报错 No such file or directory,那么原因是程序的工作目录是在 /usr/share/elasticsearch 而用户当前没有在此目录下,所以需要进入目录:

cd /usr/share/elasticsearch

进入目录后再次生成即可,或者时指定 elastic-stack-ca.p12 使用绝对路径也是可以的。