如何在Ubuntu16.04上安装和配置Elasticsearch
介绍
Elasticsearch 是一个实时分布式搜索和分析数据的平台。 它的流行是由于它的易用性、强大的功能和可扩展性。
Elasticsearch 支持 RESTful 操作。 这意味着您可以结合使用 HTTP 方法(GET、POST、PUT、DELETE 等)与 HTTP URI (/collection/entry
) 来操作数据。 直观的 RESTful 方法对开发人员和用户都很友好,这也是 Elasticsearch 受欢迎的原因之一。
Elasticsearch 是一款免费的开源软件,背后有一家实力雄厚的公司:Elastic。 这种组合使其适用于从个人测试到企业集成的任何地方。
本文将向您介绍 Elasticsearch,并向您展示如何安装、配置、保护和开始使用它。
先决条件
在学习本教程之前,您需要:
- Ubuntu 16.04 Droplet 按照 Initial Server Setup 和 Ubuntu 16.04 进行设置,包括创建 sudo 非 root 用户。
- 安装Oracle JDK 8,您可以按照这篇Java安装文章的“安装Oracle JDK”部分进行操作
除非另有说明,本教程中所有需要 root 权限的命令都应以具有 sudo 权限的非 root 用户身份运行。
第 1 步 — 下载和安装 Elasticsearch
Elasticsearch 可以直接从 zip
、tar.gz
、deb
或 rpm
包中的 elastic.co 下载。 对于 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
然后使用 dpkg
以通常的 Ubuntu 方式安装它。
sudo dpkg -i elasticsearch-2.3.1.deb
这导致 Elasticsearch 安装在 /usr/share/elasticsearch/
中,其配置文件放置在 /etc/elasticsearch
中,其初始化脚本添加在 /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
指定服务器(节点)的名称以及与后者关联的集群。
如果您不自定义这些变量,则会根据 Droplet 主机名自动分配 node.name
。 cluster.name
将自动设置为默认集群的名称。
Elasticsearch 的自动发现功能使用 cluster.name
值来自动发现 Elasticsearch 节点并将其关联到集群。 因此,如果您不更改默认值,您的集群中可能会在同一网络上找到不需要的节点。
开始使用 nano
或您喜欢的文本编辑器编辑主 elasticsearch.yml
配置文件。
sudo nano /etc/elasticsearch/elasticsearch.yml
删除 cluster.name
和 node.name
行开头的 #
字符以取消注释,然后更新它们的值。 /etc/elasticsearch/elasticsearch.yml
文件中的第一个配置更改应如下所示:
/etc/elasticsearch/elasticsearch.yml
. . . cluster.name: mycluster1 node.name: "My First Node" . . .
这些是您可以开始使用 Elasticsearch 的最低设置。 但是,建议您继续阅读配置部分,以便更深入地了解和微调 Elasticsearch。
Elasticsearch 的一项特别重要的设置是服务器的角色,它要么是主服务器,要么是从服务器。 主服务器负责集群的健康和稳定。 在具有大量集群节点的大型部署中,建议拥有多个专用主节点。 通常,专用主服务器不会存储数据或创建索引。 因此,不应该有过载的机会,这可能会危及集群的健康。
从服务器用作可以加载数据任务的主力。 即使从节点过载,集群健康也不会受到严重影响,只要有其他节点承担额外的负载。
确定服务器角色的设置称为 node.master
。 默认情况下,节点是主节点。 如果您只有一个 Elasticsearch 节点,则应将此选项保留为默认的 true
值,因为始终需要至少一个主节点。 或者,如果您希望将节点配置为从站,请将 false
值分配给变量 node.master
,如下所示:
/etc/elasticsearch/elasticsearch.yml
. . . node.master: false . . .
另一个重要的配置选项是node.data
,它决定了一个节点是否存储数据。 在大多数情况下,此选项应保留其默认值 (true
),但有两种情况您可能不希望在节点上存储数据。 一种是当节点是专用主节点时”,如前所述。 另一种是节点仅用于从节点获取数据和聚合结果。 在后一种情况下,节点将充当 搜索负载平衡器 。
同样,如果您只有一个 Elasticsearch 节点,则不应更改此值。 否则,要禁用本地存储数据,请将 node.data
指定为 false
,如下所示:
/etc/elasticsearch/elasticsearch.yml
. . . node.data: false . . .
在具有许多节点的大型 Elasticsearch 部署中,另外两个重要选项是 index.number_of_shards
和 index.number_of_replicas
。 第一个确定索引将被拆分成多少块,或 shards。 第二个定义将在集群中分布的副本数。 拥有更多分片可以提高索引性能,而拥有更多副本则可以加快搜索速度。
默认情况下,分片数为 5,副本数为 1。 假设您仍在单个节点上探索和测试 Elasticsearch,您可以只从一个分片开始,没有副本。 因此,它们的值应该这样设置:
/etc/elasticsearch/elasticsearch.yml
. . . index.number_of_shards: 1 index.number_of_replicas: 0 . . .
您可能有兴趣更改的最后一个设置是 path.data
,它决定了存储数据的路径。 默认路径为 /var/lib/elasticsearch
。 在生产环境中,建议您使用专用的分区和挂载点来存储 Elasticsearch 数据。 在最好的情况下,这个专用分区将是一个单独的存储介质,可以提供更好的性能和数据隔离。 您可以通过如下方式指定不同的 path.data
路径:
/etc/elasticsearch/elasticsearch.yml
. . . path.data: /media/different_media . . .
完成所有更改后,保存并退出文件。 现在您可以第一次启动 Elasticsearch。
sudo systemctl start elasticsearch
在您尝试使用 Elasticsearch 之前,请先让其完全开始使用。 否则,您可能会收到有关无法连接的错误。
第 3 步 — 保护 Elasticsearch
默认情况下,Elasticsearch 没有内置安全性,任何可以访问 HTTP API 的人都可以对其进行控制。 这并不总是存在安全风险,因为 Elasticsearch 只侦听只能在本地访问的环回接口(即 127.0.0.1
)。 因此,只要所有服务器用户都受信任或者这是一个专用的 Elasticsearch 服务器,就不可能进行公共访问,并且您的 Elasticsearch 就足够安全。
不过,如果您希望加强安全性,首先要做的是启用身份验证。 身份验证由商业 Shield 插件 提供。 不幸的是,这个插件不是免费的,但您可以使用 30 天免费试用版来测试它。 它的官方页面有很好的安装和配置说明。 另外您可能需要知道的唯一一件事是 Elasticsearch 插件安装管理器的路径是 /usr/share/elasticsearch/bin/plugin
。
如果您不想使用商业插件,但仍然必须允许远程访问 HTTP API,您至少可以使用 Ubuntu 的默认防火墙 UFW(简单防火墙)限制网络暴露。 默认情况下,UFW 已安装但未启用。 如果您决定使用它,请按照下列步骤操作:
首先,创建一个规则以允许任何需要的服务。 您至少需要允许 SSH 才能登录服务器。 要允许在全球范围内访问 SSH,请将端口 22 列入白名单。
sudo ufw allow 22
然后允许访问受信任的远程主机的默认 Elasticsearch HTTP API 端口(TCP 9200),例如TRUSTED_IP
,如下所示:
sudo ufw allow from TRUSTED_IP to any port 9200
只有在那之后才能使用以下命令启用 UFW:
sudo ufw enable
最后,使用以下命令检查 UFW 的状态:
sudo ufw status
如果您正确指定了规则,则输出应如下所示:
Output of java -versionStatus: 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
,如下所示:
/etc/elasticsearch/elasticsearch.yml
. . . network.host: 0.0.0.0 . . .
我们指定了 0.0.0.0
以便 Elasticsearch 监听所有接口和绑定 IP。 如果您希望它仅在特定接口上侦听,则可以指定其 IP 代替 0.0.0.0
。
要使上述设置生效,请使用以下命令重新启动 Elasticsearch:
sudo systemctl restart elasticsearch
之后尝试从受信任的主机连接到 Elasticsearch。 如果无法连接,请确保 UFW 正在工作并且已正确指定 network.host
变量。
第 4 步 — 测试 Elasticsearch
现在,Elasticsearch 应该在 9200 端口上运行。 您可以使用 curl
、命令行客户端 URL 传输工具和简单的 GET 请求对其进行测试。
curl -X GET 'http://localhost:9200'
您应该看到以下响应:
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'
在上述命令的输出中,您可以查看并验证节点、集群、应用程序路径、模块等的所有当前设置。
第 5 步 — 使用 Elasticsearch
要开始使用 Elasticsearch,我们先添加一些数据。 如前所述,Elasticsearch 使用 RESTful API,它响应常见的 CRUD 命令:create、read、update 和 d 删除。 为了使用它,我们将再次使用 curl
。
您可以使用以下命令添加您的第一个条目:
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
您应该看到以下响应:
Output{"_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'
结果应如下所示:
Output{"_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 应该像这样确认成功的修改:
Output{ "_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'
现在响应将采用更好的格式:
Output{ "_index" : "tutorial", "_type" : "helloworld", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "message" : "Hello People!" } }
到目前为止,我们已经在 Elasticsearch 中添加和查询了数据。 要了解其他操作,请查看 API 文档。
结论
这就是安装、配置和开始使用 Elasticsearch 的容易程度。 一旦你玩够了手动查询,你的下一个任务就是从你的应用程序中开始使用它。