作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。
介绍
Elasticsearch是一个实时分布式搜索和分析数据的平台。它的流行是由于其易用性、强大的功能和可扩展性。
Elasticsearch 支持 RESTful 操作。这意味着您可以将 HTTP 方法(GET
、POST
、PUT
、DELETE
等)与 HTTP URI (/collection/entry) 结合使用来操作您的数据。直观的 RESTful 方法对开发人员和用户都很友好,这也是 Elasticsearch 受欢迎的原因之一。
Elasticsearch 是免费的开源软件,背后有一家可靠的公司——Elastic。这种组合使其适用于许多用例,从个人测试到企业集成。
本文将向您介绍 Elasticsearch,并向您展示如何安装、配置和开始使用它。
先决条件
要遵循本教程,您将需要以下内容:
- 一台运行 CentOS 7 的服务器,具有至少 1GB 的内存和非 root sudo 用户。有关详细说明,请查看我们的 CentOS 7 初始服务器设置指南
wget
安装在您的服务器上
步骤 1 — 在 CentOS 7 上安装 Java
Elasticsearch 是用 Java 编程语言编写的。那么,您的第一项任务是在您的服务器上安装 Java 运行时环境 (JRE)。您将为 JRE 使用本地 CentOS OpenJDK 包。这个 JRE 是免费的,得到很好的支持,并通过 CentOS Yum 安装管理器自动管理。
安装最新版本的 OpenJDK 8:
- sudo yum install java-1.8.0-openjdk.x86_64
现在验证您的安装:
- 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 7 上下载和安装 Elasticsearch
您可以直接从下载Elasticsearch elastic.co在zip
,tar.gz
,deb
,或rpm
包。对于 CentOS,最好使用原生rpm
包,它将安装运行 Elasticsearch 所需的一切。
在撰写本文时,最新的 Elasticsearch 版本是 7.9.2。
从您选择的工作目录中,下载程序:
- wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-x86_64.rpm
然后使用以下rpm
命令安装它:
- sudo rpm -ivh elasticsearch-7.9.2-x86_64.rpm
Elasticsearch将安装在/usr/share/elasticsearch/
与它的配置文件放在/etc/elasticsearch
和增加它的init脚本/etc/init.d/elasticsearch
。
要确保 Elasticsearch 随服务器自动启动和停止,请将其 init 脚本添加到默认运行级别:
- sudo systemctl enable elasticsearch.service
安装 Elasticsearch 后,您现在将配置一些重要设置。
步骤 3 — 在 CentOS 7 上配置 Elasticsearch
现在您已经安装了 Elasticsearch 及其 Java 依赖项,是时候配置 Elasticsearch 了。
Elasticsearch 配置文件位于该/etc/elasticsearch
目录中。我们将审查和编辑的是:
-
elasticsearch.yml
— 配置 Elasticsearch 服务器设置。这是存储大多数选项的地方,这就是我们对这个文件最感兴趣的原因。 -
jvm.options
— 为 JVM 提供配置,例如内存设置。
第一个变量来定制任何Elasticsearch服务器上node.name
,并cluster.name
在elasticsearch.yml
。让我们现在就这样做。
顾名思义,node.name
指定服务器(节点)的名称以及与后者关联的集群。如果您不自定义这些变量,node.name
将根据服务器主机名自动分配a 。在cluster.name
将被自动设置为默认的簇的名称。
cluster.name
Elasticsearch 的自动发现功能使用该值自动发现 Elasticsearch 节点并将其关联到集群。因此,如果您不更改默认值,您的集群中可能会在同一网络上找到不需要的节点。
让我们开始编辑主elasticsearch.yml
配置文件。
使用nano
或您喜欢的文本编辑器打开它:
- sudo nano /etc/elasticsearch/elasticsearch.yml
删除#
在该行的开头字符node.name
和cluster.name
以取消它们,然后改变自己的价值观。您在/etc/elasticsearch/elasticsearch.yml
文件中的第一个配置更改将如下所示:
...
node.name: "My First Node"
cluster.name: mycluster1
...
网络设置也可以在elasticsearch.yml
. 默认情况下,Elasticsearch 将在端口 9200 上侦听 localhost,以便只有来自同一服务器的客户端才能连接。从安全的角度来看,您应该保持这些设置不变,因为 Elasticsearch 的开源和免费版本不提供身份验证功能。
另一个重要的设置是node.roles
属性。您可以将其设置为master-eligible
(仅master
在配置中)data
或ingest
。
该master-eligible
角色负责集群的健康和稳定性。在具有大量集群节点的大型部署中,建议拥有多个master
仅具有角色的专用节点。通常,专用master
节点既不会存储数据也不会创建索引。因此,不会有过载的机会,否则可能危及集群健康。
该data
角色定义了将存储数据的节点。即使一个数据节点过载,集群健康也不应该受到严重影响,前提是有其他节点来承担额外的负载。
最后,ingest
角色允许节点接受和处理数据流。在较大的设置中,应该有专用ingest
节点以避免master
和data
节点上可能出现的过载。
注意:一个节点可能有一个或多个角色,允许 Elasticsearch 设置的可扩展性、冗余和高可用性。默认情况下,所有这些角色都分配给节点。这适用于单节点 Elasticsearch,如本文所述的示例场景。因此,您不必更改角色。尽管如此,如果您想更改角色,例如将节点指定为 a master
,您可以通过如下更改来实现/etc/elasticsearch/elasticsearch.yml
:
...
node.roles: [ master ]
...
另一个需要考虑更改的设置是path.data
. 这决定了数据存储的路径,默认路径是/var/lib/elasticsearch
. 在生产环境中,建议您使用专用分区和挂载点来存储 Elasticsearch 数据。在最好的情况下,这个专用分区将是一个单独的存储介质,将提供更好的性能和数据隔离。您可以path.data
通过取消注释该path.data
行并更改其值来指定不同的路径,如下所示:
...
path.data: /media/different_media
...
现在您已完成所有更改,保存并关闭elasticsearch.yml
。
您还必须在jvm.options
.
回想一下 Elasticsearch 由 JVM 运行,即本质上它是一个 Java 应用程序。因此,就像任何 Java 应用程序一样,它具有可以在文件中配置的 JVM 设置/etc/elasticsearch/jvm.options
。两个最重要的设置,尤其是在性能方面,是Xms
和Xmx
,它们定义了最小 ( Xms
) 和最大 ( Xmx
) 内存分配。
默认情况下,两者都设置为1GB
,但这几乎从来都不是最佳选择。不仅如此,如果您的服务器只有 1GB 的 RAM,您将无法使用默认设置启动 Elasticsearch。这是因为操作系统至少需要 100MB,因此不可能将 1GB 专用于 Elasticsearch。
不幸的是,没有用于计算内存设置的通用公式。自然地,分配的内存越多,性能就越好,但请确保为服务器上的其余进程留有足够的内存。例如,如果您的机器有 1GB 的 RAM,您可以将Xms
和都设置Xmx
为512MB
,从而为其余进程提供另外 512MB。请注意,通常将Xms
和Xmx
设置为相同的值以避免JVM 垃圾收集的性能损失。
如果您的服务器只有 1GB 的 RAM,您必须编辑此设置。
打开jvm.options
:
- sudo nano /etc/elasticsearch/jvm.options
现在将Xms
和Xmx
值更改为512MB
:
...
-Xms512m
-Xmx512m
...
保存并退出文件。
现在第一次启动 Elasticsearch:
- sudo service elasticsearch start
在您尝试使用 Elasticsearch 之前,请至少等待 10 秒让其启动。否则,您可能会收到连接错误。
注意:您应该知道并非所有 Elasticsearch 设置都设置并保存在配置文件中。相反,某些设置是通过其 API 设置的,例如index.number_of_shards
和index.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 7 上保护 Elasticsearch
Elasticsearch 没有内置安全性,任何可以访问 HTTP API 的人都可以控制它。本节不是保护 Elasticsearch 的综合指南。采取一切必要措施来防止未经授权访问它以及运行它的服务器/虚拟机。
默认情况下,Elasticsearch 配置为仅侦听 localhost 网络接口,即无法进行远程连接。除非您已采取以下一项或两项措施,否则应保持此设置不变:
- 您已将 TCP 端口 9200 的访问权限限制为使用iptables 的可信主机。
- 您已经在受信任的主机之间创建了一个vpn,并且您将在 vpn 的虚拟接口之一上公开 Elasticsearch。
只有在完成上述操作后,您才应考虑允许 Elasticseach 侦听除 localhost 之外的其他网络接口。例如,当您需要从另一台主机连接到 Elasticsearch 时,可能会考虑这种更改。
要更改网络曝光,请打开文件elasticsearch.yml
:
- sudo nano /etc/elasticsearch/elasticsearch.yml
在此文件中找到包含 的行,network.host
通过删除该#
行开头的字符来取消注释,然后将值更改为安全网络接口的 IP 地址。该行将如下所示:
...
network.host: 10.0.0.1
...
警告:因为 Elasticsearch 没有任何内置的安全性,所以不要将其设置为任何不受您控制或信任的服务器可访问的 IP 地址,这一点非常重要。不要将 Elasticsearch 绑定到公共或共享的私有网络IP 地址。
此外,为了提高安全性,您可以禁用用于评估自定义表达式的脚本。通过制作自定义恶意表达式,攻击者可能会破坏您的环境。
要禁用自定义表达式,请在/etc/elasticsearch/elasticsearch.yml
文件末尾添加以下行:
...
script.allowed_types: none
...
要使上述更改生效,您必须重新启动 Elasticsearch。
立即重启 Elasticsearch:
- sudo service elasticsearch restart
在这一步中,您采取了一些措施来保护您的 Elasticsearch 服务器。现在您已准备好测试应用程序。
步骤 5 — 在 CentOS 7 上测试 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 7 上使用 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
,您向POST
Elasticseach 服务器发送了一个 HTTP请求。请求的 URI 是/tutorial/helloworld/1
. 让我们仔细看看这些参数:
tutorial
是 Elasticsearch 中数据的索引。helloworld
是类型。1
是我们在上述索引和类型下的条目的 id。
请注意,还需要POST
使用参数将所有请求的内容类型设置为 JSON -H 'Content-Type: application/json'
。如果您不这样做,Elasticsearch 将拒绝您的请求。
现在使用 HTTPGET
请求检索您的第一个条目:
- 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!" }}
要修改现有条目,您可以使用这样的 HTTPPUT
请求:
- 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 7 上安装、配置并开始使用 Elasticsearch。一旦您熟悉手动查询,您的下一个任务将是从您的应用程序开始使用该服务。