介绍
Elasticsearch是一个实时分布式搜索和数据分析的平台,其受欢迎性是由于其易于使用,强大的功能和可扩展性。
Elasticsearch 支持 RESTful 操作,这意味着您可以使用 HTTP 方法(GET, POST, PUT, DELETE 等)与 HTTP URI (/collection/entry) 结合来操纵您的数据。
Elasticsearch是一个免费的开源软件,其背后有一个坚实的公司 - Elastic. 这种组合使其适合用于从个人测试到企业整合的任何地方。
本文将向您介绍Elasticsearch,并向您展示如何安装,配置和开始使用它。
前提条件
在遵循本教程之前,请确保您完成以下先决条件:
- 一个 Ubuntu 14.04 Droplet
- 一个非 root sudo 用户. 查看 初始服务器设置与 Ubuntu 14.04 有关详细信息。
除非另有说明,本教程中需要 root 特权的所有命令都应该作为具有 sudo 特权的非 root 用户运行。
假设
本教程假设您的服务器正在使用一个VPN,如下所述: 如何使用Ansible和TincVPN来保护您的服务器基础设施。
如果您正在使用共享的私人网络,例如 DigitalOcean Private Networking,则此安全功能已在同一区域的团队或帐户上的服务器上启用。
第1步:安装Java
首先,你需要一个Java运行环境(JRE)在你的Droplet,因为Elasticsearch是写在Java编程语言。Elasticsearch需要Java 7或更高版本。
此步骤将向您展示如何安装两种版本,以便您可以决定哪种版本最适合您。
安装OpenJDK
JRE 的原生 Ubuntu OpenJDK 原生包是免费的,得到良好的支持,并通过 Ubuntu APT 安装管理器自动管理。
在使用 APT 安装 OpenJDK 之前,请通过运行命令更新可在 Ubuntu Droplet 上安装的可用包列表:
1sudo apt-get update
之后,您可以使用以下命令安装 OpenJDK:
1sudo apt-get install openjdk-7-jre
要验证您的 JRE 已安装并可使用,请运行命令:
1java -version
结果应该是这样的:
1[secondary_label Output of java -version]
2java version "1.7.0_79"
3OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)
4OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
安装Java 8
当您在使用 Elasticsearch 时取得进展并开始寻找更好的 Java 性能和兼容性时,您可以选择安装 Oracle 的专有 Java (Oracle JDK 8)。
将 Oracle Java PPA 添加到 apt:
1sudo add-apt-repository -y ppa:webupd8team/java
更新您的 apt 数据库:
1sudo apt-get update
使用此命令安装 Oracle Java 8 的最新稳定版本(并接受出现的许可协议):
1sudo apt-get -y install oracle-java8-installer
最后,检查是否已安装:
1java -version
步骤 2 – 下载和安装 Elasticsearch
Elasticsearch 可以直接从 elastic.co下载到 zip、tar.gz、deb 或 rpm 包中,对于 Ubuntu,最好使用 deb (Debian) 包,它将安装你需要运行 Elasticsearch 的所有内容。
在此写作时,最新的 Elasticsearch 版本是 1.7.2. 下载在您选择的目录中,使用命令:
1wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.deb
然后用dpkg
命令以通常的 Ubuntu 方式安装它:
1sudo dpkg -i elasticsearch-1.7.2.deb
<$>[note]
提示: 如果您想要最新版本的Elasticsearch,请前往 elastic.co找到链接,然后使用wget
将其下载到您的Droplet。
这导致Elasticsearch在/usr/share/elasticsearch/
中安装,其配置文件放置在/etc/elasticsearch
中,其 init 脚本添加到/etc/init.d/elasticsearch
。
要确保 Elasticsearch 通过 Droplet 自动启动和停止,请使用命令将其 init 脚本添加到默认的运行级别:
1sudo update-rc.d elasticsearch defaults
步骤 3 – 配置弹性
现在Elasticsearch及其Java依赖已安装,是时候配置Elasticsearch了。
Elasticsearch 配置文件位于 /etc/elasticsearch
目录中,有两个文件:
elasticsearch.yml
— 配置 Elasticsearch 服务器设置. 这里存储了所有选项,除了用于日志,这就是为什么我们对这个文件最感兴趣的原因.logging.yml
— 提供日志配置。 起初,您不需要编辑此文件。 您可以留下所有默认日志选项。 您可以默认地在 `/var/log/elasticsearch 中找到结果的日志。
在任何Elasticsearch服务器上定制的第一个变量是node.name
和cluster.name
在elasticsearch.yml
。
如果您不定制这些变量,则将自动分配一个node.name
与 Droplet 主机名有关,而cluster.name
将自动设置为默认集群的名称。
cluster.name
值由 Elasticsearch 自动检测功能用于自动检测并将 Elasticsearch 节点与集群相关联,因此,如果您不更改默认值,则在集群中可能存在相同网络上发现的不需要的节点。
要开始编辑主elasticsearch.yml
配置文件:
1sudo nano /etc/elasticsearch/elasticsearch.yml
删除#
字符为node.name
和cluster.name
,以免评论,然后更改它们的值。
1[label /etc/elasticsearch/elasticsearch.yml]
2...
3node.name: "My First Node"
4cluster.name: mycluster1
5...
另一个重要的设置是服务器的角色,它可以是主人
或奴隶
。主人
负责集群的健康和稳定性。在大量集群节点的大型部署中,建议有多个专门的主人
。 通常,一个专门的主人
不会存储数据或创建索引。 因此,不应该有过载的可能性,从而危及集群的健康。
奴隶
被用作可以负载数据任务的工作马
。即使一个奴隶
节点被过载,群集的健康也不应该受到严重影响,只要有其他节点可以承担额外的负载。
如果您只有一个 Elasticsearch 节点,您应该将此选项留下评论,以保持其默认值为true
- 也就是说,单个节点也应该是一个大师。
1[label /etc/elasticsearch/elasticsearch.yml]
2...
3node.master: false
4...
另一个重要的配置选项是node.data
,决定节点是否会存储数据。在大多数情况下,该选项应该留到默认值(true
),但有两种情况下,您可能不希望将数据存储在节点上。
再次,如果您只有一个 Elasticsearch 节点,则应将此设置留置评论,以保持默认值true
。否则,要禁用本地数据存储,请删除下列行评论并将值更改为false
:
1[label /etc/elasticsearch/elasticsearch.yml]
2...
3node.data: false
4...
另外两种重要选项是index.number_of_shards和index.number_of_replicas. 第一种选项决定了索引将被分成多少个部分(shards)。
假设您仍然在单个节点上探索和测试 Elasticsearch,最好从一个碎片开始,而不是复制品。
1[label /etc/elasticsearch/elasticsearch.yml]
2...
3index.number_of_shards: 1
4index.number_of_replicas: 0
5...
您可能对更改的最后一个设置是path.data
,它决定了数据存储的路径。默认路径是/var/lib/elasticsearch
。在生产环境中,建议您使用专用分区和安装点来存储Elasticsearch数据。在最佳情况下,这个专用分区将是一个单独的存储媒体,这将提供更好的性能和数据隔离。您可以通过不评论path.data
行并更改其值来指定不同的path.data
路径:
1[label /etc/elasticsearch/elasticsearch.yml]
2...
3path.data: /media/different_media
4...
完成所有更改后,请保存并退出文件,现在您可以使用以下命令首次启动 Elasticsearch:
1sudo service elasticsearch start
请允许 Elasticsearch 在您能够使用它之前至少启动 10 秒,否则您可能会收到关于无法连接的错误。
步骤4:确保弹性
Elasticsearch 没有内置的安全性,可以由任何可以访问 HTTP API 的用户控制。本节不是保护 Elasticsearch 的全面指南。 采取任何必要措施,以防止未经授权的访问它以及它运行的服务器/虚拟机。 考虑使用 iptables以进一步保护您的系统。
第一個安全調整是防止公開存取. 要移除公開存取,請編輯「elasticsearch.yml」檔案:
1sudo nano /etc/elasticsearch/elasticsearch.yml
查找包含network.bind_host
的行,通过在行开始时删除#
字符来删除评论,然后将值更改为localhost
,使其看起来像这样:
1[label /etc/elasticsearch/elasticsearch.yml]
2...
3network.bind_host: localhost
4...
<$>[警告] 警告: 由于 Elasticsearch 没有内置的安全性,所以非常重要的是不要将此设置为任何您无法控制或信任的服务器可访问的 IP 地址。 不要将 Elasticsearch 绑定到公共或 共享的私人网络 IP 地址! <$> 此外,为了额外的安全性,您可以禁用用于评估自定义表达式的动态脚本。
若要禁用自定义表达式,请在 /etc/elasticsearch/elasticsearch.yml
文件的末尾添加以下行:
1...
2[label /etc/elasticsearch/elasticsearch.yml]
3script.disable_dynamic: true
4...
步骤五:测试
到目前为止,Elasticsearch 应该在端口 9200 上运行,您可以使用 curl、命令行客户端 URL 转移工具和一个简单的 GET 请求来测试它:
1curl -X GET 'http://localhost:9200'
你应该看到以下答案:
1[secondary_label Output of curl]
2{
3 "status" : 200,
4 "name" : "Harry Leland",
5 "cluster_name" : "elasticsearch",
6 "version" : {
7 "number" : "1.7.2",
8 "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
9 "build_timestamp" : "2015-09-14T09:49:53Z",
10 "build_snapshot" : false,
11 "lucene_version" : "4.10.4"
12 },
13 "tagline" : "You Know, for Search"
14}
如果您看到类似上述的响应,则 Elasticsearch 正在正常工作. 否则,请确保您正确遵循安装说明,并允许 Elasticsearch 完全启动一段时间。
步骤 6 – 使用 Elasticsearch
如前所述,Elasticsearch使用RESTful API,该 API响应常见的CRUD命令:创建,阅读,更新和删除。
您可以使用以下命令添加您的第一个条目:
1curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
你应该看到以下答案:
1[secondary_label Output]
2{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"created":true}
使用 curl,我们将 HTTP POST 请求发送到 Elasticseach 服务器. 请求的 URI 是 /tutorial/helloworld/1
。
tutorial
是 Elasticsearch 中的数据索引helloworld
是类型1
是我们在上面的索引和类型下输入的 ID
您可以通过这样的 HTTP GET 请求获取这个第一个条目:
1curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
结果应该看起来像:
1[secondary_label Output]
2{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}
若要更改现有条目,您可以使用这样的 HTTP PUT 请求:
1curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
2{
3 "message": "Hello People!"
4}'
Elasticsearch 应该承认这样的成功修改:
1[secondary_label Output]
2{
3 "_index" : "tutorial",
4 "_type" : "helloworld",
5 "_id" : "1",
6 "_version" : 2,
7 "created" : false
8}
在上面的示例中,我们将第一个条目的消息
更改为你好!
这样,版本号就自动增加到2
。
您可能在上述请求中注意到额外的参数漂亮
,它允许人类可读的格式,因此您可以将每个数据字段写在一个新的行上。
1curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
现在,答案将以更好的格式:
1[secondary_label Output]
2{
3 "_index" : "tutorial",
4 "_type" : "helloworld",
5 "_id" : "1",
6 "_version" : 2,
7 "found" : true,
8 "_source":{ "message": "Hello World!" }
9}
到目前为止,我们已经在 Elasticsearch 中添加并查询了数据. 有关其他操作的信息,请查看 API 文档。
结论
安装、配置和开始使用 Elasticsearch 是多么容易,一旦你已经玩了足够的手动查询,你的下一个任务将是从你的应用程序开始使用它。