如何在 Ubuntu 16.04 上安装和配置 Elasticsearch

介绍

Elasticsearch是一个实时分布式搜索和数据分析的平台,其受欢迎性是由于其易于使用,强大的功能和可扩展性。

Elasticsearch 支持 RESTful 操作,这意味着您可以使用 HTTP 方法 (GET, POST, PUT, DELETE 等) 与 HTTP URI (`/collection/entry') 结合来操纵您的数据。

Elasticsearch是一个免费和开源的软件,其背后有一个坚实的公司:Elastic. 这种组合使其适合用于从个人测试到企业整合。

本文将向您介绍 Elasticsearch,并向您展示如何安装,配置,安全,并开始使用它。

前提条件

在遵循本教程之前,您将需要:

除非另有说明,本教程中需要 root 特权的所有命令都应该作为具有 sudo 特权的非 root 用户运行。

步骤 1 – 下载和安装 Elasticsearch

Elasticsearch 可以直接从 elastic.co下载到 ziptar.gzdebrpm 套件中. 对于 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.namecluster.nameelasticsearch.yml

如果您不定制这些变量,则将自动分配一个node.name与 Droplet 主机名有关,而cluster.name将自动设置为默认集群的名称。

cluster.name 值由 Elasticsearch 自动检测功能用于自动检测并将 Elasticsearch 节点与集群相关联,因此,如果您不更改默认值,则在集群中可能存在相同网络上发现的不需要的节点。

要开始编辑主elasticsearch.yml配置文件,使用nano或您最喜欢的文本编辑器。

1sudo nano /etc/elasticsearch/elasticsearch.yml

删除#字符在cluster.namenode.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_shardsindex.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 是多么容易,一旦你已经玩了足够的手动查询,你的下一个任务将是从你的应用程序开始使用它。

Published At
Categories with 技术
comments powered by Disqus