如何在 Ubuntu 14.04 上安装和配置 Elasticsearch
介绍
Elasticsearch 是一个实时分布式搜索和分析数据的平台。它的流行是由于它的易用性、强大的功能和可扩展性。
Elasticsearch 支持 RESTful 操作。这意味着您可以结合使用 HTTP 方法(GET、POST、PUT、DELETE 等)和 HTTP URI (/collection/entry) 来操作数据。直观的 RESTful 方法对开发人员和用户都很友好,这也是 Elasticsearch 流行的原因之一。
Elasticsearch 是一款免费的开源软件,背后有一家实力雄厚的公司——Elastic。这种组合使其适用于从个人测试到企业集成的任何地方。
本文将向您介绍 Elasticsearch,并向您展示如何安装、配置和开始使用它。
先决条件
在学习本教程之前,请确保您完成以下先决条件:
- 一个 Ubuntu 14.04 Droplet
- 非 root sudo 用户。有关详细信息,请查看使用 Ubuntu 14.04 进行初始服务器设置。
除非另有说明,否则本教程中所有需要 root 权限的命令都应以具有 sudo 权限的非 root 用户身份运行。
假设
本教程假设您的服务器正在使用此处描述的 VPN:如何使用 Ansible 和 Tinc VPN 来保护您的服务器基础设施。无论您的服务器使用的物理网络如何,这都将提供专用网络功能。
如果您使用的是共享专用网络,例如 DigitalOcean 专用网络,那么此安全功能将已经为同一团队或同一地区的同一帐户的服务器启用。这在使用 Elasticsearch 时尤为重要,因为它的 HTTP 接口中没有内置安全性。
第 1 步 — 安装 Java
首先,您需要在 Droplet 上安装 Java 运行时环境 (JRE),因为 Elasticsearch 是用 Java 编程语言编写的。 Elasticsearch 需要 Java 7 或更高版本。 Elasticsearch 推荐 Oracle JDK 版本 1.8.0_73,但 JRE 的原生 Ubuntu OpenJDK 原生包也可以使用。
此步骤向您展示了如何安装这两个版本,以便您可以决定哪个版本最适合您。
安装 OpenJDK
用于 JRE 的原生 Ubuntu OpenJDK 原生包是免费的,受到良好支持,并通过 Ubuntu APT 安装管理器自动管理。
在使用 APT 安装 OpenJDK 之前,请通过运行以下命令更新可安装在 Ubuntu Droplet 上的软件包列表:
- sudo apt-get update
之后,您可以使用以下命令安装 OpenJDK:
- sudo apt-get install openjdk-7-jre
要验证您的 JRE 是否已安装并且可以使用,请运行以下命令:
- java -version
结果应如下所示:
Output of java -versionjava version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
安装 Java 8
当您进一步使用 Elasticsearch 并开始寻求更好的 Java 性能和兼容性时,您可以选择安装 Oracle 的专有 Java (Oracle JDK 8)。
将 Oracle Java PPA 添加到 apt:
- sudo add-apt-repository -y ppa:webupd8team/java
更新您的 apt 包数据库:
- sudo apt-get update
使用此命令安装最新稳定版本的 Oracle Java 8(并接受弹出的许可协议):
- sudo apt-get -y install oracle-java8-installer
最后,验证它是否已安装:
- java -version
第 2 步 — 下载并安装 Elasticsearch
Elasticsearch 可以直接从 elastic.co 下载 zip、tar.gz、deb 或 rpm 包。对于 Ubuntu,最好使用 deb (Debian) 包,它将安装运行 Elasticsearch 所需的一切。
在撰写本文时,最新的 Elasticsearch 版本是 1.7.2。使用以下命令将其下载到您选择的目录中:
- wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.deb
然后使用 dpkg
命令以通常的 Ubuntu 方式安装它,如下所示:
- sudo dpkg -i elasticsearch-1.7.2.deb
提示:如果您想要最新发布的 Elasticsearch 版本,请前往 elastic.co 找到链接,然后使用 wget
将其下载到您的 Droplet。请务必下载 deb 包。
这导致 Elasticsearch 安装在 /usr/share/elasticsearch/
中,其配置文件放置在 /etc/elasticsearch
中,其初始化脚本添加在 /etc/ 中init.d/弹性搜索
。
为了确保 Elasticsearch 使用 Droplet 自动启动和停止,请使用以下命令将其初始化脚本添加到默认运行级别:
- sudo update-rc.d elasticsearch defaults
第 3 步 — 配置 Elastic
现在已经安装了 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
将自动设置为默认集群的名称。
cluster.name
值由 Elasticsearch 的自动发现功能使用,以自动发现 Elasticsearch 节点并将其关联到集群。因此,如果您不更改默认值,您的集群中可能会在同一网络上发现不需要的节点。
开始编辑主 elasticsearch.yml
配置文件:
- sudo nano /etc/elasticsearch/elasticsearch.yml
删除 node.name
和 cluster.name
行开头的 #
字符以取消注释,然后更改它们的值。 /etc/elasticsearch/elasticsearch.yml
文件中的第一个配置更改应如下所示:
...
node.name: "My First Node"
cluster.name: mycluster1
...
另一个重要的设置是服务器的角色,可以是“master”或“slave”。 \Masters 负责集群的健康和稳定性。在具有大量集群节点的大型部署中,建议拥有多个专用的 \master。通常,专用的“master”不会存储数据或创建索引。因此,不应该有过载的机会,而过载可能会危及集群的健康。
\Slaves作为\workhorses,可以承载数据任务。即使“从”节点过载,只要有其他节点承担额外的负载,集群的健康状况也不会受到严重影响。
确定服务器角色的设置称为 node.master
。如果您只有一个 Elasticsearch 节点,您应该将此选项注释掉,以便它保持其默认值 true
— 即唯一节点也应该是主节点。或者,如果您希望将节点配置为从节点,请删除 node.master
行开头的 #
字符,并将值更改为 false
:
...
node.master: false
...
另一个重要的配置选项是 node.data
,它决定了节点是否存储数据。在大多数情况下,此选项应保留为其默认值 (true
),但在两种情况下您可能不希望在节点上存储数据。一种是节点是专用的“主节点”,正如我们已经提到的。另一种是节点仅用于从节点获取数据和聚合结果。在后一种情况下,节点将充当“主节点”。搜索负载均衡器”。
同样,如果您只有一个 Elasticsearch 节点,则应将此设置注释掉,以便它保留默认的 true
值。否则,要禁用本地存储数据,请取消注释以下行并将值更改为 false
:
...
node.data: false
...
另外两个重要的选项是 index.number_of_shards
和 index.number_of_replicas
。第一个决定索引将被分成多少块(分片)。第二个定义将分布在集群中的副本数。拥有更多分片可以提高索引性能,而拥有更多副本可以加快搜索速度。
假设您仍在探索和测试单个节点上的 Elasticsearch,最好从一个分片开始,没有副本。因此,它们的值应设置为以下(确保删除行开头的 #
):
...
index.number_of_shards: 1
index.number_of_replicas: 0
...
您可能有兴趣更改的最后一项设置是 path.data
,它决定了数据存储的路径。默认路径是 /var/lib/elasticsearch
。在生产环境中,建议您使用专用分区和挂载点来存储 Elasticsearch 数据。在最好的情况下,这个专用分区将是一个单独的存储介质,它将提供更好的性能和数据隔离。您可以通过取消注释 path.data
行并更改其值来指定不同的 path.data
路径:
...
path.data: /media/different_media
...
完成所有更改后,请保存并退出文件。现在您可以使用以下命令首次启动 Elasticsearch:
- sudo service elasticsearch start
请等待至少 10 秒让 Elasticsearch 完全启动,然后才能使用它。否则,您可能会收到有关无法连接的错误。
第 4 步 — 保护 Elastic
Elasticsearch 没有内置的安全性,任何可以访问 HTTP API 的人都可以控制它。本节不是保护 Elasticsearch 的综合指南。采取任何必要的措施来防止未经授权访问它以及运行它的服务器/虚拟机。考虑使用 iptables 来进一步保护您的系统。
第一个安全调整是防止公众访问。要删除公共访问权限,请编辑文件 elasticsearch.yml
:
- sudo nano /etc/elasticsearch/elasticsearch.yml
找到包含 network.bind_host
的行,通过删除行开头的 #
字符取消注释,并将值更改为 localhost
所以它看起来像这样:
...
network.bind_host: localhost
...
警告:因为 Elasticsearch 没有任何内置的安全性,所以不要将此设置为任何不受您控制或信任的服务器可访问的 IP 地址,这一点非常重要。不要将 Elasticsearch 绑定到公共或共享的私有网络 IP 地址!
此外,为了提高安全性,您可以禁用用于评估自定义表达式的动态脚本。通过制作自定义恶意表达式,攻击者可能会破坏您的环境。
要禁用自定义表达式,请在 /etc/elasticsearch/elasticsearch.yml
文件的末尾添加以下行:
...
[label /etc/elasticsearch/elasticsearch.yml]
script.disable_dynamic: true
...
第 5 步 — 测试
到目前为止,Elasticsearch 应该在端口 9200 上运行。您可以使用 curl、命令行客户端 URL 传输工具和一个简单的 GET 请求来测试它,如下所示:
- curl -X GET 'http://localhost:9200'
您应该看到以下响应:
Output of curl{
"status" : 200,
"name" : "Harry Leland",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.7.2",
"build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
"build_timestamp" : "2015-09-14T09:49:53Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}
如果您看到与上面类似的响应,则 Elasticsearch 工作正常。如果没有,请确保您已正确按照安装说明进行操作,并且您已预留一些时间让 Elasticsearch 完全启动。
第 6 步 — 使用 Elasticsearch
要开始使用 Elasticsearch,让我们先添加一些数据。如前所述,Elasticsearch 使用 RESTful API,它响应通常的 CRUD 命令:创建、读取、更新和删除。为了使用它,我们将再次使用 curl。
您可以使用以下命令添加您的第一个条目:
- curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
您应该看到以下响应:
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"created":true}
通过 curl,我们向 Elasticseach 服务器发送了一个 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,
"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 World!" }
}
到目前为止,我们已经在 Elasticsearch 中添加和查询了数据。要了解其他操作,请查看 API 文档。
结论
这就是安装、配置和开始使用 Elasticsearch 的简单之处。一旦您玩够了手动查询,您的下一个任务就是开始在您的应用程序中使用它。