介绍
Elasticsearch是一个实时分布式搜索和数据分析的平台,其受欢迎性是由于其易于使用,强大的功能和可扩展性。
Elasticsearch 支持 RESTful 操作,这意味着您可以使用 HTTP 方法 (GET, POST, PUT, DELETE 等) 与 HTTP URI (`/collection/entry') 结合来操纵您的数据。
Elasticsearch是一个免费和开源的软件,其背后有一个坚实的公司:Elastic. 这种组合使其适合用于从个人测试到企业整合。
本文将向您介绍 Elasticsearch,并向您展示如何安装,配置,安全,并开始使用它。
前提条件
在遵循本教程之前,您将需要:
- 通过遵循 Ubuntu 16.04 初始服务器设置设置Ubuntu 16.04 Droplet,包括创建一个 sudo 非根用户
- Oracle JDK 8 安装,您可以通过遵循 [本 Java 安装文章]的
安装 Oracle JDK
部分(https://andsky.com/tech/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04)
除非另有说明,本教程中需要 root 特权的所有命令都应该作为具有 sudo 特权的非 root 用户运行。
步骤 1 – 下载和安装 Elasticsearch
Elasticsearch 可以直接从 elastic.co下载到 zip
、 tar.gz
、 deb
或 rpm
套件中. 对于 Ubuntu,最好使用 deb
(Debian) 套件来安装您运行 Elasticsearch 所需的一切。
首先,更新您的包索引。
1sudo apt-get update
下载最新 Elasticsearch 版本,该版本在写作时为 2.3.1。
1wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb
然后以通常的Ubuntu方式安装它,使用dpkg
。
1sudo dpkg -i elasticsearch-2.3.1.deb
这导致Elasticsearch在/usr/share/elasticsearch/
中安装,其配置文件放置在/etc/elasticsearch
中,其 init 脚本添加到/etc/init.d/elasticsearch
。
要确保 Elasticsearch 自动启动和停止服务器,请将其 init 脚本添加到默认的运行级别。
1sudo systemctl enable elasticsearch.service
在首次启动 Elasticsearch 之前,请查看下一节关于推荐的最低配置。
步骤 2 – 配置 Elasticsearch
现在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
配置文件,使用nano
或您最喜欢的文本编辑器。
1sudo nano /etc/elasticsearch/elasticsearch.yml
删除#
字符在cluster.name
和node.name
字符的开头,以排除评论,然后更新它们的值。
1[label /etc/elasticsearch/elasticsearch.yml]
2. . .
3cluster.name: mycluster1
4node.name: "My First Node"
5. . .
这些是您可以开始使用 Elasticsearch 的最低设置,但建议您继续阅读配置部分,以便更好地了解和精心调整 Elasticsearch。
Elasticsearch的一个特别重要的设置是服务器的角色,它是主或奴隶。 主服务器 负责集群的健康和稳定性。在大量集群节点的大型部署中,建议拥有多于一个专用主。
Slave服务器 被用作可加载数据任务的工作马,即使一个奴隶节点过载,群集的健康也不应该受到严重影响,只要有其他节点可以承担额外的负载。
决定服务器角色的设置称为node.master
。默认情况下,节点是主节点,如果您只有一个Elasticsearch节点,您应该将此选项留给默认值true
,因为至少需要一个主节点。
1[label /etc/elasticsearch/elasticsearch.yml]
2. . .
3node.master: false
4. . .
另一个重要的配置选项是node.data
,决定节点是否会存储数据。在大多数情况下,该选项应该留到默认值(true
),但有两种情况下,您可能不希望将数据存储在节点上。
如果您只有一个 Elasticsearch 节点,则不应该更改此值,否则,要禁用本地存储数据,请将 node.data' 指定为
false' 如下:
1[label /etc/elasticsearch/elasticsearch.yml]
2. . .
3node.data: false
4. . .
在具有许多节点的大型 Elasticsearch 部署中,另有两种重要选项是index.number_of_shards
和index.number_of_replicas
。第一个决定了将索引分成多少个片段或 shards,第二个决定了将分布在群集中的复制件数。
默认情况下,碎片数为5个,复制件数为1个。假设您仍然在单个节点上探索和测试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数据。在最佳情况下,这个专用分区将是一个单独的存储媒体,这将提供更好的性能和数据隔离。
1[label /etc/elasticsearch/elasticsearch.yml]
2. . .
3path.data: /media/different_media
4. . .
完成所有更改后,保存并退出文件,现在您可以首次启动 Elasticsearch。
1sudo systemctl start elasticsearch
在尝试使用 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(Uncomplicated Firewall)来限制网络曝光。
首先,创建一个允许任何必要的服务的规则. 您需要至少允许 SSH,以便您可以登录服务器。
1sudo ufw allow 22
然后允许访问可信远程主机的默认 Elasticsearch HTTP API 端口(TCP 9200),例如‘TRUSTED_IP’,如下:
1sudo ufw allow from TRUSTED_IP to any port 9200
只有在那之后才能使用 UFW 命令:
1sudo ufw enable
最后,用以下命令检查 UFW 的状态:
1sudo ufw status
如果您正确地指定了规则,输出应该是这样的:
1[secondary_label Output of java -version]
2Status: active
3
4To Action From
5-- ------ ----
69200 ALLOW TRUSTED_IP
722 ALLOW Anywhere
822 (v6) ALLOW Anywhere (v6)
确认 UFW 已启用并保护 Elasticsearch 端口 9200 后,您可以允许 Elasticsearch 收听外部连接。
1sudo nano /etc/elasticsearch/elasticsearch.yml
查找包含network.bind_host
的行,通过在行开始时删除#
字符来删除评论,然后将值更改为0.0.0.0
,以便它看起来像这样:
1[label /etc/elasticsearch/elasticsearch.yml]
2. . .
3network.host: 0.0.0.0
4. . .
我们已指定0.0.0.0
,以便Elasticsearch在所有界面上倾听和绑定IP. 如果您希望它只在特定界面上倾听,您可以指定其IP而不是0.0.0.0
。
要使上述设置生效,请使用命令重新启动 Elasticsearch:
1sudo systemctl restart elasticsearch
然后尝试从受信任的主机连接到 Elasticsearch. 如果您无法连接,请确保 UFW 工作,并正确指定network.host
变量。
步骤 4 – 测试 Elasticsearch
到目前为止,Elasticsearch应该在端口9200上运行,您可以使用curl
,命令行客户端URL转移工具和简单的GET请求来测试它。
1curl -X GET 'http://localhost:9200'
你应该看到以下答案:
1[secondary_label Output of curl]
2{
3 "name" : "My First Node",
4 "cluster_name" : "mycluster1",
5 "version" : {
6 "number" : "2.3.1",
7 "build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
8 "build_timestamp" : "2016-04-04T12:25:05Z",
9 "build_snapshot" : false,
10 "lucene_version" : "5.5.0"
11 },
12 "tagline" : "You Know, for Search"
13}
如果您看到类似上述的响应,则 Elasticsearch 正在正常工作. 否则,请确保您正确遵循安装说明,并允许 Elasticsearch 完全启动一段时间。
要对 Elasticsearch 进行更彻底的检查,请执行以下命令:
1curl -XGET 'http://localhost:9200/_nodes?pretty'
在上面的命令的输出中,您可以看到和验证节点,集群,应用路径,模块等的所有当前设置。
第5步:使用Elasticsearch
如前所述,Elasticsearch使用RESTful API,它响应常见的CRUD命令: create, read, update,和 delete。
您可以使用以下命令添加您的第一个条目:
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,"_shards":{"total":2,"successful":1,"failed":0},"created":true}
使用curl
,我们将 HTTP POST 请求发送到 Elasticsearch 服务器. 请求的 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 "_shards" : {
8 "total" : 2,
9 "successful" : 1,
10 "failed" : 0
11 },
12 "created" : false
13}
在上面的示例中,我们将第一个条目的消息
更改为你好!
这样,版本号就自动增加到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" : {
9 "message" : "Hello People!"
10 }
11}
到目前为止,我们已经在 Elasticsearch 中添加并查询了数据. 有关其他操作的信息,请查看 API 文档。
结论
安装、配置和开始使用 Elasticsearch 是多么容易,一旦你已经玩了足够的手动查询,你的下一个任务将是从你的应用程序开始使用它。