1、开发环境操作系统
1.1 选择Windows、Mac or Linux
首先明确一点:我们的首要目的是要快速上手使用Elasticsearch(以下简称ES),安装和部署ES并非重点,企业中真正需要你去安装的可能性或者机会非常小。大家可以想一想,对于刚入职的你来说,公司内部一般来说都已经有了一套完整的技术架构,让你亲自动手搭建除非是公司架构重构或者你作为公司技术团队的核心或者运维。
所以关于ES的安装,我们在基础篇不多做介绍,如果的确有需要,我会在进阶篇和运维篇,分别讲解基于CentOS、K8S搭建ES集群、部署ELK等从零到一完整详细讲解。建议大家跟随课程大纲学习,效率更高。
**结论:**建议选择Windows或者MacOS,不推荐Linux图形化界面学习(极客除外)。当然这并非绝对,如果你钟爱Linux图形化界面,并非不可以。但须知道,服务器上使用Linux非图形界面,基于Linux的开发和生产环境的部署方式大相径庭,在开发环境中学习到的Linux安装部署完全不适用于生产环境(生产环境的安装部署在运维篇讲解)。
1.2 选择虚拟机还是本地安装
基础篇内容关于ES安装部署限于Elasticsearch的自动发现和基本配置,集群配置相关内容在进阶篇-Elastic分布式原理中讲解,因此为了更高效的学习,建议基于OS本地多节点的部署方式部署集群,或者单节点模式启动均可。
2、Java版本选择
2.1 ES与JDK兼容性
Java 9、Java 10、Java 12 和 Java 13 均为短期版本。不建议使用。有关 JVM 支持,参考 Oracle 的时间表,网址为:http://www.oracle.com/technetwork/java/eol-135779.html
Elastic 支持部分 OpenJDK 派生的分发版:
- 由 IcedTea 项目构建;
- 操作系统供应商在“产品和操作系统”矩阵中生产并通过 TCK 测试的产品;
- Azul Zulu 从 Elasticsearch 6.6.0 版开始。
结论:
- 对于ES 8.0 而言,JDK版本只有一个选择,即 JDK 17
- 对于ES 8.1 及以上版本而言,支持 JDK 17、JDK 18
JDK兼容性:https://www.elastic.co/cn/support/matrix#matrix_jvm
操作系统兼容性:https://www.elastic.co/cn/support/matrix
自身兼容性:https://www.elastic.co/cn/support/matrix#matrix_compatibility
2.2 Java下载
各大版本jdk国内镜像:https://www.injdk.cn/
ARM JDK:https://www.azul.com/downloads/?version=java-8-lts&os=macos&package=jdk
程序员大礼包:https://www.programmer-box.com/?ref=jdk_1.8
2.3 不同系统下Java环境的安装
此处略过安装过程,如果无安装jdk基础,可自行百度
另外,从7.x开始,以后的版本ES均自带jdk,所以可即使不安装jdk也可正常运行ES。
3、安装Elastic离线文档
3.1 资源和软件下载
安装教程:Win、Mac 双系统 Elasticsearch离线文档(支持选择版本)安装部署教程
- Zeal(文档查看工具):
- Elastic开源社区星球下载链接:
- Windows:https://t.zsxq.com/bmayvZB
- Mac:https://t.zsxq.com/6UjmqjI
- Zeal官网下载链接(速度较慢):https://zealdocs.org/
- 8.3 版本文档集:
- Elastic开源社区星球下载链接:https://t.zsxq.com/fYvfeaY
4、下载和安装ES
4.1 SDK下载地址
- 官方下载: https://www.elastic.co/cn/downloads/past-releases#elasticsearch
- 开源社区下载站:http://www.elastic.org.cn/download
4.2 Elasticsearch目录结构
目录名称 | 描述 |
bin | 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等。 |
config | 配置文件目录,如elasticsearch配置、角色配置、jvm配置等。 |
lib | elasticsearch所依赖的java库。 |
data | 默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境要求必须修改。 |
logs | 默认的日志文件存储路径,生产环境务必修改。 |
modules | 包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。 |
plugins | 已经安装的插件的目录。 |
jdk/jdk.app | 7.x 以后特有,自带的 java 环境,8.x版本自带 jdk 17 |
5、基础配置
- cluster.name:集群名称,节点根据集群名称确定是否是同一个集群。默认名称为 elasticsearch,但应将其更改为描述集群用途的适当名称。不要在不同的环境中重用相同的集群名称。否则,节点可能会加入错误的集群
- node.name:节点名称,集群内唯一,默认为主机名。,但可以在配置文件中显式配置
- network.host: 节点对外提供服务的地址以及集群内通信的ip地址,例如127.0.0.1和 [::1]。
- http.port:对外提供服务的端口号,默认 9200
- transport.port:节点通信端口号,默认 9300
6、开发模式和生产模式
开发模式:开发模式是默认配置(未配置集群发现设置),如果用户只是出于学习目的,而引导检查会把很多用户挡在门外,所以ES提供了一个设置项discovery.type=single-node。此项配置为指定节点为单节点发现以绕过引导检查。
生产模式:当用户修改了有关集群的相关配置会触发生产模式,在生产模式下,服务启动会触发ES的引导检查或者叫启动检查(bootstrap checks),所谓引导检查就是在服务启动之前对一些重要的配置项进行检查,检查其配置值是否是合理的。引导检查包括对JVM大小、内存锁、虚拟内存、最大线程数、集群发现相关配置等相关的检查,如果某一项或者几项的配置不合理,ES会拒绝启动服务,并且在开发模式下的某些警告信息会升级成错误信息输出。引导检查十分严格,之所以宁可拒绝服务也要阻止用户启动服务是为了防止用户在对ES的基本使用不了解的前提下启动服务而导致的后期性能问题无法解决或者解决起来很麻烦。因为一旦服务以某种不合理的配置启动,时间久了之后可能会产生较大的性能问题,但此时集群已经变得难以维护和扩展,ES为了避免这种情况而做出了引导检查的设置,本来在开发模式下为警告的启动日志会升级为报错(Error)。这种设定虽然增加了用户的使用门槛,但是避免了日后产生更大的问题。
7、服务的安装和启动(基于Security开启)
注意
ES 8 默认启动Security,这对新手学习很不友好,实际上违背了Elastic官方设置开发模式的初衷,安全固然重要,但是没必要把门槛设置这么高,建议官方在后续更新中,把Security在开发模式中默认关闭,在生产模式下,默认开启。这样更加合理。
本章内容基于默认开启Security进行单机和集群环境部署,在基础学习过程中,本不应该把经历花费在集群安全这件事情上,固然它很重要,但它本身属于运维范畴,而且对于初学者来说学习难度较大,有些本末倒置。对于刚接触ES的同学来说,更重要的应该是学习如何去快速上手和使用ES,让其为自身和公司带来价值。在基础篇中,本课程将不涉及深层次原理和ES运维知识。与ES集群相关的配置,将限于基本配置和原理范围。建议学习者根据自己的的情况选择是否学习本章(服务安装和启动)以及下一章(基于Security构建本地集群)的内容。
本课程将在高手篇:底层原理与源码中讲解ES的分布式原理、高可用性原理等进阶知识,将在运维篇:ES运维及安全详细讲解ES集群的高级用法及详细的集群安全配置教程,基于上述原因,建议初学者跳过第7节内容**。**
7.1 创建ES服务账号
ES不允许使用root
账号启动服务,如果你当前账号是root
,则需要创建一个专有账户(以下命令均在root账户下执行,windows系统在power shell下执行)。如果你的账号不是root
账号,此步骤可以跳过
useradd elastic passwd elastic chown -R elastic:elastic {{espath}}
7.2 单节点集群
7.2.1 启动命令
7.2.2 启动日志
ES在 7.x 版本时,控制台输出 started 时代表服务启动成功,和 7.x 版本不同,
ES 8.x 启动之后会输出以下信息,此时服务已经启动成功了。
首次启动 Elasticsearch 时,会自动进行以下安全配置:
- 为传输层和 HTTP 层生成 TLS 证书和密钥。
- TLS 配置设置被写入elasticsearch.yml.
- 为 elastic 用户生成密码。
- 为 Kibana 生成一个注册令牌。
红框1:ES为我们生成的elastic
账户的默认密码,重要,需要复制记下来
红框2:CA证书的密钥信息,暂时先不管
红框3:ES为Kibana生成的访问令牌,Kibana访问ES服务需要用到。(有效期为 30 分钟)
红框4:ES位其他节点加入集群生成的访问令牌,当前集群中需要加入新节点时,需要携带此令牌(有效期为 30 分钟)
然后您可以启动 Kibana 并输入有效期为 30 分钟的注册令牌。此令牌自动应用 Elasticsearch 集群中的安全设置,使用内置kibana服务帐户向 Elasticsearch 进行身份验证,并将安全配置写入kibana.yml
7.2.3 修改账号密码
在 ES 8.x版本以后,elasticsearch-setup-passwords设置密码的工具已经被弃用删除,此命令为7.x之前第一次生成密码时使用,8.x在第一次启动的时候会自动生密码。
注意:上述(2.5.3截图)内容仅在第一次启动时显示,如果需要修改账户密码,需进行以下操作
bin/elasticsearch-reset-password [-a, --auto] [-b, --batch] [-E <KeyValuePair] [-f, --force] [-h, --help] [-i, --interactive] [-s, --silent] [-u, --username] [--url] [-v, --verbose]
使用此命令重置本地领域中的任何用户或任何内置用户的密码。默认情况下,系统会为您生成一个强密码。要显式设置密码,请使用 以交互模式运行该工具-i。该命令在 文件领域中生成(并随后删除)一个临时用户,以运行更改用户密码的请求。
-a, --auto
将指定用户的密码重置为自动生成的强密码。(默认)
-b, --batch
运行重置密码过程而不提示用户进行验证。
-E
配置标准 Elasticsearch 或 X-Pack 设置。
-f, --force
强制命令针对不健康的集群运行。
-h, --help
返回所有命令参数。
-i, --interactive
提示输入指定用户的密码。使用此选项显式设置密码。
-s --silent
在控制台中显示最小输出。
-u, --username
本机领域用户或内置用户的用户名。
–url
指定工具用于向 Elasticsearch 提交 API 请求的基本 URL(本地节点的主机名和端口)。默认值由 elasticsearch.yml文件中的设置确定。如果xpack.security.http.ssl.enabled设置为true,则必须指定 HTTPS URL。
-v --verbose
在控制台中显示详细输出。
比如:
为elastic
账号自动生成新密码,输出至控制台
bin/elasticsearch-reset-password -u elastic
手工指定user1
的新密码
bin/elasticsearch-reset-password --username elastic -i
指定服务地址和账户名
bin/elasticsearch-reset-password --url "https://172.0.0.3:9200" --username elastic -i
7.3 验证服务状态
访问服务
在7.x的版本是通过如下地址访问ES服务:http://localhost:9200/
但是在 8.x 的版本访问会看到如下页面:
原因解释
这是正常现象,因为 Elastic 8 默认开启了 SSL,将默认配置项由true
改为false
即可
推荐做法
关闭SSL虽然可以访问服务了,但这本质上是在规避问题而非解决问题,更推荐的做法是使用https
协议进行访问:
https://localhost:9200/
,此时如果你的浏览器版本是比较新的版本会出现以下弹窗提示,即:
解决办法:
在chrome该页面上,直接键盘敲入thisisunsafe
这11个字符(鼠标点击当前页面任意位置,让页面处于最上层即可输入,输入时是没有任何提示也不显示任何字符的,直接输入即可按回车即可),然后你会看到如下提示。
输入账号密码验证:
此时输入账号,也就是在 2.5.4 的启动日志中,红框一内的内容,确定即可访问ES服务,至此,单节点ES服务启动成功。
7.4 构建基于Security的本地集群
向集群中加入新节点
默认情况下,要集群中添加新节点,需要通过令牌来完成节点之间的通信,在第一个节点启动的时候,控制台会输出令牌信息(2.5.3 启动日志中的红框4中的Token),注意启动的时候
bin/elasticsearch --enrollment-token <token> //启动的时候替换<token>,不要待带括号 比如: bin/elasticsearch --enrollment-token eyJ2ZXIiOiI4LjEuMCIsImFkciI6WyIxOTIuMTY4LjMuMTAwOjkyMDEiXSwiZmdyIjoiMWJkMTE0OWMzMTJjYzc5MGU1ZWU1YTgzZjlhZWRjMmU2MDkyN2Y2MWVkZDA0ZWU0YTAxZTk2MTVlYzJkODhlYiIsImtleSI6Ilo3elc0bjhCVk1ESEdsMmFzdDVNOkZTWVhrMHV3UjgyUzNlTFFERFlkdncifQ==
如下图为一个基于ES 8.x 的三节点集群:
7.5 部署Kibana
直接启动Kibana服务,控制台显示以下信息
然后我们访问控制台输出的Kibana的服务地址,在页面提示中输入 7.2.2 红框三中的访问令牌,确定即可。
8、服务的安装和启动(基于Security关闭)
本小节将讲解基于关闭Security
的前提下,构建Elasticsearch的基本环境,包括单节点环境和基于自动发现的基本集群环境。并且会收录若干集群使用的基本技巧,这对新手来说可以很大程度上提高学习效率,十分友好。
8.1 关闭Security
前面内容已经多次阐述,ES 8 默认是开启Security
的,我们现在需要修改器配置文件使其关闭Security
。打开 Config 目录,修改 elasticsearch.yml 文件,删除文件内所有内容,配置以下信息:
xpack.security.enabled: false
此时,配置文件中仅一行代码:
8.2 启动单机服务
ES不允许使用root
账号启动服务,如果你当前账号是root
,则需要创建一个ES的专用账户,此步骤课参考 7.1 小节操作。如果当前账户不是root
账户,此步骤忽略即可。
8.2.1 启动命令:同 7.2.1
8.2.2 启动日志
服务正常启动,没有报信息会输出elected-as-master
,此时集群已经启动成功,访问http://127.0.0.1:9200
或者http://localhost:9200
即可,注意如果在地址栏手工输入http://
,默认可能使用https
。
看到以下界面,即代表服务启动成功。
8.3 部署本地集群
在基础篇,不建议基于Linux、docker或K8S部署远程集群,同时在基础篇也不会涉及这些内容的讲解,如需查看基于生产环境的集群部署方案,请移步运维篇
。
那么推荐初学者基于本地多节点的方式部署,采用自动发现机制来部署集群,也就是不需要配置任何 Discover 模块的配置,也就是说任何和集群配置相关的配置项均保持注释状态,仅仅修改一下集群、节点名称即可。或者不做任何配置亦可。
8.3.1 单项目多节点启动
8.3.2 多项目多节点启动
操作系统 | 脚本 |
MacOS | open /node1/bin/elasticsearch open /node2/bin/elasticsearch open /node3/bin/elasticsearch |
windows | start D:\node1\bin\elasticsearch.bat start D:\node2\bin\elasticsearch.bat start D:\node3\bin\elasticsearch.bat |
8.4 部署 Kibana
示例**:**下图中包含一个3节点集群,每个节点都是独立的SDK文件
**验证服务状态:**浏览器执行 http://localhost:9200/_cat/nodes
(注意,这里和单节点启动方式不同)
优点:配置简单,一劳永逸
缺点:占用较多磁盘空间,因为每个节点都有一套独立的SDK文件,大约几百MB。
9、推荐安装的几款浏览器插件
10、对于初学者的建议(提高生产力,高效学习方法!)
- 有所舍,有所学:学习理论基础不要执着于非要在Linux集群环境下进行,基于Linux环境部署ES服务属于运维范畴,不管是面试还是工作,能让你真正去做这件事的机会很少。在基础阶段,我们更应该把时间花在刀刃上,花在收益比更高的事情上。在基础掌握不牢固的前提下,这样只会耽误更多时间。
- 时间花在刀刃上:基础篇课程多以应用技术为主,也就是主要是学习如何去使用ES,不会有太多原理性内容,原理、源码、算法等内容均在进阶篇中包含。学习过程一定要有目标和针对性,要明白自己要做什么,要学会什么。技术的学习的目标要以能“变现”为主,说白了有益于升职加薪,其次才是才是提升技能。如果你提升的所谓技能,对自己将来的工作甚至长远考虑,基本没有机会用到,或者可能性很小,那么一定要把它排在最末优先级。要优先去学习那种“花20%时间学习能提升80%薪资”的内容,其次才是剩下20%,好比一张100分的考卷,最后那20分往往要花更大的代价,甚至远超你学习得80分所需要的知识所花的时间。
- 总结