介绍
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)。您将使用本机 CentOS OpenJDK 软件包来安装 JRE。这个 JRE 是免费的,得到良好支持,并通过 CentOS Yum 安装管理器自动管理。
安装最新版本的 OpenJDK 8:
sudo yum install java-1.8.0-openjdk.x86_64
现在验证您的安装:
java -version
该命令将创建以下输出:
openjdk 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
您可以直接从 elastic.co 下载 Elasticsearch,格式为 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
,其初始化脚本添加在 /etc/init.d/elasticsearch
。
为了确保 Elasticsearch 随服务器自动启动和停止,将其初始化脚本添加到默认运行级别:
sudo systemctl enable elasticsearch.service
安装了 Elasticsearch 后,您现在将配置一些重要的设置。
步骤 3 — 在 CentOS 7 上配置 Elasticsearch
现在您已经安装了 Elasticsearch 及其 Java 依赖,是时候配置 Elasticsearch 了。
Elasticsearch 的配置文件位于 /etc/elasticsearch
目录中。我们将要审查和编辑的文件包括:
elasticsearch.yml
— 配置 Elasticsearch 服务器设置。这是大多数选项存储的地方,这也是我们最感兴趣的原因。jvm.options
— 提供 JVM 的配置,如内存设置。
在任何 Elasticsearch 服务器上自定义的第一个变量是 elasticsearch.yml
中的 node.name
和 cluster.name
。让我们现在来做这件事。
正如它们的名称所示,node.name
指定了服务器(节点)的名称,以及后者所关联的集群。如果您不自定义这些变量,node.name
将根据服务器主机名自动分配。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 上监听,以便只有来自同一服务器的客户端可以连接。出于安全考虑,您应该保持这些设置不变,因为开源和免费版的 Elasticsearch 不提供身份验证功能。
另一个重要的设置是 node.roles
属性。您可以将其设置为 master-eligible
(在配置中简称为 master
)、data
或 ingest
。
master-eligible
角色负责集群的健康和稳定性。在具有大量集群节点的大型部署中,建议至少有一个专用的仅具有 master
角色的节点。通常,专用的 master
节点既不存储数据也不创建索引。因此,不会有过载的机会,从而可能危及集群健康。
data
角色定义将存储数据的节点。即使数据节点过载,只要有其他节点可以承担额外的负载,集群健康就不会受到严重影响。
最后,ingest
角色允许节点接受和处理数据流。在较大的设置中,应该有专门的 ingest
节点,以避免可能对 master
和 data
节点造成的过载。
另一个要考虑更改的设置是 path.data
。这确定数据存储的路径,默认路径是 /var/lib/elasticsearch
。在生产环境中,建议您使用专用分区和挂载点来存储 Elasticsearch 数据。在最佳情况下,这个专用分区将是一个单独的存储介质,将提供更好的性能和数据隔离。您可以通过取消注释 path.data
行并更改其值来指定不同的 path.data
路径,如下所示:
... path.data: /media/different_media ...
现在您已经做出了所有更改,请保存并关闭 elasticsearch.yml
。
您还必须编辑 jvm.options
中的配置。
请记住,Elasticsearch 是由 JVM 运行的,即本质上它是一个 Java 应用程序。因此,与任何 Java 应用程序一样,它有可以在文件 /etc/elasticsearch/jvm.options
中配置的 JVM 设置。其中两个最重要的设置,特别是关于性能方面,是 Xms
和 Xmx
,它们定义了最小(Xms
)和最大(Xmx
)内存分配。
默认情况下,两者都设置为 1GB
,但这几乎从来不是最佳选择。不仅如此,如果您的服务器只有 1GB 的 RAM,您将无法使用默认设置启动 Elasticsearch。这是因为操作系统至少需要 100MB,因此将无法将 1GB 分配给 Elasticsearch。
遗憾的是,没有一个通用的公式可以计算内存设置。当然,您分配的内存越多,性能就越好,但请确保为服务器上的其他进程留出足够的内存。例如,如果您的机器有 1GB 的 RAM,您可以将 Xms
和 Xmx
都设置为 512MB
,从而为其他进程留出另外的 512MB。请注意,通常为了避免 JVM 垃圾回收的性能损失,Xms
和 Xmx
都设置为相同的值。
如果您的服务器只有 1GB 的 RAM,您必须编辑此设置。
打开 jvm.options
:
sudo nano /etc/elasticsearch/jvm.options
现在将 Xms
和 Xmx
的值更改为 512MB
:
... -Xms512m -Xmx512m ...
保存并退出文件。
现在首次启动 Elasticsearch:
sudo service elasticsearch start
在尝试使用它之前,请至少等待 10 秒让 Elasticsearch 启动。否则,您可能会遇到连接错误。
安装和配置了 Elasticsearch 后,您现在将对服务器进行安全设置和测试。
步骤 4 — (可选)在 CentOS 7 上保护 Elasticsearch
Elasticsearch 没有内置的安全机制,任何可以访问 HTTP API 的人都可以控制它。本节不是一个全面的 Elasticsearch 安全指南。请采取必要的措施防止未经授权的访问以及运行 Elasticsearch 的服务器/虚拟机。
默认情况下,Elasticsearch 配置为仅在本地网络接口上监听,即无法进行远程连接。除非您已经采取了以下一项或两项措施,否则应保持此设置不变:
- 使用 iptables 限制对 TCP 端口 9200 的访问仅限于受信任的主机。
- 在受信任的主机之间创建了 VPN,并且您将在 VPN 的虚拟接口之一上公开 Elasticsearch。
只有在完成上述操作后,才应考虑允许 Elasticseach 在本地网络接口之外的其他网络接口上进行监听。例如,当您需要从另一台主机连接到 Elasticsearch 时,可以考虑进行此更改。
要更改网络暴露设置,请打开文件 elasticsearch.yml
:
sudo nano /etc/elasticsearch/elasticsearch.yml
在该文件中找到包含 network.host
的行,通过删除行首的 #
字符来取消注释,并将值更改为受保护网络接口的 IP 地址。该行将类似于:
... network.host: 10.0.0.1 ...
此外,为了增强安全性,您可以禁用用于评估自定义表达式的脚本。通过构造自定义恶意表达式,攻击者可能会危害您的环境。
要禁用自定义表达式,请在 /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'
您将看到以下响应:
{ "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!" }'
您将看到以下输出:
{"_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。
请注意,对所有 POST
请求设置内容类型为 JSON 是必需的,使用参数 -H 'Content-Type: application/json'
。如果不这样做,Elasticsearch 将拒绝您的请求。
现在,使用 HTTP GET
请求检索您的第一个条目:
curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
结果将如下所示:
{"_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 将确认成功修改,如下所示:
{ "_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'
现在,响应将以更易读的格式输出:
{ "_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。一旦您熟悉了手动查询,下一个任务将是从您的应用程序开始使用该服务。