Elasticsearch(有时称为 ES)最初于 2010 年发布,是一种基于 Apache Lucene 的现代搜索和分析引擎。Elasticsearch 是用 Java 构建的,是一个 NoSQL 数据库。这意味着它以非结构化方式存储数据,您不能使用 SQL 来查询它。
此 Elasticsearch 教程也可以视为 NoSQL 教程。然而,与大多数 NoSQL 数据库不同,Elasticsearch 非常注重搜索功能和特性——事实上,从 ES 获取数据的最简单方法是使用广泛的 Elasticsearch API 进行搜索。
在数据分析方面,Elasticsearch 与 ELK Stack、Logstash 和 Kibana 中的其他组件一起使用,起到数据索引和存储的作用。如今,Logstash 通常被更小、更轻量级的组件所取代,例如Fluentd 或 FluentBit——它们可以完成 Logstash 的大部分功能,而无需繁重的计算足迹和常见的挑战。
正如您将在本教程中看到的,开始使用 Elasticsearch 并不是火箭科学。尤其是在您设置小型集群时,实施 ELK 日志记录管道非常简单。
但是,一旦开始发送更多数据,ELK 管理就需要更多工作。您将需要管理和扩展更大的集群,实施更多数据解析,安装和管理像 Kafka 这样的数据队列来缓冲您的日志,也许升级您的 ELK 组件,并监控和调整您的堆栈以解决性能问题。
对于那些不想自己管理这些任务并需要 RBAC 等额外功能的人,Logz.io 构建了一个日志管理工具,提供 ELK-as-a-service(现在是 OpenSearch-as-a-service!),这样您就可以拥抱世界领先的日志记录平台,而无需自己运行它。Logz.io 还支持度量和跟踪分析——在此处了解 Logz.io 统一和增强领先的开源可观察性技术的方式。
总而言之,对于小型集群,自己运行 Elasticsearch 是一个不错的选择。让我们看看如何开始。
Elasticsearch的要求很简单:Java 8(具体版本推荐:Oracle JDK version 1.8.0_131)。查看此Logstash 教程以确保您已准备就绪。此外,您需要确保您的操作系统在Elastic 支持矩阵中,否则您可能会遇到奇怪且不可预测的问题。完成后,您可以开始安装 Elasticsearch。
您可以下载 Elasticsearch作为独立发行版或使用apt
和yum
存储库安装它。我们将在AWS EC2上运行的 Ubuntu 16.04 机器上使用apt
.
首先,您需要添加 Elastic 的签名密钥,以便您可以验证下载的包(如果您已经从 Elastic 安装包,请跳过此步骤):
wget -qO - https://artifacts.elastic.co/gpg-key-elasticsearch | sudo apt-key 添加 -
复制
对于 Debian,我们需要安装软件包apt-transport-https
:
sudo apt-get 安装 apt-transport-https
复制
下一步是将存储库定义添加到您的系统:
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
复制
剩下要做的就是更新您的存储库并安装 Elasticsearch:
sudo apt-get 更新sudo apt-get 安装 elasticsearch
复制
Elasticsearch 配置是使用配置文件完成的,其位置取决于您的操作系统。在此文件中,您可以配置常规设置(例如节点名称),以及网络设置(例如主机和端口)、存储数据的位置、内存、日志文件等。
出于开发和测试目的,默认设置就足够了,但建议您研究一下在投入生产之前应该手动定义哪些设置。
例如,特别是如果在云上安装 Elasticsearch,将 Elasticsearch 绑定到私有 IP 或本地主机是一个很好的最佳实践:
sudo vim /etc/elasticsearch/elasticsearch.yml网络主机:“本地主机”http.端口:9200
复制
Elasticsearch 安装后不会自动运行,需要手动启动。您如何运行 Elasticsearch 将取决于您的特定系统。在大多数基于 Linux 和 Unix 的系统上,您可以使用此命令:
sudo 服务 elasticsearch 启动
复制
就是这样!要确认一切正常,只需将 curl 或浏览器指向http://localhost:9200
,您应该会看到类似以下的输出:
{ “名称”:“33QdmXw”, “集群名称”:“弹性搜索”, “cluster_uuid”:“mTkBe_AlSZGbX-vDIe_vZQ”, “版本” : { “数字”:“6.1.2”, “build_hash”:“5b1fea5”, “build_date”:“2018-01-10T02:35:59.208Z”, “build_snapshot”:假的, “lucene_version”:“7.1.0”, “最低_wire_compatibility_version”:“5.6.0”, “最低_index_compatibility_version”:“5.0.0” }, "tagline" : "You Know, for Search"}
复制
要调试运行 Elasticsearch 的过程,请使用位于(Deb 上)中的 Elasticsearch 日志文件/var/log/elasticsearch/
。
索引是将数据添加到 Elasticsearch 的过程。这是因为当您将数据输入 Elasticsearch 时,数据会被放入Apache Lucene索引中。这是有道理的,因为 Elasticsearch 使用 Lucene 索引来存储和检索其数据。尽管您不需要对 Lucene 了解很多,但是当您开始认真使用 Elasticsearch 时了解它的工作原理确实会有所帮助。
Elasticsearch 的行为类似于 REST API,因此您可以使用 或POST
方法PUT
向其添加数据。PUT
当您知道或想要指定id
数据项的时,或者如果您希望 Elasticsearch为数据项POST
生成一个时,您可以使用:id
curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "时间戳": "2018-01-24 12:34:56", "message": "用户登录", “用户 ID”:4, “管理员”:假}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ “编号”:4, “用户名”:“约翰”, “last_login”:“2018-01-25 12:34:56”}'
复制
和回应:
{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2, “成功”:1,“失败”:0},“_seq_no”:0,“_primary_term”:1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2, “成功”:1,“失败”:0},“_seq_no”:0,“_primary_term”:1}
复制
文档的数据作为 JSON 对象发送。您可能想知道我们如何在不定义数据结构的情况下索引数据。好吧,与任何其他 NoSQL 数据库一样,使用 Elasticsearch 不需要事先定义数据的结构。不过,为确保最佳性能,您可以根据数据类型定义 Elasticsearch 映射。稍后会详细介绍。
如果您使用任何 Beats shippers(例如 Filebeat 或 Metricbeat)或 Logstash,ELK Stack 的这些部分将自动创建索引。
要查看 Elasticsearch 索引列表,请使用:
curl -XGET 'localhost:9200/_cat/indices?v&pretty'健康状态索引 uuid pri rep docs.count docs.deleted store.size pri.store.size黄色打开 logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mb黄色打开应用程序 GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kb黄色打开 .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kb黄色打开日志 T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb
复制
本例中的列表包括我们在上面创建的索引、一个 Kibana 索引和一个由 Logstash 管道创建的索引。
一旦将数据索引到 Elasticsearch 中,就可以开始搜索和分析数据。您可以执行的最简单的查询是获取单个项目。阅读我们专门关注Elasticsearch 查询的文章。
再一次,通过 Elasticsearch REST API,我们使用GET
:
curl -XGET 'localhost:9200/app/users/4?pretty'
复制
和回应:
{ “_index”:“应用程序”, “_type”:“用户”, “_id”:“4”, “_版本”:1, “发现”:真实, “_来源” : { “编号”:4, “用户名”:“约翰”, “last_login”:“2018-01-25 12:34:56” }}
复制
以下划线开头的字段都是结果的元字段。该_source
对象是被索引的原始文档。
我们还使用 GET 通过调用端点进行搜索_search
:
curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total ":1,"max_score":0.2876821,"hits":[{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_score":0.2876821,"_source":{ "时间戳": "2018-01-24 12:34:56", "message": "用户登录", “用户 ID”:4, “管理员”:假}}]}}
复制
结果包含许多描述搜索和结果的额外字段。这是一个简要的概述:
took
:搜索花费的时间(以毫秒为单位)
timed_out: If the search timed out
_shards
:搜索到的Lucene分片数量,以及成功率和失败率
hits
:实际结果,以及结果的元信息
我们在上面进行的搜索称为URI 搜索,是查询 Elasticsearch 的最简单方法。通过仅提供一个词,ES 将在所有文档的所有字段中搜索该词。您可以使用Lucene 查询构建更具体的搜索:
username:johnb – 查找用户名字段等于“johnb”的文档
john* – 查找包含以 john 开头且后跟零个或多个字符(例如“john”、“johnb”和“johnson”)的术语的文档
约翰?– 查找包含以 john 开头且仅后跟一个字符的术语的文档。匹配“johnb”和“johns”但不匹配“john”。
还有许多其他搜索方法,包括使用布尔逻辑、词条提升、模糊和邻近搜索的使用以及正则表达式的使用。
URI 搜索只是一个开始。Elasticsearch 还提供带有查询 DSL 的请求主体搜索,用于更高级的搜索。在这些类型的搜索中有大量可用的选项,您可以混合搭配不同的选项以获得所需的结果。
它包含两种子句:1) 在特定字段中查找值的叶查询子句,以及 2) 复合查询子句(可能包含一个或多个叶查询子句)。
在这些类型的搜索中有大量可用的选项,您可以混合搭配不同的选项以获得所需的结果。查询类型包括:
地理查询,
“更像这样”的查询
脚本查询
全文查询
形状查询
跨度查询
术语级查询
专业查询
从 Elasticsearch 6.8 开始,ELK Stack 已经合并了 Elasticsearch query 和 Elasticsearch filters,但 ES 仍然通过上下文来区分它们。DSL 区分过滤上下文和查询子句的查询上下文。过滤器上下文中的子句以布尔方式测试文档:文档是否匹配过滤器,“是”或“否”?过滤器通常也比查询更快,但查询也可以根据文档与查询的匹配程度来计算相关性分数。过滤器不使用相关性分数。这决定了文档的排序和包含:
curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ “询问”: { “匹配短语”:{ "message": "用户登录" } }}'
复制
结果:
{ “花了”:28, “超时”:假的, “_碎片”:{ “总计”:5, “成功”:5, “跳过”:0, “失败”:0 }, “命中”:{ “总计”:1, “最大分数”:0.8630463, “命中”:[ { “_index”:“日志”, “_type”:“我的应用程序”, “_id”:“ZsWdJ2EBir6MIbMWSMyF”, “_分数”:0.8630463, “_来源” : { “时间戳”:“2018-01-24 12:34:56”, "message" : "用户登录", “用户 ID”:4, “管理员”:假 } } ] }}'
复制
维护一个 Elasticsearch 集群可能很耗时,尤其是当你在做 DIY ELK 的时候。但是,考虑到 Elasticsearch 强大的搜索和分析能力,这样的集群是必不可少的。我们通过Elasticsearch 集群教程对这个主题进行了更深入的研究,因此我们将以此为跳板进行更彻底的演练。
究竟什么是 Elasticsearch 集群?Elasticsearch 集群将多个 Elasticsearch 节点和/或实例组合在一起。当然,您始终可以选择在给定集群中维护单个 Elasticsearch 实例或节点。这种分组的要点在于集群在其节点上的任务分布、搜索和索引。节点选项包括数据节点、主节点、客户端节点和摄取节点。
安装节点可能涉及很多配置,我们前面提到的教程涵盖了这些配置。但这里是基本的 Elasticsearch 集群节点安装:
首先,安装 Java:
sudo apt-get install default-jre
复制
接下来,添加 Elasticsearch 的登录密钥:
wget -qO - https://artifacts.elastic.co/gpg-key-elasticsearch | sudo apt-key 添加 -
复制
接下来,安装 Elasticsearch 的新版本:
sudo apt-get update && apt-get install elasticsearch
复制
您必须创建和/或设置每个 Elasticsearch 节点自己的elasticsearch.yml
配置文件 ( sudo vim /etc/elasticsearch/elasticsearch.yml
)。从那里启动 Elasticsearch,然后检查您的 Elasticsearch 集群状态。响应看起来像这样:
{ “cluster_name”:“elasticsearch-cluster-demo”, “compressed_size_in_bytes”:255, “版本”:7, “state_uuid”:“50m3ranD0m54a531D”, “master_node”:“IwEK2o1-Ss6mtx50MripkA”, “块”:{}, “节点”:{ “m4-aw350m3-n0D3”:{ “名称”:“es-node-1”, “ephemeral_id”:“x50m33F3mr--A11DnuM83r”, “传输地址”:“172.31.50.123:9200”, “属性” : { } }, },}
复制
Elasticsearch 集群健康将是您列表中的下一个。使用以下 API 调用定期检查集群的运行状况:
curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"
复制
此示例将参数显示local
为false
,(实际上是默认设置)。这将向您显示主节点的状态。要检查本地节点,请更改为true
。
默认情况下,级别参数将向您显示集群健康状况,但排名超出该范围包括indices
和shards
(如上例所示)。
超时还有其他可选参数......
timeout
master_timeout
……或者,等待某些事件发生:
wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status
当然,使用 Logz.io,创建 Elasticsearch(现在是 OpenSearch)集群就像开始免费试用一样简单。扩展您的 Elasticsearch 集群不需要用户任何帮助。
从 Elasticsearch 中删除项目与将数据输入 Elasticsearch 一样简单。这次使用的 HTTP 方法是——惊奇,惊奇—— DELETE
:
$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ “_index”:“应用程序”, “_type”:“用户”, “_id”:“4”, “_版本”:2, “结果”:“已删除”, “_碎片”:{ “总计”:2, “成功”:1, “失败”:0 }, “_seq_no”:1, “_primary_term”:1}
复制
要删除索引,请使用:
$ curl -XDELETE 'localhost:9200/logs?pretty'
复制
要删除所有索引(请谨慎使用),请使用:
$ curl -XDELETE 'localhost:9200/_all?pretty'$
复制
两种情况下的响应应该是:
{ “确认”:真实}
复制
要删除单个文档:
$ curl -XDELETE 'localhost:9200/index/type/document'
扫码关注不迷路!!!
郑州升龙商业广场B座25层
service@iqiqiqi.cn
联系电话:400-8049-474
联系电话:187-0363-0315
联系电话:199-3777-5101