第1章 Elasticsearch 8.X 概述
1.1 Elasticsearch 8.X
距 2019 年 Elasticsearch 上一大版本 7.0 发布至今已经过去了 3 年。2022 年 2 月 11 日,Elasticsearch 发布了全新的 8.0 正式版本,这着实给了我们不
小的惊喜!新版本中通过改进 Elasticsearch 的矢量搜索功能、对现代自然语言处理模型的
原生支持、不断简化的数据上线过程,以及精简的安全防护体验 ,在速度、扩展幅度、相关
性和简便性方面,让搜索引擎技术迎来了一个全新的时代。
1.2 Elasticsearch 新特性
从 2019 年 4 月 10 日 Elasticsearch7.0 版本的发布,到 2022 年 2 月 11 日 Elasticsearch8.0
版本的发布的近 3 年间,基于不断优化的开发设计理念,Elasticsearch 发布了一系列的小版
本。这些小版本在以下方面取得了长足的进步并同时引入一些全新的功能:
➢ 减少内存堆使用,完全支持 ARM 架构,引入全新的方式以使用更少的存储空间,从
而让每个节点托管更多的数据
➢ 降低查询开销,在大规模部署中成效尤为明显
➢ 提高日期直方图和搜索聚合的速度,增强了页面缓存的性能,并创建了一个新的
"pre-filter"搜索短语
➢ 在 Elasticsearch 7.3 和 Elasticsearch 7.4 版中,引入了对矢量相似函数的支持
在最新发布的 8.0 版本中,也同样增加和完善了很多新的功能
➢ 增加对自然语言处理 (NLP) 模型的原生支持,让矢量搜索功能更容易实现,让客户和
员工能够使用他们自己的文字和语言来搜索并收到高度相关的结果。
➢ 直接在 Elasticsearch 中执行命名实体识别、情感分析、文本分类等,而无需使用额外
的组件或进行编码。
➢ Elasticsearch 8.0 基于 Lucene 9.0 开发的,那些利用现代 NLP 的搜索体验,都可以借
助(新增的)对近似最近邻搜索的原生支持,快速且大规模地实现。通过 ANN,可以
快速并高效地将基于矢量的查询与基于矢量的文档语料库(无论是小语料库、大语料库
还是巨型语料库)进行比较。
➢ 可以直接在 Elasticsearch 中使用 PyTorch Machine Learning 模型(如 BERT),并在
Elasticsearch 中原生使用这些模型执行推理。
第2章 Elasticsearch 安装 & 使用
2.1 Java 17 安装
从官网截图上可以看到,Elasticsearch最新版本也终于开始拥抱号称史上最快的JDK了。
所以在安装 ES 软件前,需要下载使用 Java JDK17
2.1.1 下载软件
Java 的官方地址:https://www.oracle.com/java
下载地址:https://www.oracle.com/java/technologies/downloads
2.1.2 软件升级
对于 Java 开发人员来讲,更熟悉的开发版本应该是 JDK1.8,突然需要升级到 JDK17,
其实本身会感觉有点不适应,甚至会有点排斥。担心升级后会对现有的程序代码造成影响。
其实,对于 JDK1.8,最新版本的 JDK17 增加了很多的语法特性:
对于大多数项目而言,想要利用这些新的特性,是需要修改代码的,但性能除外。也就是说,
升级 JDK 版本,现有代码即使不进行修改,也不会出现兼容问题,但性能会得到极大的提
升,并且高吞吐量垃圾回收器比低延迟垃圾回收器更快,更重要的是它可以免费商用。
对于升级版本而言,如果你依然有顾虑,一个好的消息就是我们可以下载含有适配 JDK
的 ES 版本,上面提到的内容基本上就不用考虑,一切就是这么顺滑,对吗?
2.2 Elasticsearch 安装 & 使用
2.2.1 下载软件
Elasticsearch 的官方地址:https://www.elastic.co/cn/
我们选择略早的 8.1.0 版本
下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
可以根据情况自行选择不同操作系统的版本
2.2.2 安装软件
本课程着重讲解新版 ES 软件的特性及应用,所以采用 linux 集群配置。
- 集群规划
为了演示软件的使用,我们这里准备三台 linux 虚拟机,用于配置 Elasticsearch 集群。
启动集群后,每台虚拟机的进程如下:
- 将压缩包 elasticsearch-8.1.0-linux-x86_64.tar.gz 上传到虚拟机中
解压缩文件到自定义路径,笔者解压路径为:/opt/module,解压后,软件路径为:
/opt/module/elasticsearch-8.1.0
java
# 切换目录
cd software
# 解压缩
tar -zxvf elasticsearch-8.1.0-linux-x86_64.tar.gz -C /opt/module
解压后的 Elasticsearch 的目录结构如下
-
当前安装 ES 版本为 8.1.0,自带 JDK,所以当前 Linux 虚拟机节点无需配置 Java 环境
-
创建 linux 新用户 es, 数据文件,证书目录, 并修改 Elasticsearch 文件拥有者
java
# 新增 es 用户
useradd es
# 为 es 用户设置密码
passwd es
# 创建数据文件目录
mkdir /opt/module/elasticsearch-8.1.0/data
# 创建证书目录
mkdir /opt/module/elasticsearch-8.1.0/config/certs
#切换目录
cd /opt/module/elasticsearch-8.1.0
# 修改文件拥有者
chown -R es:es /opt/module/elasticsearch-8.1.0
- 在第一台服务器节点 es-node-1 设置集群多节点通信密钥
java
# 切换用户
su es
# 签发 ca 证书,过程中需按两次回车键
bin/elasticsearch-certutil ca
# 用 ca 证书签发节点证书,过程中需按三次回车键
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 将生成的证书文件移动到 config/certs 目录中
mv elastic-stack-ca.p12 elastic-certificates.p12 config/certs
- 在第一台服务器节点 es-node-1 设置集群多节点 HTTP 证书
java
# 签发 Https 证书
bin/elasticsearch-certutil http
# 以下是每次要求输入时,需要输入的内容
解压刚刚生成的 zip 包
java
# 解压文件
unzip elasticsearch-ssl-http.zip
将解压后的证书文件移动到 config/certs 目录中
# 移动文件
mv elasticsearch/http.p12 kibana/elasticsearch-ca.pem config/certs
- 修改主配置文件:config/elasticsearch.yml
java
# 设置 ES 集群名称
cluster.name: es-cluster
# 设置集群中当前节点名称
node.name: es-node-1
# 设置数据,日志文件路径
path.data: /opt/module/elasticsearch-8.1.0/data
path.logs: /opt/module/elasticsearch-8.1.0/log
# 设置网络访问节点
network.host: linux1
# 设置网络访问端口
http.port: 9200
# 初始节点
discovery.seed_hosts: ["linux1"]
# 安全认证
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
enabled: true
keystore.path: /opt/module/elasticsearch-8.1.0/config/certs/http.p12
truststore.path: /opt/module/elasticsearch-8.1.0/config/certs/http.p12
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path:
/opt/module/elasticsearch-8.1.0/config/certs/elastic-certificates.p12
truststore.path:
/opt/module/elasticsearch-8.1.0/config/certs/elastic-certificates.p12
# 此处需注意,es-node-1 为上面配置的节点名称
cluster.initial_master_nodes: ["es-node-1"]
http.host: [_local_, _site_]
ingest.geoip.downloader.enabled: false
xpack.security.http.ssl.client_authentication: none
- 启动 ES 软件
java
# 启动 ES 软件
bin/elasticsearch
第一次成功启动后,会显示密码,请记住,访问时需要。只有第一次才有哟!
上面图形内容因为涉及到多节点集群配置以及 kibana 配置,所以极其重要!!!
如果没有出现上面图片,出现下面图片也可以按照指定方式进行配置。
注意:9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的
http 协议 RESTful 端口。
- 访问服务器节点 https://虚拟机地址:9200
因为配置了安全协议,所以使用 https 协议进行访问,但由于证书是自己生成的,并不
可靠,所以会有安全提示
选择继续即可
输入账号,密码登录即可
- 修改集群中其他节点的配置文件:config/elasticsearch.yml
linux2: 证书直接拷贝,其他步骤完全相同,配置文件中修改如下内容即可
java
# 设置节点名称
node.name: es-node-2
# 设置网络访问主机
network.host: linux2
linux3:证书直接拷贝,其他步骤完全相同,配置文件中修改如下内容即可
java
# 设置节点名称
node.name: es-node-3
# 设置网络访问主机
network.host: linux3
- 依次启动集群的三台服务器节点, 不要忘记切换用户后再启动
linux1:
java
# 后台启动服务
bin/elasticsearch -d
linux2:
# 后台启动服务
bin/elasticsearch -d
linux3:
# 后台启动服务
bin/elasticsearch -d
2.2.3 问题解决
➢ Elasticsearch 是使用 java 开发的,8.1 版本的 ES 需要 JDK17 及以上版本。默认安装包
中带有 JDK 环境,如果系统配置 ES_JAVA_HOME 环境变量,那么会采用系统配置的
JDK。如果没有配置该环境变量,ES 会使用自带捆绑的 JDK。虽然自带的 JDK 是 ES
软件推荐的 Java 版本,但一般建议使用系统配置的 JDK。
➢ Windows 环境中出现下面的错误信息,是因为开启了 SSL 认证
修改 config/elasticsearch.yml 文件,将 enabled 的值修改为 false
java
# Enable encryption for HTTP API client connections, such as Kibana, Logstash,
and Agents
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
➢ 启动成功后,如果访问 localhost:9200 地址后,弹出登录窗口
第一次启动时,因为开启了密码验证模式,在启动窗口中会显示输入账号和密码。如果
没有注意到或没有找到账号密码,可以设置免密登录:
java
# Enable security features
xpack.security.enabled: false
➢ 双击启动窗口闪退,通过路径访问追踪错误,如果是"空间不足",请修改
config/jvm.options 配置文件
java
# 设置 JVM 初始内存为 1G。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配
内存
# Xms represents the initial size of total heap space
# 设置 JVM 最大可用内存为 1G
# Xmx represents the maximum size of total heap space
-Xms4g
-Xmx4g
➢ 启动后,如果密码忘记了,怎么办?可以采用指令重置密码
java
# 使用 es 用户,执行指令,重置 elastic 用户密码
bin/elasticsearch-reset-password -u elastic
如果只启动单一节点,此操作可能会失败,至少启动 2 个节点,测试成功
2.3 Kibana 安装 & 使用
Elasticsearch 的开源分析可视化工具,与存储在 Elasticsearch 中的数据进行交互
2.3.1 下载软件
Elasticsearch 下载的版本是 8.1.0,这里我们选择同样的 8.1.0 版本
下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana
2.3.2 安装软件
本课程着重讲解新版 ES 软件的特性及应用,所以对应的 Kibana 也采用 linux 集群配置。
- 将压缩包 kibana-8.1.0-linux-x86_64.tar.gz 上传到虚拟机中
解压缩文件到自定义路径,笔者解压路径为:/opt/module,解压后,软件路径为:
/opt/module/kibana-8.1.0
java
# 切换目录
cd software
# 解压缩
tar -zxvf kibana-8.1.0-linux-x86_64.tar.gz -C /opt/module
解压后的 kibana 的目录结构如下:
- 给 Kibana 生成证书文件
java
# 在 ES 服务器中生成证书,输入回车即可
cd /opt/module/elasticsearch-8.1.0
bin/elasticsearch-certutil csr -name kibana -dns linux1
# 解压文件
unzip csr-bundle.zip
# 将解压后的文件移动到 kibana 的 config 目录中
mv kibana.csr kibana.key /opt/module/kibana-8.1.0/config/
# 生成 crt 文件
openssl x509 -req -in kibana.csr -signkey kibana.key -out kibana.crt
- 修改配置文件:kibana.yml
java
# 服务端口
server.port: 5601
# 服务主机名
server.host: "linux1"
# 国际化 - 中文
i18n.locale: "zh-CN"
# ES 服务主机地址
elasticsearch.hosts: ["https://linux1:9200"]
# 访问 ES 服务的账号密码
elasticsearch.username: "kibana"
elasticsearch.password: "fnqIYLQGv81iyW5nWeZ-"
elasticsearch.ssl.verificationMode: none
elasticsearch.ssl.certificateAuthorities:
[ "/opt/module/elasticsearch-8.1.0/config/certs/elasticsearch-ca.pem" ]
server.ssl.enabled: true
server.ssl.certificate: /opt/module/kibana-8.1.0/config/kibana.crt
server.ssl.key: /opt/module/kibana-8.1.0/config/kibana.key
- 修改软件目录拥有者
java
# 切换目录
chown -R es:es /opt/module/kibana-8.1.0/
- 切换用户,启动软件
java
# 切换用户
su es
# 启动软件
bin/kibana
# 也可以后台启动
nohup /opt/module/kibana-8.1.0/bin/kibana >kibana.log 2>&1 &
2.3.3 应用软件
打开浏览器,输入访问地址
输入 elastic 账号和密码即可访问