简介
Elasticsearch 是一个用于实时分布式搜索和数据分析的平台。它因易用性、强大功能和可扩展性而备受欢迎。
Elasticsearch 支持 RESTful 操作。这意味着您可以使用 HTTP 方法(GET、POST、PUT、DELETE 等)与 HTTP URI(/collection/entry
)结合使用来操作您的数据。直观的 RESTful 方法既方便开发者又用户友好,这也是 Elasticsearch 受欢迎的原因之一。
Elasticsearch 是一款免费且开源的软件,由 Elastic 公司提供支持。这种组合使其适用于个人测试到企业集成等各种场景。
本文将介绍 Elasticsearch,并向您展示如何安装、配置、保护和开始使用它。
先决条件
在按照本教程操作之前,您需要:
- 通过按照《使用 Ubuntu 16.04 进行初始服务器设置》设置好的 Ubuntu 16.04 Droplet,包括创建一个 sudo 非根用户。
- 安装了 Oracle JDK 8,您可以按照这篇 Java 安装文章中的“安装 Oracle JDK”部分进行操作。
除非另有说明,本教程中需要 root 权限的所有命令都应该以具有 sudo 权限的非根用户身份运行。
步骤 1 — 下载并安装 Elasticsearch
Elasticsearch 可以直接从 elastic.co 以 zip
、tar.gz
、deb
或 rpm
包的形式下载。对于 Ubuntu,最好使用 deb
(Debian)包,它会安装运行 Elasticsearch 所需的一切。
首先,更新您的软件包索引。
sudo apt-get update
下载最新的 Elasticsearch 版本,本文撰写时为 2.3.1。
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb
然后按照通常的 Ubuntu 方法使用 dpkg
进行安装。
sudo dpkg -i elasticsearch-2.3.1.deb
这将导致 Elasticsearch 安装在 /usr/share/elasticsearch/
,其配置文件放置在 /etc/elasticsearch
,并将其 init 脚本添加到 /etc/init.d/elasticsearch
。
为了确保 Elasticsearch 随服务器自动启动和停止,将其 init 脚本添加到默认运行级别。
sudo systemctl enable elasticsearch.service
在首次启动 Elasticsearch 之前,请查看下一节关于推荐的最小配置。
步骤 2 — 配置 Elasticsearch
现在 Elasticsearch 及其 Java 依赖已安装,是时候配置 Elasticsearch 了。Elasticsearch 配置文件位于 /etc/elasticsearch
目录中。有两个文件:
elasticsearch.yml
配置 Elasticsearch 服务器设置。这是存储所有选项(除了日志选项)的地方,这也是我们主要关注的文件。logging.yml
提供日志配置。一开始,您不必编辑此文件。您可以保留所有默认的日志选项。您可以在/var/log/elasticsearch
中找到生成的日志。
在任何 Elasticsearch 服务器上自定义的第一个变量是 elasticsearch.yml
中的 node.name
和 cluster.name
。正如它们的名称所示,node.name
指定服务器(节点)的名称,以及后者所关联的集群。
如果您不自定义这些变量,node.name
将根据 Droplet 主机名自动分配。cluster.name
将自动设置为默认集群的名称。
cluster.name
值被 Elasticsearch 的自动发现功能用于自动发现和关联 Elasticsearch 节点到一个集群。因此,如果您不更改默认值,您可能会在集群中找到不需要的节点,这些节点在同一网络上被发现。
开始使用 nano
或您喜欢的文本编辑器编辑主要的 elasticsearch.yml
配置文件。
sudo nano /etc/elasticsearch/elasticsearch.yml
删除 cluster.name
和 node.name
行开头的 #
字符以取消注释,然后更新它们的值。您在 /etc/elasticsearch/elasticsearch.yml
文件中的第一个配置更改应该如下所示:
. . . cluster.name: mycluster1 node.name: "My First Node" . . .
这是您可以使用 Elasticsearch 的最小设置。但是,建议继续阅读配置部分,以更全面地了解和微调 Elasticsearch。
Elasticsearch 的一个特别重要的设置是服务器的角色,即主服务器或从服务器。主服务器 负责集群的健康和稳定性。在具有大量集群节点的大型部署中,建议有多个专用主服务器。通常,专用主服务器不会存储数据或创建索引。因此,不应该有被过载的机会,从而危及集群的健康。
从服务器 用作可以加载数据任务的工作节点。即使从节点过载,只要有其他节点可以承担额外负载,集群的健康就不会受到严重影响。
确定服务器角色的设置称为 node.master
。默认情况下,节点是主节点。如果您只有一个 Elasticsearch 节点,应该将此选项保留为默认的 true
值,因为至少需要一个主节点。或者,如果希望将节点配置为从节点,请将变量 node.master
分配为 false
值,如下所示:
. . . node.master: false . . .
另一个重要的配置选项是 node.data
,它确定节点是否存储数据。在大多数情况下,此选项应该保持其默认值(true
),但有两种情况下您可能希望不在节点上存储数据。一种情况是当节点是之前提到的专用主节点时。另一种情况是当节点仅用于从其他节点获取数据和聚合结果时。在后一种情况下,节点将充当 搜索负载均衡器。
同样,如果您只有一个 Elasticsearch 节点,您不应更改此值。否则,要禁用本地存储数据,请将 node.data
指定为 false
,如下所示:
. . . node.data: false . . .
在具有许多节点的较大 Elasticsearch 部署中,另外两个重要选项是 index.number_of_shards
和 index.number_of_replicas
。前者确定索引将被分割成多少片或 分片。后者定义将分布在集群中的副本数量。拥有更多分片可以提高索引性能,而拥有更多副本可以加快搜索速度。
默认情况下,分片数为 5,副本数为 1。假设您仍在单个节点上探索和测试 Elasticsearch,您可以从一个分片和零副本开始。因此,它们的值应该设置如下:
. . . index.number_of_shards: 1 index.number_of_replicas: 0 . . .
您可能有兴趣更改的最后一个设置是 path.data
,它确定数据存储的路径。默认路径是 /var/lib/elasticsearch
。在生产环境中,建议您为存储 Elasticsearch 数据使用专用分区和挂载点。在最佳情况下,这个专用分区将是一个单独的存储介质,它将提供更好的性能和数据隔离。您可以通过如下方式指定不同的 path.data
路径:
. . . path.data: /media/different_media . . .
一旦您做出所有更改,请保存并退出文件。现在您可以首次启动 Elasticsearch。
sudo systemctl start elasticsearch
在尝试使用它之前,请给 Elasticsearch 一些时间完全启动。否则,您可能会收到关于无法连接的错误。
第三步 —— 安全配置 Elasticsearch
默认情况下,Elasticsearch 没有内置安全性,可以被可以访问 HTTP API 的任何人控制。这并不总是一个安全风险,因为 Elasticsearch 只监听回环接口(即 127.0.0.1
),只能在本地访问。因此,不可能进行公共访问,只要所有服务器用户都是受信任的,或者这是一个专用的 Elasticsearch 服务器,你的 Elasticsearch 就足够安全。
但是,如果你希望加强安全性,首先要做的是启用身份验证。身份验证由商业版的 Shield 插件提供。不幸的是,这个插件不是免费的,但你可以使用免费的 30 天试用来测试它。它的官方页面有很好的安装和配置说明。你可能需要额外了解的唯一一件事是 Elasticsearch 插件安装管理器的路径是 /usr/share/elasticsearch/bin/plugin
。
如果你不想使用商业插件,但仍然需要允许远程访问 HTTP API,你至少可以通过 Ubuntu 的默认防火墙 UFW(Uncomplicated Firewall)限制网络暴露。默认情况下,UFW 已安装但未启用。如果你决定使用它,请按照以下步骤操作:
首先,创建规则以允许任何所需的服务。你至少需要允许 SSH,以便可以登录服务器。要允许 SSH 的全球访问,可以将端口 22 加入白名单。
sudo ufw allow 22
然后允许对受信任的远程主机(例如 TRUSTED_IP
)的默认 Elasticsearch HTTP API 端口(TCP 9200)的访问,如下所示:
sudo ufw allow from TRUSTED_IP to any port 9200
之后,使用以下命令启用 UFW:
sudo ufw enable
最后,使用以下命令检查 UFW 的状态:
sudo ufw status
如果你已经正确指定了规则,输出应该如下所示:
[secondary_label Output of java -version] Status: active To Action From -- ------ ---- 9200 ALLOW TRUSTED_IP 22 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6)
确认 UFW 已启用并保护 Elasticsearch 端口 9200 后,你可以允许 Elasticsearch 监听外部连接。要做到这一点,再次打开 elasticsearch.yml
配置文件。
sudo nano /etc/elasticsearch/elasticsearch.yml
找到包含 network.bind_host
的行,通过删除行首的 #
字符来取消注释,并将值更改为 0.0.0.0
,使其如下所示:
. . . network.host: 0.0.0.0 . . .
我们指定了 0.0.0.0
,以便 Elasticsearch 监听所有接口和绑定的 IP。如果你希望它只监听特定接口,可以在 0.0.0.0
的位置指定其 IP。
要使上述设置生效,使用以下命令重新启动 Elasticsearch:
sudo systemctl restart elasticsearch
之后,尝试从受信任的主机连接到 Elasticsearch。如果无法连接,请确保 UFW 正常工作,并且已正确指定了 network.host
变量。
第四步 —— 测试 Elasticsearch
到目前为止,Elasticsearch 应该在端口 9200 上运行。你可以使用 curl
,这个命令行客户端 URL 传输工具和一个简单的 GET 请求来测试它。
curl -X GET 'http://localhost:9200'
你应该会看到以下响应:
[secondary_label Output of curl] { "name" : "My First Node", "cluster_name" : "mycluster1", "version" : { "number" : "2.3.1", "build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39", "build_timestamp" : "2016-04-04T12:25:05Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" }
如果你看到类似上面的响应,说明 Elasticsearch 正常工作。如果没有,请确保你已正确遵循安装说明,并且已允许 Elasticsearch 充分启动。
要对 Elasticsearch 进行更彻底的检查,执行以下命令:
curl -XGET 'http://localhost:9200/_nodes?pretty'
在上述命令的输出中,你可以看到并验证节点、集群、应用程序路径、模块等的所有当前设置。
第五步 — 使用 Elasticsearch
要开始使用 Elasticsearch,让我们首先添加一些数据。如前所述,Elasticsearch 使用 RESTful API,响应通常的 CRUD 命令:create(创建)、read(读取)、update(更新)和 delete(删除)。为了使用它,我们将再次使用 curl
。
您可以使用以下命令添加您的第一个条目:
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
您应该会看到以下响应:
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}
通过 curl
,我们向 Elasticsearch 服务器发送了一个 HTTP POST 请求。请求的 URI 是 /tutorial/helloworld/1
,带有几个参数:
tutorial
是 Elasticsearch 中数据的索引。helloworld
是类型。1
是上述索引和类型下我们条目的 id。
您可以使用 HTTP GET 请求检索这个第一个条目。
curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
结果应该如下所示:
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}
要修改现有条目,您可以使用 HTTP PUT 请求。
curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d ' { "message": "Hello People!" }'
Elasticsearch 应该会确认成功修改,如下所示:
{ "_index" : "tutorial", "_type" : "helloworld", "_id" : "1", "_version" : 2, "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "created" : false }
在上面的示例中,我们将第一个条目的 message
修改为 “Hello People!”。因此,版本号已自动增加到 2
。
您可能已经注意到上述请求中的额外参数 pretty
。它启用了人类可读的格式,这样您可以将每个数据字段写在新的一行上。当检索数据并获得更好的输出时,您也可以使结果“漂亮化”:
curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
现在响应将以更好的格式呈现:
{ "_index" : "tutorial", "_type" : "helloworld", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "message" : "Hello People!" } }
到目前为止,我们已经向 Elasticsearch 添加了数据并进行了查询。要了解其他操作,请查看 API 文档。
结论
这就是安装、配置和开始使用 Elasticsearch 有多么容易。一旦您已经足够熟悉手动查询,您的下一个任务将是从您的应用程序开始使用它。