👋推荐使用最新的容器化方式部署 Elasticsearch,过程更加简单快捷。👉 Elasticsearch 集群容器化部署
8.6.2
ecs16
、ecs17
、ecs18
/data/elasticsearch
,生产环境通常使用挂载的数据盘,建议为固态盘。192.168.11.16
、192.168.11.17
、192.168.11.18
和 hosts 配置是一致的。新版本的 Elasticsearch 集群默认开启了基本认证、节点间通信和客户端通信的 SSL 认证,推荐用于生产系统,配置过程为逐步添加的方式,过程中配置失误或者顺序不对很容易出现异常问题,请认真按照文档的说明和顺序配置,以保证整个安装过程顺利。
首先需要在每个节点上都完成安装和基本的配置修改,注意先不要启动:
# 在所有节点上安装 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
中永久生效。
我们运行 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 个节点只有 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 再添加节点。
上面我们通过 token 添加了节点,此时服务还未启动,下面分别在其余的节点启动 Elasticsearch 服务:
# 分别在 ecs16 和 ecs17 上执行
systemctl start elasticsearch.service
启动成功之后可以查看状态:
systemctl status elasticsearch.service
设置开机跟随系统启动:
systemctl enable elasticsearch.service
如果启动时查看 ecs16 节点的日志 /var/log/elasticsearch/es-cluster.log
可以看到集群状态的变化:
状态由 YELLOW 变为 GREEN。
集群启动没问题,可以访问任意节点查看集群节点情况:
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.
这样就无法添加成功,从而必须重装就比较麻烦,所以先添加成功节点后再修改配置比较好。
如果在执行添加节点命令时,出现下面的报错:
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
如果出现下面的报错:
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
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.
这种情况上面已经说了,必须先添加节点再修改配置才可以。
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: