百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

【Docker】Elasticsearch 8.12 安装与搭建

nanshan 2025-01-13 16:32 7 浏览 0 评论

由于工作过程中硬件资源未能达到要求,现将使用 Elasticsearch 取代原 Redis + MySQL + Milvus 技术栈,在重新搭建的同时记录一下搭建过程(由于之前也分享过 Docker 版本 Elasticsearch 5.x 和 Elasticsearch 7.x 的部署方法,因此本文对分享过的内容将不再重复说明)。

1. 应用部署

虽然最终没有使用 8.14.2 版本,但考虑到实际部署跟这个过程也是大差不差的,因此这段内容还是保留吧。

第一步,先将 Elasticsearch 容器启动起来,如下图:

docker run -d -p 9200:9200 -p 9300:9300 elasticsearch:8.14.2

启动起来后可以进入容器内部将 config、data、plugins 三个目录下载到宿主机(这里为了方便使用了 Docker Desktop 来操作,在命令行下要使用 docker cp 命令进行操作),如下图:

目录下载后结构如下图所示:

如上图所示, elasticsearch.yml 和 jvm.options 可以按需进行修改(配置内容在之前文章已经说明,这里不再细说)。接着挂载目录就可以启动 Elasticsearch 容器,全部命令如下图:

docker run -d \
  --privileged=true \
  --name es_vct \
  --network elknetwork \
  -p 9200:9200 \
  -p 9300:9300 \
  -v ${docker_path}/elasitcsearch8/data:/usr/share/elasticsearch/data \
  -v ${docker_path}/elasitcsearch8/plugins:/usr/share/elasticsearch/plugins \
  -v ${docker_path}/elasitcsearch8/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  --restart=always \
  elasticsearch:8.14.2

但是... OSX 系统在启动后会报以下错误,如下图:

2024-08-06 09:46:51 {"@timestamp":"2024-08-06T01:46:51.542Z", "log.level":"ERROR", "message":"fatal exception while booting Elasticsearch", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.elasticsearch.bootstrap.Elasticsearch","elasticsearch.node.name":"ff06f045201e","elasticsearch.cluster.name":"elastic_vector","error.type":"java.lang.IllegalStateException","error.message":"Plugin [.DS_Store] is missing a descriptor properties file.","error.stack_trace":"java.lang.IllegalStateException: Plugin [.DS_Store] is missing a descriptor properties file.\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginDescriptor.readFromProperties(PluginDescriptor.java:233)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsUtils.readPluginBundle(PluginsUtils.java:255)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsUtils.findBundles(PluginsUtils.java:236)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsUtils.getPluginBundles(PluginsUtils.java:218)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:156)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.NodeServiceProvider.newPluginService(NodeServiceProvider.java:54)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.NodeConstruction.createEnvironment(NodeConstruction.java:451)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.NodeConstruction.prepareConstruction(NodeConstruction.java:252)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.node.Node.<init>(Node.java:192)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.bootstrap.Elasticsearch$2.<init>(Elasticsearch.java:240)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.bootstrap.Elasticsearch.initPhase3(Elasticsearch.java:240)\n\tat org.elasticsearch.server@8.14.2/org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:75)\n"}
2024-08-06 09:46:51 ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/elastic_vector.log

在 github 找到了这个错误的解释,如下图:

(吐槽一下:问题是 2022 年发现的,但 2024 年还没有修复...)

我们按上述方法执行一下删除命令即可消除错误信息,如下图:

rm ${docker_path}/elasitcsearch8/plugins/.DS_Store

接着第二个问题又来了,Elasticsearch 启动到时出现卡顿,如下图:

2024-08-06 10:15:36 Aug 06, 2024 2:15:36 AM sun.util.locale.provider.LocaleProviderAdapter <clinit>
2024-08-06 10:15:36 WARNING: COMPAT locale provider will be removed in a future release
2024-08-06 10:15:36 {"@timestamp":"2024-08-06T02:15:36.723Z", "log.level": "INFO", "message":"Using [jdk] native provider and native methods for [Linux]", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.elasticsearch.nativeaccess.NativeAccess","elasticsearch.node.name":"86f65a8da329","elasticsearch.cluster.name":"docker-cluster"}
2024-08-06 10:15:37 {"@timestamp":"2024-08-06T02:15:37.123Z", "log.level": "INFO", "message":"Java vector incubator API enabled; uses preferredBitSize=512; FMA enabled", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.apache.lucene.internal.vectorization.PanamaVectorizationProvider","elasticsearch.node.name":"86f65a8da329","elasticsearch.cluster.name":"docker-cluster"}

这种“假死”情况大几率是因为配置出现问题了,重新审视一遍配置文件得知, discovery.type 并未正常配置(由于是单体服务,这里需要通过 single-node 进行表示)。

将配置加上后就可以正常启动了。

2. 8.12 版本部署并安装分词(ik)插件

启动成功后添加分词插件,到 github 仓库中找到最新的 release ,如下图:

尝试安装 8.4.1 版本后发现与目前 Elasticsearch 版本不匹配。出现以下报错:

java.lang.IllegalStateException: Plugin [ik] is missing a descriptor properties file

最后实在弄得有点儿烦了就选择了 8.12.2 版本的分词插件,而 Elasticsearch 也降级到 8.12.2 版本。

PS:这里其实我也是不太确定的,尝试了很多次还是安装不上才选择了降级。或许是当时配置也有点错误吧,8.12.2 版本能用我就没有再深究这个问题了。

8.12.2 版本部署过程其实跟 8.14.2 一致(没什么好说的)。接下来只需将分词插件放对位置就能够实现安装,如下图:

在分词插件的 github release 网页中点击打开 8.12.2 的 Assets 折叠区,并选择下载 elasticsearch-analysis-ik-8.12.2.zip 压缩包。下载完成后将其放到 ${docker_path}/elasitcsearch8/plugins 目录下并解压。解压后重命名文件夹为 analysis-ik 并删除 zip 压缩包。之后重启 Elasticsearch 容器 ik 分词插件就会自动安装,最终启动命令如下:

docker run -d \
  --privileged=true \
  --name elasticsearch8 \
  -p 9200:9200 \
  -p 9300:9300 \
  -v ${docker_path}/elasitcsearch8/data:/usr/share/elasticsearch/data \
  -v ${docker_path}/elasitcsearch8/plugins:/usr/share/elasticsearch/plugins \
  -v ${docker_path}/elasitcsearch8/config:/usr/share/elasticsearch/config \
  -v ${docker_path}/elasitcsearch8/logs:/usr/share/elasticsearch/logs \
  -v /etc/localtime:/etc/localtime \
  -e TZ="Asia/Shanghai" \
  -e LANG="C.UTF-8" \
  --restart=always \
  elasticsearch:8.12.2

那么如何验证分词插件安装成功呢?

这时我在 Firefox 浏览器中安装一个 Elasticvue 插件(这个插件还挺好用),对 Elasticsearch 服务提交 REST 分词请求,如下图:

看到上面的输出就证明分词器安装成功。

3. 安装 x-pack 安全插件

这个在之前博客中已经详细说明过一次,在这里我再补充说明一下(主要是跟之前不一样的部分)。

第一步开启 xpack.security 服务,如下图:

注意, xpack 的其他服务都是 false(关闭)状态的,只有 xpack.security.enabled 是 true(开启)状态,不然启动时会报错。之后重启 Elasticsearch 容器,并进入 CLI 控制台先创建 keystore,如下图:

sh-5.0$ ./bin/elasticsearch-keystore create
An elasticsearch keystore already exists. Overwrite? [y/N]y
Created elasticsearch keystore in /usr/share/elasticsearch/config/elasticsearch.keystore

keystore 创建完成后就可以针对“elastic”用户进行 password 重置了,如下图:

sh-5.0$ elasticsearch-reset-password -i -u elastic
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to 

continue [y/N]y

Enter password for [elastic]: 
Re-enter password for [elastic]: 
Password for the [elastic] user successfully reset.

这里可以通过 elasticsearch-reset-password 直接对指定用户进行密码重置(跟之前不同的地方)。

再之后就可以创建 ca 证书了,如下图:

sh-5.0$ ./bin/elasticsearch-certutil ca
...

Please enter the desired output file [elastic-stack-ca.p12]: config/certs/elastic-stack-ca.p12
Enter password for elastic-stack-ca.p12 : 

再之后就可以使用 ca 证书创建密钥,如下图:

sh-5.0$ ./bin/elasticsearch-certutil cert --ca config/certs/elastic-stack-ca.p12
...

Enter password for CA (config/certs/elastic-stack-ca.p12) : 
Please enter the desired output file [elastic-certificates.p12]: config/certs/elastic-certificates.p12
Enter password for elastic-certificates.p12 : 

...

For client applications, you may only need to copy the CA certificate and
configure the client to trust this certificate.

注意,这里的 ca 证书和密钥的 output 目录都是指向 config/certs 。之所以要指向这个目录是因为它已经挂载到宿主机了。万一这个容器被干掉了,还可以直接用回 ca 证书重新生成密钥。

sh-5.0$ ./bin/elasticsearch-keystore add \
> xpack.security.transport.ssl.keystore.secure_password
Enter value for xpack.security.transport.ssl.keystore.secure_password:
sh-5.0$ ./bin/elasticsearch-keystore add \
> xpack.security.transport.ssl.truststore.secure_password
Enter value for xpack.security.transport.ssl.truststore.secure_password: 

最后创建安全连接的密码。

好了,密钥都创建完成了。现在只需在 elasticsearch.yml 开放所有安全校验即可,如下图:

将 transport.ssl 开启并指派密钥的地址(容器内地址),就可以重新启动 Elasticsearch 容器了。

最后使用 Elasticvue 进行测试,看到以上的输出就证明配置成功了。

相关推荐

Let’s Encrypt免费搭建HTTPS网站

HTTPS(全称:HyperTextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入...

使用Nginx配置TCP负载均衡(nginx tcp负载)

假设Kubernetes集群已经配置好,我们将基于CentOS为Nginx创建一个虚拟机。以下是实验种设置的详细信息:Nginx(CenOS8Minimal)-192.168.1.50Kube...

Nginx负载均衡及支持HTTPS与申请免费SSL证书

背景有两台minio文件服务器已做好集群配置,一台是192.168.56.41:9000;另一台是192.168.56.42:9000。应用程序通过Nginx负载均衡调用这两台minio服务,减轻单点...

HTTPS配置实战(https配置文件)

原因现在网站使用HTTPS是规范操作之一,前些日子买了腾讯云服务,同时申请了域名http://www.asap2me.top/,目前该域名只支持HTTP,想升级为HTTPS。关于HTTPS的链接过程大...

只有IP地址没有域名实现HTTPS访问方法

一般来说,要实现HTTPS,得有个注册好的域名才行。但有时候呢,咱只有服务器的IP地址,没注册域名,这种特殊情况下,也能照样实现HTTPS安全访问,按下面这些步骤来就行:第一步,先确认公网...

超详解:HTTPS及配置Django+HTTPS开发环境

众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种。在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数...

Godaddy购买SSL之后Nginx配置流程以及各种错误的解决

完整流程:参考地址:https://sg.godaddy.com/zh/help/nginx-generate-csrs-certificate-signing-requests-3601生成NGI...

Nginx从安装到高可用,一篇搞定(nginx安装与配置详解)

一、Nginx安装1、去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本2、上传nginx到linux系统3、安装依赖环境(1)安装gcc环境yuminstallgc...

阿里云免费证书申请,配置安装,使用tomcat,支持http/https访问

参数说明商品类型默认已选择云盾证书服务(无需修改)。云盾证书服务类型SSL证书服务的类型。默认已选择云盾SSL证书(无需修改),表示付费版SSL证书。如果您需要免费领取或付费扩容DV单域名证书【免费试...

你试过两步实现Nginx的规范配置吗?极速生成Nginx配置小工具

NGINX是一款轻量级的Web服务器,最强大的功能之一是能够有效地提供HTML和媒体文件等静态内容。NGINX使用异步事件驱动模型,在负载下提供可预测的性能。是当下最受欢迎的高性能的Web...

从零开始搭建HTTPS服务(搭建https网站)

搭建HTTPS服务的最初目的是为了开发微信小程序,因为wx.request只允许发起HTTPS请求,并且还必须和指定的域名进行网络通信。要从零开始搭建一个HTTPS的服务需要下面4...

群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问

安全第一步,群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问【新手导向】NAS本质还是一个可以随时随地访问的个人数据存储中心,我们在外网访问的时候,特别是在公网IP下,其实会面临着很多安...

让网站快速升级HTTPS协议提高安全性

为什么用HTTPS网络安全越来越受到重视,很多互联网服务网站,都已经升级改造为https协议。https协议下数据包是ssl/tcl加密的,而http包是明文传输。如果请求一旦被拦截,数据就会泄露产生...

用Https方式访问Harbor-1.9版本(https访问流程)

我上周在头条号写过一篇原创文章《Docker-Harbor&Docker-kitematic史上最详细双系统配置手册》,这篇算是它的姊妹篇吧。这篇文章也将用到我在头条写的另一篇原创文章的...

如何启用 HTTPS 并配置免费的 SSL 证书

在Linux服务器上启用HTTPS并配置免费的SSL证书(以Let'sEncrypt为例)可以通过以下步骤完成:---###**一、准备工作**1.**确保域名已解析**...

取消回复欢迎 发表评论: