3.2 Elasticsearch的安装与配置

常言道:工欲善其事,必先利其器。因此在使用Elasticsearch之前,我们需要安装Elasticsearch。下面介绍Elasticsearch在Windows环境下和在Linux环境下的安装方法。由于Elasticsearch依赖Java环境,因此首先介绍Java环境的安装方法。

3.2.1 安装Java环境

首先下载并安装JDK(JAVA Development Kit)。JDK是整个Java开发的核心,它包含了Java的运行环境、Java工具和Java基础类库。

当前最新版本是JDK 12.0。

1.在Windows环境下安装

下面以jdk-12.0.2_windows-x64_bin.zip为例,展示JDK的安装过程。

首先,将jdk-12.0.2_windows-x64_bin.zip下载并解压缩后放到某一目录下,如在C:\Program Files\下新建Java文件夹,并将压缩包放到该目录下,即C:\Program Files\Java文件夹下。

然后,进入C:\Program Files\Java\jdk-12.0.2_windows-x64_bin\jdk-12.0.2,即可看到解压缩后的文件目录,如图3-2所示。

图3-2

jdk-12.0.2文件夹下包含bin、conf、include、jmods、legal、lib文件夹和release文件。

● bin文件夹下存放的是可执行程序——Java运行时环境(JRE)的实现。JRE包括Java虚拟机(JVM)、类库和支持Java编程语言编写程序执行的其他文件。该目录还包括工具和实用程序,这些工具和实用程序将帮助软件开发人员开发、执行、调试和记录用Java编写的程序。

● conf文件夹下存放的是配置文件,包含可配置选项的文件。读者可以编辑此目录中的文件以更改JDK的访问权限,还可以配置安全算法,设置可用于限制JDK密码强度的Java加密扩展策略文件。

● include文件夹下存放的是C语言编写的头文件——基于Java本地接口和Java虚拟机(JVM)调试器接口,以支持本地代码编程的C语言头文件。

● jmods文件夹下存放的是编译好的Java模块,读者可以基于J-link创建自定义运行时的编译模块。

● legal文件夹下存放的是版权和许可文件,其中包含JDK每个模块的许可证和版权文件,以及作为.md文件的第三方使用须知。

● lib文件夹下存放的是其他类库,主要是JDK所需的附加类库和支持文件,这些文件不供外部使用。

● release文件中包含的是JDK版本相关信息。

随后,开始配置JDK所需的环境变量。笔者所用的电脑的环境为Windows 10,相关环境变量配置过程如下。

首先,打开一个文件夹,在左侧导航窗口选中“此电脑”,单击鼠标右键,在弹出的快捷菜单中单击“属性”选项,弹出“控制面板”窗口。

在“控制面板”窗口中,单击“高级系统设置”→“高级”→“环境变量(N)…”,弹出“环境变量配置”对话框,如图3-3所示。

图3-3

单击“新建(W)…”按钮,即可打开“新建用户变量”对话框,如图3-4所示。

图3-4

在该对话框中,我们分别配置JAVA_HOME和Path,具体参数详见图3-3。配置后,打开Windows 10自带的PowerShell窗口,输入命令“java-version”,并按“Enter”键,即可验证JDK是否安装成功。如果安装成功,则执行“java-version”命令,窗口中会显示如图3-5所示内容。

图3-5

2.在Linux环境下安装

首先将jdk-12.0.2_linux-x64_bin.tar.gz下载到本地。在本地打开SecureCRT软件,连接Linux服务器。切换到java目录下之后,用rz命令将jdk-12.0.2_linux-x64_bin.tar.gz上传到该目录。

随后使用命令tar-zxvf jdk-12.0.1_linux-x64_bin.tar.gz将压缩包解压缩到当前目录下。解压缩成功之后,使用ll命令查看文件列表,此时压缩包解压缩成了jdk-12.0.1文件夹。jdk-12.0.1文件夹中的文件和Windows环境下的相同。

随后配置环境变量,具体方法为使用vim命令修改/etc/profile文件。在profile文件中添加如下环境变量:

保存修改后,需重新加载/etc/profile配置文件,具体命令为source/etc/profile。命令执行成功后,检查JDK是否安装成功。检查命令的方法与在Windows环境下的相同,不再赘述。

3.2.2 Elasticsearch的安装

Elasticsearch支持多平台,我们可以在Elasticsearch官网找到Elasticsearch官方支持的操作系统和JVM的矩阵,如图3-6所示。

图3-6

软件开发人员既可以选择自行安装Elasticsearch来构建搜索服务,也可以选择使用云端托管的Elasticsearch服务。Elasticsearch服务可以在AWS和GCP上使用。

下面介绍如何安装Elasticsearch,本书主要介绍在Windows系统和常用的Linux系统下的安装方法。

1.在Windows系统下安装Elasticsearch

在Windows系统中,我们可以基于Windows下的zip安装包来构建Elasticsearch服务。该zip安装包附带了一个elasticsearch-service.bat命令文件,执行该命令文件,即可将Elasticsearch作为服务运行。

下载Elasticsearch V7.2.0的.zip安装包,

解压缩后,在同级目录下将创建一个名为elasticsearch-7.2.0的文件夹,我们称之为%ES_HOME%,如图3-7所示。

图3-7

在elasticsearch-7.2.0文件夹中有bin、config、jdk、lib、logs、modules、plugins和文件夹。

● bin文件夹下存放的是二进制脚本,包括启动Elasticsearch节点和安装的Elasticsearch插件。

● config文件夹下存放的是包含elasticsearch.yml在内的配置文件。

● jdk文件夹下存放的是Java运行环境。

● lib文件夹下存放的是Elasticsearch自身所需的jar文件。

● logs文件夹下存放的是日志文件。

● modules文件夹下存放的是Elasticsearch的各个模块。

● plugins文件夹下存放的是配置插件,每个插件都包含在一个子目录中。

启动Elasticsearch服务。

首先切换到终端窗口,如PowerShell窗口,在命令行窗口下执行cd命令cd c:\elasticsearch-7.2.0,以便切换到%ES_HOME%目录。

然后从命令行启动Elasticsearch,启动命令如下所示。

命令执行后,我们可以在窗口中看到Elasticsearch的启动过程,如下所示。当看到节点started的输出后,说明Elasticsearch服务已经启动。

我们可以看到名为“LAPTOP_1S8BALK3”的节点(不同的电脑显示不同)已经启动,并且选举它自己作为单个集群中的Master主节点。

Elasticsearch启动后,在默认情况下,Elasticsearch将在前台运行,并将其日志打印到标准输出(stdout)。可以按Ctrl+C组合键停止运行Elasticsearch。

在Elasticsearch运行过程中,如果需要将Elasticsearch作为守护进程运行,则需要在命令行上指定命令参数“-d”,并使用 “-p”选项将Elasticsearch的进程ID记录在文件中。此时的启动命令如下:

此时Elasticsearch的日志消息可以在$ES_HOME/logs/目录中找到。

在启动Elasticsearch的过程中,我们可以通过命令行对Elasticsearch进行配置。一般来说,在默认情况下,Elasticsearch会从$ ES_HOME/config/elasticsearch.yml文件加载其配置内容。我们还可以在命令行上指定配置,此时需要使用“-e”语法。在命令行配置Elasticsearch参数时,启动命令如下:

在Elasticsearch启动后,我们可以在浏览器的地址栏输入http://localhost:9200/来验证Elasticsearch的启动情况。按“Enter”键后,浏览器的页面会显示如下内容:

此外,我们还可以设置Elasticsearch是否自动创建x-pack索引。x-pack将尝试在Elasticsearch中自动创建多个索引。在默认情况下,Elasticsearch是允许自动创建索引的,且不需要其他步骤。

如果需要在Elasticsearch中禁用自动创建索引,则必须在Elasticsearch.yml中配置action.auto_create_index,以允许x-pack创建以下索引:

2.在Linux系统下安装Elasticsearch

有tar.gz文件格式的安装包可以安装在任何Linux发行版和macOS上。

在Linux系统下,获取Elasticsearch V7.2.0版本安装包的命令如下所示。

方法1:

方法2:

其中,方法2中的shasum命令用于比较已下载的tar.gz安装包的sha和已发布的校验和,如果shasum命令能够执行并返回OK,则证明所下载的安装包是正确的。

获取安装包后,可以使用如下命令解压缩安装包:

该命令执行完毕后,会在当前目录显示elasticsearch-7.2.0文件夹,随后执行如下命令切换到elasticsearch-7.2.0目录下:

elasticsearch-7.2.0目录被称为$ES_HOME,该目录下的文件结构与Windows下的目录结构相同。

安装完elasticsearch-7.2.0后,在elasticsearch-7.2.0目录中,我们可以执行如下命令启动Elasticsearch:

在默认情况下,Elasticsearch在前台运行,并将其日志打印到标准输出(stdout)。在Elasticsearch运行过程中,如需停止服务,则可以通过按组合键Ctrl+C停止服务。

在Elasticsearch启动后,需要检查Elasticsearch是否能够运行。我们可以通过向本地主机上的端口9200发送HTTP请求来测试本地Elasticsearch节点是否正在运行,发送请求如下:

我们会看到如下输出结果:

在Elasticsearch运行过程中,如果需要将Elasticsearch作为守护进程运行,则需要在命令行上指定命令参数“-d”,并使用 “-p”选项将Elasticsearch的进程ID记录在文件中,启动命令如下:

此时Elasticsearch的日志消息可以在$es_home/logs/目录中找到。

在关闭Elasticsearch时,可以根据PID文件中记录的进程ID执行pkill命令,具体命令如下:

在启动Elasticsearch过程中,我们还可以通过命令行对Elasticsearch进行配置。一般来说,在默认情况下,Elasticsearch会从$es_home/config/elasticsearch.yml文件加载其配置内容。我们还可以在命令行上指定配置,此时需要使用“-e”语法。当命令行配置Elasticsearch参数时,启动命令如下:

3.2.3 Elasticsearch的配置

与近年来很多流行的框架和中间件一样,Elasticsearch的配置同样遵循“约定大于配置”的设计原则。Elasticsearch具有极好的默认值设置,用户仅需要很少的配置即可使用Elasticsearch。用户既可以使用群集更新设置API在正在运行的群集上更改大多数设置,也可以通过配置文件对Elasticsearch进行配置。

一般来说,配置文件应包含特定节点的设置,如node.name和paths路径等信息,还会包含节点为了能够加入Elasticsearch群集而需要做出的设置,如cluster.name和network.host等。

1.配置文件位置信息

在Elasticsearch中有三个配置文件,分别是elasticsearch.yml、jvm.options和log4j2.properties,这些文件位于config目录下,如图3-8所示。

图3-8

其中,elasticsearch.yml用于配置Elasticsearch,jvm.options用于配置Elasticsearch依赖的JVM信息,log4j2.properties用于配置Elasticsearch日志记录中的各个属性。

注:上述文件位于config目录下,这是默认位置。默认位置取决于我们安装Elasticsearch时是否基于下载的tar.gz包或zip包,如果是,则配置目录默认位置为$es_home/config。如果用户想自定义配置目录的位置,则可以通过es_path_conf环境变量进行更改,如下所示:

或者通过命令行或shell概要文件导出es-path-conf环境变量进行更改。

2.配置文件的格式

Elasticsearch的配置文件格式为yaml。下面展示一些更改数据和日志目录路径的示例:

除上述层级方式配制外,也可将层级路径参数整合为一条参数路径配置,如下所示:

如果需要在配置文件中引用环境变量的值,则可以在配置文件中使用 ${...}符号。引用的环境变量会替换环境变量原有的值,如下所示:

3.设置JVM选项

在Elasticsearch中,用户很少需要更改Java虚拟机(JVM)选项。一般来说,最可能的更改是设置堆大小。在默认情况下,Elasticsearch设置JVM使用最小堆空间和最大堆空间的大小均为1GB。

设置JVM选项(包括系统属性和jvm标志)的首选方法是通过jvm.options配置文件设置。此文件的默认位置为config/jvm.options。

在Elasticsearch中,我们通过xms(最小堆大小)和xmx(最大堆大小)这两个参数设置jvm.options配置文件指定的整个堆大小,一般应将这两个参数设置为相等。

在jvm.options配置文件中,包含了以下特殊语法行来分隔JVM参数列表。

(1)忽略由空白组成的行。

(2)以“#”开头的行被视为注释并被忽略,如下所示:

(3)以“-”开头的行被视为独立于本机JVM版本号的JVM选项,如下所示:

(4)以数字开头,且后面为“:”的行被视为一个JVM选项,该选项仅在本机JVM的版本号相互匹配时适用,如下所示:

(5)以数字开头,且后面为“-”的行被视为一个JVM选项,仅当本机JVM的版本号大于或等于该数字版本号时才适用,如下所示:

(6)以数字开头,且后面为“-”,再后面为数字的行被视为一个JVM选项,仅当本机JVM的版本号在这两个数字版本号的范围内时才适用,如下所示:

(7)所有其他行都被拒绝解析。

此外,用户还可以通过ES_JAVA_OPTS环境变量来设置Java虚拟机选项,如下所示:

4.安全设置

在Elasticsearch中,有些设置信息是敏感且需要保密的,此时单纯依赖文件系统权限来保护这些信息是不够的,因此需要配置安全维度的信息。Elasticsearch提供了一个密钥库和相应的密钥库工具来管理密钥库中的设置。这里的所有命令都适用于Elasticsearch用户。

需要指出的是,对密钥库所做的所有修改,都必须在重新启动Elasticsearch之后才会生效。

此外,在当前Elasticsearch密钥库中只提供模糊处理,以后会增加密码保护。

安全设置就像elasticsearch.yml配置文件中的常规设置一样,需要在集群中的每个节点上指定。当前,所有安全设置都是特定于节点的设置,每个节点上必须有相同的值。

安全设置的常规操作有创建密钥库、查看密钥库中的设置列表、添加字符串设置、添加文件设置、删除密钥设置和可重新加载的安全设置等,下面一一介绍。

创建密钥库

想要创建elasticsearch.keystore,需要使用create命令,如下所示:

命令执行后,将创建2个文件,文件名分别为elasticsearch.keystore和elasticsearch.yml。

查看密钥库中的设置列表

使用list命令可以查看密钥库中的设置列表,如下所示:

添加字符串设置

如果需要设置敏感的字符串,如云插件的身份验证凭据,则可以使用add命令添加,如下所示:

命令执行后将提示输入设置值。

用户可以使用--stdin标志在窗口stdin中输出待设置的目标值,如下所示:

添加文件设置

用户可以使用添加文件命令添加敏感信息文件,如云插件的身份验证密钥文件。配置时需确保将文件路径作为参数包含在设置名称之后,如下所示:

删除密钥设置

如果需要从密钥库中删除设置,则使用remove命令,如下所示:

可重新加载的安全设置

就像elasticsearch.yml中的设置值一样,对密钥库内容的更改不会自动应用于正在运行的Elasticsearch节点,因此需要重新启动节点才能重新读取设置。

对于某些安全设置,我们可以标记为可重新加载,这样设置后,就可以在正在运行的节点上重新读取和应用了。

需要指出的是,所有安全设置的值(不论是否可重新加载),在所有群集节点上必须相同。更改所需的安全设置后,使用bin/elasticsearch keystore add命令,调用:

该API接口将解密并重新读取每个集群节点上的整个密钥库,但只限于可重载的安全设置,对其他设置的更改将在下次重新启动之后生效。

该API接口调用返回后,重新加载就完成了,这意味着依赖于这些设置的所有内部数据结构都已更改,一切设置信息看起来好像从一开始就有了新的值。

当更改多个可重新加载的安全设置时,用户需要在每个群集节点上都修改所有设置,然后发出重新加载安全设置调用,而不是在每次修改后就重新加载。

5.日志记录配置

在Elasticsearch中,使用log4j2来记录日志。用户可以使用log4j2.properties文件配置log4j2。

Elasticsearch公开了三个属性信息,分别是$sys:es.logs.base_path、$sys:es.logs.cluster_name和$sys:es.logs.node_name,用户可以在配置文件中引用这些属性来确定日志文件的位置。

属性$sys:es.logs.base_path将解析为日志文件目录地址,$sys:es.logs.cluster_name将解析为群集名称(在默认配置中,用作日志文件名的前缀),$sys:es.logs.node_name_将解析为节点名称(如果显式地设置了节点名称)。

例如,假设用户的日志目录(path.logs)是/var/log/elasticsearch,集群命名为production,那么$sys:es.logs.base_path_将解析为/var/log/elasticsearch,$sys:es.logs.base_path/sys:file.Separator/$sys:es.logs.cluster_name.log将解析为/var/log/elasticsearch/production.log。

下面我们结合log4j2.properties文件的主要配置信息来介绍各个属性的含义。log4j2.properties文件的配置信息如下所示:

其中,上述被编号的配置属性含义如下所示。

编号1:配置RollingFile的appender属性。

编号2:日志信息将输出到/var/log/elasticsearch/production.json中。

编号3:使用JSON格式输出。

编号4:type_name是填充ESJsonLayout的类型字段的标志,该字段可以让我们在解析不同类型的日志时更加简单。

编号5:将日志滚动输出到/var/log/elasticsearch/production-yyyy-MM-dd-i.json文件。日志文件会被压缩处理,i呈递增状态。

编号6:使用基于时间戳的新增日志滚动策略。

编号7:按天滚动新增日志。

编号8:在日期时间上对齐标准,而不是按每24小时来新增一次滚动日志文件。

编号9:按日志文件大小的策略来滚动新增日志文件。

编号10:每生成256MB的日志文件,就滚动新增日志一次。

编号11:每次新增滚动日志时执行删除日志文件动作。

编号12:仅当文件匹配时才删除日志文件。

编号13:该配置仅用于删除日志文件。

编号14:只有当日志目录下积累了较多日志时才删除。

编号15:压缩日志的条件是日志文件大小达到2 GB。

在log4j2.properties文件中,我们还可以配置日志记录级别。配置日志记录级别有四种方法,每种方法都有适合使用的场景。这四种配置方法分别是通过命令行配置、通过elasticsearch.yml文件配置、通过集群配置和通过log4j2.properties配置。

(1)通过命令行配置。

适用场景:

当在单个节点上临时调试一个问题(如在后启动时或在开发过程中)时,这是最适合的方法。

(2)通过elasticsearch.yml文件配置。

所需要的配置属性如下所示:

如logger.org.elasticsearch.transport:trace。

适用场景:

当临时调试一个问题,但没有通过命令行启动Elasticsearch;或者希望在更持久的基础上调整日志级别时,这是最适合的方法。

(3)通过群集配置。

在集群中设置日志级别的方法如下所示:

示例如下所示:

适用场景:

当需要动态调整活动运行的集群上的日志级别时,这是最适合的方法。

(4)通过log4j2.properties配置。

在log4j2.properties中需要配置的属性如下所示:

示例如下所示:

适用场景:

当需要对日志程序进行细粒度的控制时(如将日志程序发送到另一个文件,或者以不同的方式管理日志程序),这是最适合的方法。

deprecation日志

除常规日志记录外,Elasticsearch还允许用户启用不推荐操作的日志记录。如果用户需要迁移某些功能,则可以提前确定这部分属性的配置。

在默认情况下,启动警告级别日志后,所有禁用日志均可输出到控制台和日志文件中。具体配置如下所示:

该配置生效后,将在日志目录中创建每日滚动deprecation日志文件。用户需要定期检查此文件,尤其是准备升级到新的主要版本时。

默认日志记录配置已将取消deprecation日志的滚动策略设置为在1GB后滚动和压缩,并最多保留五个日志文件(四个滚动日志和一个活动日志)。

用户可以在config/log4j2.properties文件中通过将取消deprecation日志级别设置为error来禁用它。

6.JSON日志格式

为了便于分析Elasticsearch的日志,日志默认以JSON格式打印。这是由log4j布局属性appender.rolling.layout.type=esjsonlayout配置的。此布局需要设置一个type_name属性,用于在分析时区分日志流,具体配置如下所示:

在配置生效后,日志的每一行就是一个JSON格式的字符串。

如果使用自定义布局,则需要用其他布局替换appender.rolling.layout.type行的配置,示例如下: