Elasticsearch 8.6.2 集群安装

👋推荐使用最新的容器化方式部署 Elasticsearch,过程更加简单快捷。👉 Elasticsearch 集群容器化部署

1.前提条件

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

2.环境和参数准备

  1. 集群共计划配置 3 个节点,主机名分别为:ecs16ecs17ecs18
  2. Elasticsearch 的数据目录定为:/data/elasticsearch,生产环境通常使用挂载的数据盘,建议为固态盘。
  3. 主机对应的 IP 地址分别为:192.168.11.16192.168.11.17192.168.11.18 和 hosts 配置是一致的。

新版本的 Elasticsearch 集群默认开启了基本认证、节点间通信和客户端通信的 SSL 认证,推荐用于生产系统,配置过程为逐步添加的方式,过程中配置失误或者顺序不对很容易出现异常问题,请认真按照文档的说明和顺序配置,以保证整个安装过程顺利。

3.配置安装过程

3.1.安装与配置修改

首先需要在每个节点上都完成安装和基本的配置修改,注意先不要启动:

# 在所有节点上安装 RPM 包
rpm -ivh elasticsearch-8.6.2-x86_64.rpm

安装之后修改配置文件,配置文件位置在 /etc/elasticsearch/elasticsearch.yml,以 ecs16 为例修改如下:

# 集群名称, 所有节点必须配置相同名称
cluster.name: es-cluster
# 节点名称, 每个节点唯一,配置为主机名即可
node.name: ecs16
# 数据存放目录
path.data: /data/elasticsearch
# 日志存放目录 默认即可
path.logs: /var/log/elasticsearch
# 开启内存锁定 避免换出
bootstrap.memory_lock: true
# 该节点的 IP 地址
network.host: 192.168.11.16
# HTTP 端口
http.port: 9200
# HTTP 绑定的主机或 IP 多网卡的情况下务必配置
http.host: 192.168.11.16
# TCP 集群通信端口
transport.port: 9300
# TCP 绑定的主机或 IP 多网卡的情况下务必配置
transport.host: 192.168.11.16

# ========= 下面是安全配置 保持默认即可 ============
xpack.security.enabled: true
xpack.security.enrollment.enabled: true

# HTTP 证书
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# TCP 安全
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
# ==============================================

# 下面配置为安装后自动生成的,仅在第一次启动时使用,保持默认即可
cluster.initial_master_nodes: ["ecs16"]

其他机器的配置方式都一样,注意各自主机名和 IP 一定要修改正确。

然后在所有节点创建数据目录:

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

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

systemctl edit elasticsearch.service 

然后输入如下内容:

[Service]
LimitMEMLOCK=infinity

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

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

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

systemctl daemon-reload

为了方便后续运行命令,需要在每个节点上都引入环境变量:

export PATH=$PATH:/usr/share/elasticsearch/bin

建议配置到 /etc/profile 中永久生效。

3.2.启动集群中 1 个节点

我们运行 Elasticsearch 的模式是先按照其中 1 个节点启动为一个单节点集群,然后再通过其他节点加入集群,最终完成整个集群的搭建,这里选择 ecs16 先启动 Elasticsearch 服务:

# 在 ecs16 上面执行
systemctl start elasticsearch.service

启动可能比较慢,耐心等待启动成功,然后设置 elastic 用户的密码:

elasticsearch-reset-password -i -u elastic

然后根据提示输入密码即可,然后访问 Elasticsearch 服务看是否正常:

# 执行后输入密码即可查看集群信息
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://ecs16:9200

返回正常说明当前节点启动完成。

3.3.配置其他节点加入单节点集群

目前 3 个节点只有 ecs16 完成了启动,可以看作是一个单节点的集群,下面需要分别将 ecs17 和 ecs18 这两个节点加进去,首先需要从 ecs16 上生成 token:

elasticsearch-create-enrollment-token -s node

然后会生成 token 字符串,我们可以复制这个字符串,然后分别在其余两个节点执行:

# ecs17 和 ecs18 上都要执行一次
elasticsearch-reconfigure-node --enrollment-token <token>

执行之后会有提示,输入 Y 确认即可。

执行之后会自动从配置文件中移除 cluster.initial_master_nodes 配置,并且添加 discovery.seed_hosts 配置指向刚才启动的 ecs16 节点,这个配置过程都是自动的。

如果生成 token 之后隔了太长时间,可能会失效,要再生成一次新的 token 再添加节点。

3.4.其余节点启动服务

上面我们通过 token 添加了节点,此时服务还未启动,下面分别在其余的节点启动 Elasticsearch 服务:

# 分别在 ecs16 和 ecs17 上执行
systemctl start elasticsearch.service

启动成功之后可以查看状态:

systemctl status elasticsearch.service

设置开机跟随系统启动:

systemctl enable elasticsearch.service

如果启动时查看 ecs16 节点的日志 /var/log/elasticsearch/es-cluster.log 可以看到集群状态的变化:

20230414173253.jpg

状态由 YELLOW 变为 GREEN。

3.5.验证服务

集群启动没问题,可以访问任意节点查看集群节点情况:

curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://ecs17:9200/_cat/nodes?v

正常返回所有的节点,例如:

ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.11.17            1          77  11    2.71    2.53     3.46 cdfhilmrstw -      ecs17
192.168.11.16            0          83  15    1.79    2.25     4.00 cdfhilmrstw *      ecs16
192.168.11.18            1          66   8    0.56    1.13     2.53 cdfhilmrstw -      ecs18

这样说明 Elasticsearch 集群已经安装成功了。

安装成功后还有一点配置需要注意的就是要编辑配置文件添加 discovery.seed_hosts 配置,每个节点要配置发现集群中的其他节点:

# 节点发现配置,需要配置除当前节点外的其他节点 默认端口为 9300
# ecs16 上面配置
discovery.seed_hosts: ["ecs17", "ecs18"]

# ecs17 上面配置
discovery.seed_hosts: ["ecs16", "ecs18"]

# ecs18 上面配置
discovery.seed_hosts: ["ecs16", "ecs17"]

其实刚才在使用 token 添加节点的时候 ecs17 和 ecs18 会自动配置 discovery.seed_hosts 的值为 ["192.168.11.16:9300"],所以不修改也可以,建议补全一下比较好,但是 ecs16 上必须添加上该配置,否则下次启动后无法加入集群。

上面的配置项放到最后配置是因为如果提前写上在使用 token 添加节点时会报错如下:

Skipping security auto configuration because this node is configured to bootstrap or to join a multi-node cluster, which is not supported.

这样就无法添加成功,从而必须重装就比较麻烦,所以先添加成功节点后再修改配置比较好。

3.6.FAQ

3.6.1.通过 token 添加节点时报错

  1. 情况1 未添加先启动的情况

如果在执行添加节点命令时,出现下面的报错:

Skipping security auto configuration because it appears that the node is not starting up for the first time. The node might already be part of a cluster and this auto setup utility is designed to configure Security for new clusters only

或者是:

Skipping security auto configuration because it appears that security is already configured.

那么原因很可能是添加节点之前先启动了服务,那么在这种情况下 Elasticsearch 认为当前节点是一个新的集群,因此就无法再加入其他的集群了,所以这也是开始为什么说一定不要先启动 Elasticsearch 的原因,这种情况可以先彻底清除 Elasticsearch 然后重新安装它,操作如下:

# 卸载 elasticsearch
yum remove elasticsearch
# 清理目录
rm -rf /usr/share/elasticsearch/
rm -rf /etc/elasticsearch/
rm -rf /data/elasticsearch/

然后重新按照上面的步骤安装,安装之后不要启动,先使用 token 加入集群,加入成功后再启动程序就可以了。

参考:https://discuss.elastic.co/t/error-skipping-security-auto-configuration-because-it-appears-that-the-node-is-not-starting-up-for-the-first-time-the-node-might-already-be-part-of-a-cluster-and-this-auto-setup-utility-is-designed-to-configure-security-for-new-clusters-only/300568/1

  1. 情况2 添加节点时报通信错误

如果出现下面的报错:

Unable to communicate with the node on https://10.42.0.1:9200/_security/enroll/node Error was Connection refused

ERROR: Aborting enrolling to cluster. Could not communicate with the node on any of the addresses from the enrollment token. All of [10.42.0.1:9200] were attempted.

这个报错说明明显是端口不通,原因就是当前集群可能存在多张网卡或者存在 K8S 或者 Docker 等网络环境,假如最初 Elasticsearch 监听的 IP 是 0.0.0.0 也就是所有的网卡,那么就有可能出现使用其他网卡通信的情况,所以要求配置必须明确指定通信的 IP:

http.host: 192.168.11.16
transport.host: 192.168.11.16

修改完成之后重启主节点的 Elasticsearch 服务,但是 token 仍然是之前生成的,所以保存的信息仍然是修改配置之前的,所以这种情况下就会报上面的错误,因此必须要重新生成一次 token:

# 在主节点重新生成节点 token
elasticsearch-create-enrollment-token -s node

但是由于其他节点刚才添加时已经失败,配置都被自动清空了,所以再次添加时仍然会报错,所以需要按照第一个方法先完全卸载 Elasticsearch 后再重新安装并进行配置,然后再执行命令加入节点:

elasticsearch-reconfigure-node --enrollment-token <token>

加入没问题然后再启动 Elasticsearch 服务即可。

参考链接:https://discuss.elastic.co/t/bug-could-not-communicate-with-the-node-from-the-enrollment-token/306189/7

  1. 情况3 提前添加了 discovery.seed_hosts 导致的错误

Skipping security auto configuration because this node is configured to bootstrap or to join a multi-node cluster, which is not supported.

这种情况上面已经说了,必须先添加节点再修改配置才可以。

3.6.2 启动时报错

bootstrap check failure [1] of [1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

原因是没有配置 discovery.seed_hosts 或者 cluster.initial_master_nodes,可能是因为删除配置后忘记添加导致,正常集群需要添加 discovery.seed_hosts 配置为发现其他节点,然后再次启动就可以了。

Reference:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/8.6/rpm.html