如何在CentOS8上安装和配置Elasticsearch

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

Elasticsearch 是一个实时分布式搜索和分析数据的平台。 它的流行是由于它的易用性、强大的功能和可扩展性。

Elasticsearch 支持 RESTful 操作。 这意味着您可以结合 HTTP URI(/collection/条目)来操作您的数据。 直观的 RESTful 方法对开发人员和用户都很友好,这也是 Elasticsearch 受欢迎的原因之一。

Elasticsearch 是免费的开源软件,背后有一家实力雄厚的公司 — Elastic。 这种组合使其适用于许多用例,从个人测试到企业集成。

本文将向您介绍 Elasticsearch,并向您展示如何安装、配置和开始使用它。

先决条件

要遵循本教程,您将需要以下内容:

第 1 步 — 在 CentOS 8 上安装 Java

Elasticsearch 是用 Java 编程语言编写的。 那么,您的第一个任务就是在您的服务器上安装 Java 运行时环境 (JRE)。 您将为 JRE 使用本机 CentOS OpenJDK 包。 这个 JRE 是免费的,得到很好的支持,并且 通过 CentOS Yum 安装管理器 自动管理。

安装最新版本的 OpenJDK 8:

sudo dnf install java-1.8.0-openjdk.x86_64 -y

现在验证您的安装:

java -version

该命令将创建如下输出:

Outputopenjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

当您进一步使用 Elasticsearch 并开始寻找更好的 Java 性能和兼容性时,您可能会选择安装 Oracle 的专有 Java(Oracle JDK 8)。 有关更多信息,请参阅我们关于 如何在 CentOS 和 Fedora 上安装 Java 的文章。

第 2 步 — 在 CentOS 8 上下载和安装 Elasticsearch

您可以直接从 ziptar.gzdebrpm 包中的 elastic.co 下载 Elasticsearch。 对于 CentOS,最好使用原生的 rpm 包,它将安装运行 Elasticsearch 所需的一切。

在撰写本文时,最新的 Elasticsearch 版本是 7.9.2。

从工作目录下载程序:

sudo rpm -ivh https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-x86_64.rpm

Elasticsearch 将安装在 /usr/share/elasticsearch/ 中,其配置文件放置在 /etc/elasticsearch 中,其初始化脚本添加在 /etc/init.d/elasticsearch 中。

要确保 Elasticsearch 随服务器自动启动和停止,请将其 init 脚本添加到默认运行级别:

sudo systemctl daemon-reload && sudo systemctl enable elasticsearch.service

安装 Elasticsearch 后,您现在将配置一些重要设置。

第 3 步 — 在 CentOS 8 上配置 Elasticsearch

现在您已经安装了 Elasticsearch 及其 Java 依赖项,是时候配置 Elasticsearch 了。

Elasticsearch 配置文件位于 /etc/elasticsearch 目录中。 我们将审查和编辑的是:

  • elasticsearch.yml — 配置 Elasticsearch 服务器设置。 这是存储大多数选项的地方,这就是我们对这个文件最感兴趣的原因。
  • jvm.options — 为 JVM 提供配置,例如内存设置。

在任何 Elasticsearch 服务器上要自定义的第一个变量是 elasticsearch.yml 中的 node.namecluster.name。 现在让我们这样做。

正如它们的名字所暗示的,node.name 指定服务器(节点)的名称以及与后者关联的集群。 如果您不自定义这些变量,则会根据服务器主机名自动分配 node.namecluster.name 将自动设置为默认集群的名称。

Elasticsearch 的自动发现功能使用 cluster.name 值来自动发现 Elasticsearch 节点并将其关联到集群。 因此,如果您不更改默认值,您的集群中可能会在同一网络上找到不需要的节点。

让我们开始编辑主 elasticsearch.yml 配置文件。

使用 nano 或您喜欢的文本编辑器打开它:

sudo nano /etc/elasticsearch/elasticsearch.yml

删除 node.namecluster.name 行开头的 # 字符以取消注释它们,然后更改它们的值。 /etc/elasticsearch/elasticsearch.yml 文件中的第一个配置更改将如下所示:

/etc/elasticsearch/elasticsearch.yml

...
node.name: "My First Node"
cluster.name: mycluster1
...

网络设置也可以在 elasticsearch.yml 中找到。 默认情况下,Elasticsearch 将在 localhost 的 9200 端口上进行侦听,以便只有来自同一服务器的客户端可以连接。 从安全的角度来看,您应该保持这些设置不变,因为 Elasticsearch 的开源和免费版本不提供身份验证功能。

另一个重要的设置是 node.roles 属性。 您可以将其设置为 master-eligible(配置中简称为 master)、dataingest

master-eligible 角色负责集群的健康和稳定。 在具有大量集群节点的大型部署中,建议使用多个仅具有 master 角色的专用节点。 通常,专用的 master 节点既不会存储数据,也不会创建索引。 因此,不会有过载的机会,从而可能危及集群的健康。

data 角色定义将存储数据的节点。 即使数据节点过载,集群健康也不会受到严重影响,只要有其他节点承担额外的负载。

最后,ingest 角色允许节点接受和处理数据流。 在较大的设置中,应该有专用的 ingest 节点,以避免 masterdata 节点上可能出现的过载。

注意: 一个节点可能有一个或多个角色,允许 Elasticsearch 设置的可扩展性、冗余和高可用性。 默认情况下,所有这些角色都分配给节点。 这适用于单节点 Elasticsearch,如本文中描述的示例场景。 因此,您不必更改角色。 不过,如果您想更改角色,例如将节点专用为 master,则可以通过更改 /etc/elasticsearch/elasticsearch.yml 来实现,如下所示:

/etc/elasticsearch/elasticsearch.yml

...
node.roles: [ master ]
...

另一个要考虑更改的设置是 path.data。 这决定了数据存储的路径,默认路径是/var/lib/elasticsearch。 在生产环境中,建议您使用专用分区和挂载点来存储 Elasticsearch 数据。 在最好的情况下,这个专用分区将是一个单独的存储介质,可以提供更好的性能和数据隔离。 您可以通过取消注释 path.data 行并更改其值来指定不同的 path.data 路径,如下所示:

/etc/elasticsearch/elasticsearch.yml

...
path.data: /media/different_media
...

现在您已完成所有更改,保存并关闭 elasticsearch.yml

您还必须在 jvm.options 中编辑您的配置。

回想一下 Elasticsearch 是由 JVM 运行的,即 本质上它是一个Java应用程序。 因此,就像任何 Java 应用程序一样,它具有可以在文件 /etc/elasticsearch/jvm.options 中配置的 JVM 设置。 两个最重要的设置,尤其是在性能方面,是 XmsXmx,它们定义了最小值 (Xms) 和最大值 (Xmx)内存分配。

默认情况下,两者都设置为 1GB,但这几乎不是最优的。 不仅如此,如果您的服务器只有 1GB 的 RAM,您将无法使用默认设置启动 Elasticsearch。 这是因为操作系统至少占用 100MB,因此不可能将 1GB 专用于 Elasticsearch。

不幸的是,没有用于计算内存设置的通用公式。 自然,您分配的内存越多,性能就越好,但请确保为服务器上的其余进程留有足够的内存。 例如,如果您的机器有 1GB 的 RAM,您可以将 XmsXmx 都设置为 512MB,从而为其余进程留出另外 512MB。 请注意,通常 XmsXmx 都设置为相同的值,以避免 JVM 垃圾收集的性能损失。

如果您的服务器只有 1GB 的 RAM,则必须编辑此设置。

打开jvm.options

sudo nano /etc/elasticsearch/jvm.options

现在将 XmsXmx 值更改为 512MB

/etc/elasticsearch/jvm.options

...
-Xms512m
-Xmx512m
...

保存并退出文件。

现在第一次启动 Elasticsearch:

sudo systemctl start elasticsearch.service

在您尝试使用 Elasticsearch 之前,请至少等待 10 秒以启动它。 否则,您可能会收到连接错误。

注意: 您应该知道,并非所有 Elasticsearch 设置都已设置并保存在配置文件中。 相反,一些设置是通过其 API 设置的,例如 index.number_of_shardsindex.number_of_replicas。 第一个确定索引将分成多少块(分片)。 第二个定义将在集群中分布的副本数量。 拥有更多分片可以提高索引性能,而拥有更多副本则可以加快搜索速度。

假设您仍在单个节点上探索和测试 Elasticsearch,您可以使用这些设置并通过执行以下 curl 命令来更改它们:

curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{
  "index.number_of_replicas" : "0",
  "index.number_of_shards" : "1"
}'

安装和配置 Elasticsearch 后,您现在将保护和测试服务器。

第 4 步——(可选)在 CentOS 8 上保护 Elasticsearch

Elasticsearch 没有内置的安全性,任何可以访问 HTTP API 的人都可以控制它。 本节不是保护 Elasticsearch 的综合指南。 采取一切必要措施来防止未经授权访问它以及运行它的服务器/虚拟机。

默认情况下,Elasticsearch 被配置为只监听 localhost 网络接口,即 远程连接是不可能的。 除非您已采取以下一项或两项措施,否则您应该保持此设置不变:

  • 您已使用 iptables 将 TCP 端口 9200 的访问限制为仅受信任的主机。
  • 您已经在受信任的主机之间创建了一个 vpn,并且您将在 vpn 的一个虚拟接口上公开 Elasticsearch。

只有完成上述操作后,您才应该考虑允许 Elasticseach 侦听除 localhost 之外的其他网络接口。 例如,当您需要从另一台主机连接到 Elasticsearch 时,可能会考虑进行此类更改。

要更改网络曝光,请打开文件 elasticsearch.yml

sudo nano /etc/elasticsearch/elasticsearch.yml

在此文件中找到包含 network.host 的行,通过删除行首的 # 字符取消注释,然后将值更改为安全网络接口的 IP 地址。 该行将如下所示:

/etc/elasticsearch/elasticsearch.yml

...
network.host: 10.0.0.1
...

警告: 因为 Elasticsearch 没有任何内置的安全性,所以不要将其设置为任何不受您控制或信任的服务器可访问的 IP 地址,这一点非常重要。 不要将 Elasticsearch 绑定到公共或 共享专用网络 IP 地址。


此外,为了提高安全性,您可以禁用用于评估自定义表达式的脚本。 通过制作自定义恶意表达式,攻击者可能会破坏您的环境。

要禁用自定义表达式,请在 /etc/elasticsearch/elasticsearch.yml 文件的末尾添加以下行:

...
[label /etc/elasticsearch/elasticsearch.yml]
script.allowed_types: none
...

要使上述更改生效,您必须重新启动 Elasticsearch。

立即重启 Elasticsearch:

sudo service elasticsearch restart

在这一步中,您采取了一些措施来保护您的 Elasticsearch 服务器。 现在您已准备好测试应用程序。

第 5 步 — 在 CentOS 8 上测试 Elasticsearch

现在,Elasticsearch 应该在 9200 端口上运行。 您可以使用 curl 进行测试,这是用于客户端 URL 传输的命令行工具。

要测试服务,请像这样发出 GET 请求:

curl -X GET 'http://localhost:9200'

您将看到以下响应:

Output{
  "name" : "My First Node",
  "cluster_name" : "mycluster1",
  "cluster_uuid" : "R23U2F87Q_CdkEI2zGhLGw",
  "version" : {
    "number" : "7.9.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "d34da0ea4a966c4e49417f2da2f244e3e97b4e6e",
    "build_date" : "2020-09-23T00:45:33.626720Z",
    "build_snapshot" : false,
    "lucene_version" : "8.6.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

如果您看到类似的响应,则说明 Elasticsearch 工作正常。 如果没有,请重新检查安装说明并等待一段时间让 Elasticsearch 完全启动。

您的 Elasticsearch 服务器现在可以运行了。 在下一步中,您将从应用程序中添加和检索一些数据。

第 6 步 — 在 CentOS 8 上使用 Elasticsearch

在这一步中,您将向 Elasticsearch 添加一些数据,然后进行一些手动查询。

使用 curl 添加您的第一个条目:

curl -H 'Content-Type: application/json' -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'

您将看到以下输出:

Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":4

使用 curl,您向 Elasticseach 服务器发送了一个 HTTP POST 请求。 请求的 URI 是 /tutorial/helloworld/1。 让我们仔细看看这些参数:

  • tutorial 是 Elasticsearch 中数据的索引。
  • helloworld 是类型。
  • 1 是我们在上述索引和类型下的条目的id。

请注意,还需要使用参数 -H 'Content-Type: application/json' 将所有 POST 请求的内容类型设置为 JSON。 如果您不这样做,Elasticsearch 将拒绝您的请求。

现在使用 HTTP GET 请求检索您的第一个条目:

curl -X GET 'http://localhost:9200/tutorial/helloworld/1'

结果将如下所示:

Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"_seq_no":2,"_primary_term":4,"found":true,"_source":{ "message": "Hello World!" }}

要修改现有条目,您可以使用 HTTP PUT 请求,如下所示:

curl -H 'Content-Type: application/json' -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
{
  "message": "Hello People!"
}'

Elasticsearch 将像这样确认成功的修改:

Output{
  "_index" : "tutorial",
  "_type" : "helloworld",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

在上面的示例中,您将第一个条目的 message 修改为 "Hello People!"。 这样,版本号增加到2

为了使 GET 操作的输出更易于阅读,您还可以通过添加 pretty 参数来“美化”结果:

curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'

现在响应将以更易读的格式输出:

Output{
  "_index" : "tutorial",
  "_type" : "helloworld",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "message" : "Hello People!"
  }
}

这就是您在 Elasticsearch 中添加和查询数据的方式。 要了解其他操作,您可以查看 Elasticsearch API 文档

结论

在本教程中,您在 CentOS 8 上安装、配置并开始使用 Elasticsearch。 一旦您对手动查询感到满意,您的下一个任务将是开始使用应用程序中的服务。