Elasticsearch 初学者指南
人生在世,我们总是在追寻着什么。无论是追寻生命的意义,还是寻找城里最美味的墨西哥卷饼,我们都严重依赖搜索引擎来寻找答案。
您可能已经使用过 Yelp、Uber 或 Wikipedia 等具有强大搜索功能的应用程序。但您知道这些应用程序都是使用 Elasticsearch 构建的吗?
Elasticsearch 是一款免费开放的搜索和分析引擎,适用于所有类型的数据。它以速度和可扩展性著称。Elasticsearch 能够索引多种类型的内容,因此广泛应用于应用程序搜索、企业搜索、应用程序性能监控和安全分析等众多领域(引自Elastic)。
如果您是一名开发人员,希望实时、大规模地使用数据,那么 Elasticsearch 是一个很棒的工具。
Elasticsearch 被称为 Elastic Stack 的核心,它由 Beats、Logstash、Elasticsearch 和 Kibana 组成。
总之,Elastic Stack 允许您从任何来源、任何格式获取数据,然后实时搜索、分析和可视化(摘自Elastic)。本博客将特别关注 Elasticsearch。
阅读完本博客后,您将能够:
- 了解 Elastic Stack 的组件如何协同工作以实时搜索、分析和可视化数据
- 安装 Elasticsearch 和 Kibana 来运行查询
- 了解 Elasticsearch 的基本架构
- 讨论分片和复制如何提高 Elasticsearch 的可扩展性和可靠性
补充视频
如果你更喜欢通过观看视频来学习,我制作了一个视频来解释本博客中涵盖的概念。如果你想对某些概念有更深入的解释,请务必观看!
视频中涉及的主题:
- Elastic Stack 是什么?Elasticsearch 和 Kibana 的用例有哪些?5:16
- Elasticsearch 基本架构 14:53
- 什么是分片?18:21
- 什么是复制?23:07
- 动手实验:使用 Elasticsearch 和 Kibana 执行 CRUD 操作 25:03
- 问答 49:17
其他资源
掌握本博客中涵盖的概念后,通过阅读本博客学习如何使用 Elasticsearch 和 Kibana 执行 CRUD 操作!
Elastic Stack 的产品如何协同工作?
Elastic stack 由 Beats、Logstash、Elasticsearch 和 Kibana 组成。
理解这些产品如何协同工作的最佳方法是将它们置于实际项目中。这些组件通常会混合搭配,以满足您的特定用例。在本教程中,我们将介绍一个同时使用所有这些组件的场景。
想象一下,你是最热门户外装备电商网站的首席开发人员。你目前有一个连接到数据库的全栈应用程序。
数百万客户正在您的网站上搜索产品,但当前的架构难以跟上用户提交的搜索查询。
这就是 Elasticsearch 的用武之地。
您需要将 Elasticsearch 连接到您的应用。当用户在您的网站上发送搜索查询时,该请求会被发送到服务器。服务器随后会将搜索查询发送到 Elasticsearch。
Elasticsearch 将搜索结果发送回服务器,服务器处理信息并将结果发送回浏览器。
此时,您可能想知道我们如何将数据导入 Elasticsearch?
这就是 Beats 和 Logstash 发挥作用的地方。
图片来源:devops_core
Beats
是数据采集器的集合。安装在你的服务器上后,它会收集数据并将其发送到 Logstash 或 Elasticsearch。
Logstash
是一个数据处理管道。Logstash 接收的数据(例如电商订单和客户消息)会被处理为事件。这些事件会被解析、过滤和转换,然后发送到 Elasticsearch 进行数据存储。
在 中Elasticsearch
,数据以文档的形式存储,文档是 JSON 对象中的信息单位。您可以使用 REST API 来查询这些文档。
我们稍后会深入研究 Elasticsearch。目前,我们先了解一下 Elasticsearch,它负责对海量数据进行搜索和分析。
如果我们不能将数据可视化并从中获得见解,那么所有对数据的搜索和分析都将毫无用处!
Kibana
为 Elasticsearch 中存储的数据提供 Web 界面。它允许用户使用相同的 REST API 向 Elasticsearch 发送查询。这些查询可以解答诸如“每天有多少用户访问我们的网站?”或“上个月的收入是多少?”之类的问题。
通过 Kibana 仪表板,用户可以可视化查询结果并从数据中获得见解,如下所示!
图片来源:Elastic
现在我们已经了解了 Elastic Stack 的组件如何协同工作,让我们更深入地了解 Elasticsearch!
首先,我们将安装 Elasticsearch 和 Kibana 来帮助我们可视化和巩固本教程中涵盖的概念。
安装 Elasticsearch
为了简洁起见,我将只介绍 Windows 系统的安装说明。不过不用担心!macs/linux 系统的安装步骤已在本博客中分享。
注意!
如果您想在本地运行 Elasticsearch 和 Kibana v8+,具体步骤与本博客中介绍的有所不同。点击此处查看如何运行 v8+ 的博客!
步骤1:下载Elasticsearch
转到下载链接。
在用绿色框突出显示的区域中,选择适合您的操作系统的下载选项。
您将看到 elasticsearch 已下载(橙色框)。
向下滚动页面,您将看到安装步骤。我们将使用这些步骤中指定的命令来测试 Elasticsearch 服务器是否运行顺畅。
步骤 2:重新定位下载的 Elasticsearch 并解压 Elasticsearch
将 Elasticsearch 重新定位到哪里由您决定,但为了本教程,我在 Windows(C:)驱动器中创建了一个名为 Elastic_Stack 的文件夹。
将下载的 Elasticsearch 移动到 Elastic_Stack 文件夹。
右键单击 Elasticsearch,弹出选项,然后点击extract all
“选项”。下载 Elasticsearch 解压后,双击该文件夹。您将在屏幕上看到以下内容。
双击该文件夹。
点击 bin 文件夹(红色框)。
点击绿色方框高亮的区域。它会显示 bin 文件夹的文件路径。复制此地址。我们将在下一步中使用它。
步骤3:启动Elasticsearch服务器并确保一切正常运行
在 Windows 上搜索命令提示符应用程序(紫色框),然后单击run as administrator
选项(红色框)。
在命令提示符应用程序终端中,通过提供 bin 文件夹的文件路径切换到 bin 目录 (cd)。这是您在上一步中复制的文件路径。
#In command prompt terminal
cd filepath to bin folder in Elasticsearch
红色框突出显示了我们用来更改 bin 目录的命令。
当您按下回车键时,您将看到已经进入 bin 目录(蓝色框)。
在终端中运行以下命令。如果您在非 Windows 操作系统上运行,请elasticsearch
改为在终端中运行。
#In command prompt terminal
elasticsearch.bat
在看到 Elasticsearch 服务器运行之前,您会看到光标闪烁一段时间!
您将看到 Elasticsearch 服务器在本地主机的端口 9200(红色框)上运行。
让我们快速回顾一下。当用户(客户端)向服务器发送请求时,服务器会向 Elasticsearch 服务器发送搜索查询。我们使用 REST API 来查询文档,并将该查询发送到端点http://localhost:9200。
我们将使用 cURL 命令行工具来检查 Elasticsearch 服务器是否收到请求。
打开一个新的命令提示符窗口(红色框)。
在新的终端中,运行以下命令。
#In new command prompt terminal
curl http://localhost:9200
当你运行命令(白色框)时,你将在终端(蓝色框)中看到以下 JSON 对象。这意味着一切正常,Elasticsearch 已成功安装。
保持这些终端打开以保持 Elasticsearch 服务器运行。
安装 Kibana
安装 Kibana 与安装 Elasticsearch 非常相似。
步骤 1:下载 Kibana
Kibana 是 Elasticsearch 的 Web 界面。但它附带了与 Elasticsearch 通信的后端服务器。
转到下载链接。
在用红色框突出显示的区域中,选择适合您的操作系统的下载选项。
您将看到 Kibana 已下载。
向下滚动页面,您将看到安装步骤。我们将使用这些步骤中指定的命令来测试 Kibana 服务器是否正常运行。
步骤 2:重新定位下载的 Kibana 并解压 Kibana
将下载的 Kibana 移动到 Elastic_Stack 文件夹。
右键单击 Kibana 以显示选项,然后单击extract all
选项。Kibana 解压后,双击该文件夹。
点击 bin 文件夹(红色框)。
点击绿色方框高亮的区域。它会显示 bin 文件夹的文件路径。复制此地址。我们将在下一步中使用它。
步骤 3:运行 Kibana 并确保一切正常运行
首先,返回运行 Elasticsearch 服务器的命令提示符窗口。确保它仍在运行,并且没有显示任何错误消息。
打开一个新的命令提示符窗口。
在命令提示符应用程序终端中,通过提供 bin 文件夹的文件路径,切换到 Kibana 的 bin 目录 (cd)。这是您在上一步中从 bin 文件夹复制的路径。
#In command prompt terminal
cd filepath to bin folder in Kibana
该命令已用红色框突出显示。
当您按下回车键时,您将看到已经进入 bin 目录(蓝色框)。
在终端中运行以下命令。如果您在非 Windows 操作系统上运行,请kibana
改为在终端中运行。
#In command prompt terminal
kibana.bat
在看到 Kibana 运行之前,您会看到光标闪烁一段时间!
打开浏览器并转到http://localhost:5601。
您将看到浏览器上显示以下内容。
故障排除
If you are having trouble getting Kibana to work, try restarting your Elasticsearch server. Go to the command prompt terminal used for your Elasticserach server. Press `control + c`. Then, run elasticsearch.bat in the same terminal.
Go back to your command prompt terminal for Kibana. Run `control + c` in the command prompt terminal. Then, run kibana.bat in the terminal. Go to http://localhost:5601 on your browser.
好吧,让我们回到 Kibana 浏览器。
点击menu
选项(红色框)以显示下拉菜单。向下滚动到管理部分,然后点击Dev Tools
选项(绿色框)。
该控制台允许我们轻松地向 Elasticsearch 发送查询。
好了,安装完毕后,让我们深入研究 Elasticsearch 的基本架构!我们将使用 Kibana 来深入了解 Elasticsearch 的内部结构。
Elasticsearch的基本架构
Elasticsearch 是一款功能强大的搜索和分析引擎,以其分布式特性、速度和可扩展性而闻名。这得益于其独特的架构。
我们刚刚下载并运行了一个 Elasticsearch 服务器。我们几乎不知道我们正在启动一个节点(蓝色圆圈)!节点node
是一个正在运行的 Elasticsearch 实例,用于存储数据。它有一个唯一的 ID 和一个名称。
每个节点都属于一个cluster
,它是一组连接在一起的节点的集合。当我们启动一个节点时,一个集群就会自动形成(粉色框)。
您可以在集群中添加一个或多个节点。这些节点分布在不同的机器上。默认情况下,每个节点会被分配以下所有角色:主节点、数据节点、采集节点和机器学习节点(如果可用)。您可以配置这些角色,并为特定节点分配特定的角色。
集群中的每个节点都可以处理来自客户端的 HTTP 请求以及节点之间的通信。所有节点都了解同一集群内的其他节点,并且可以将 HTTP 请求转发到专门用于处理该请求的节点。
数据在节点内如何存储?
Elasticsearch 中存储的数据的基本单位称为文档。Document
是一个 JSON 对象,其中包含您想要存储在 Elasticsearch 中的任何数据。
例如,假设您正在开发一款应用,帮助用户找到他们所在地区最好的餐车。为了构建这款应用,您需要存储餐车的相关数据。
存储一辆食品卡车数据的文档如下所示。
{
"name": Pho King Rapidos,
"cuisine": Vietnamese and Mexican fusion
}
想象一下,如果我们拥有数百万辆餐车的数据,该如何快速搜索数据,找到我们想要的餐车呢?
搜索数据与在杂货店搜索食品非常相似。如果商店里的所有食品都被分类到特定的货架上(例如新鲜农产品、肉类、乳制品、调味品等),您的搜索效率会更高。
文档的组织方式类似。每个文档都被分组到一个索引中。索引index
是一组具有相似特征且彼此逻辑相关的文档的集合,就像杂货店的货架一样。
集群包含多个节点。在节点内,相关文档按索引分组。
就像我们去农产品货架寻找苹果一样,我们在搜索文档时会根据索引运行搜索查询。
好吧,让我们深入了解 Elasticsearch,看看如何获取有关我们刚刚创建的节点和集群的信息。
Elasticsearch 集群公开了一个用于接收 HTTP 请求的 REST API。我们可以使用任何 HTTP 客户端(例如 Postman 或 cURL)访问此 REST API,但我们将使用 Kibana 开发工具来执行此操作。
打开你的 Kibana 开发工具。你应该在屏幕上看到以下内容。
我们将首先检查集群的健康状态。
删除灰色突出显示区域中的内容,以便我们可以编写自己的查询。
查询的语法非常简单。通过指定 HTTP 方法(GET、POST、PUT、DELETE)来发起查询。然后,我们指定要访问的 API 以及想要完成的操作(命令)。
在本例中,我们想要检索(GET)集群的健康状态。我们指定要访问集群 API,并获取有关其健康状况的信息。
所以我们的查询应该是这样的:
GET /_cluster/health
将查询复制并粘贴到用红色框突出显示的区域中。
单击查询以确保已选中。单击橙色框突出显示的箭头即可运行查询。
您将看到返回了一个 JSON 对象(绿色框)。您可以看到集群名称默认设置为 elasticsearch,集群状态设置为绿色。
这意味着我们的集群是健康的!
让我们获取集群中的节点列表。
为了获取这些信息,我们使用 _cat API。查询语法与我们刚刚发送的查询非常相似。
我们将向 _cat API 发送 GET 请求,并使用命令 nodes?v 来获取集群中的节点列表。
您的查询将如下所示:
GET /_cat/nodes?v
将查询复制并粘贴到开发工具中。选择查询,然后点击箭头发送查询。
您将看到屏幕上显示了我们拥有的单个节点的基本信息。其中包括有关节点的 IP 地址、名称、角色以及一些性能指标的信息。
太棒了!看来我们的节点和集群已经成功创建了。
让我们为 food_trucks 创建一个索引。
您可以通过指定 PUT 方法后跟索引名称来创建索引。
在开发工具中运行以下查询。
PUT food_trucks
您将看到返回一个 JSON 对象。它表明名为 food_trucks 的索引已成功创建。
您还将看到 shards_acknowledged 的值已设置为 true。我们稍后会介绍这一点!
有了对 Elasticsearch 架构的基本了解,我们现在可以了解哪些因素使得 Elasticsearch 如此可扩展和可靠!
了解 Elasticsearch 可扩展性和可靠性背后的因素
什么是分片?
在上一步中,创建索引时,我们看到 shards_acknowledged 值已设置为 true。那么,分片到底是什么呢?
之前我提到过,相关文档会被分组到索引中。索引实际上并不存储文档,而是一个虚拟的东西,用来跟踪文档的存储位置。
您在磁盘上找不到索引。磁盘上实际存在的是分片!分片是 Elasticsearch 中存储数据的地方。搜索也是在这里运行的!
创建索引时,默认会自带一个分片。您也可以配置创建包含多个分片的索引,这些分片分布在不同的节点上。
假设我们想在名为“Food Truck Index”的索引中存储 600K 份有关食品卡车的文档。
我们的集群中有三个节点,每个节点可容纳 20 万个文档。创建餐车索引时,默认会附带一个分片。该分片分配给节点 1。
请记住,分片是存储数据的地方。分片可容纳的文档数量取决于节点的容量。
我们有三个节点,每个节点只能容纳 20 万个文档。但是,60 万个文档的整个索引根本无法放入任何一个节点!如果我们能将这些文档分成更小的块,并将它们存储在这些节点上就好了……
嗯,这就是分片!
为了实现这一点,我们在索引中添加了两个额外的分片,并将这些分片分布在这些节点上。然后,我们在每个分片上存储 20 万个文档。这些分片加起来,现在能够存储 60 万个餐车文档!
通过将文档划分成更小的块,并将它们存储在分布在各个节点的分片中,我们能够存储 60 万个文档。尽管我们没有一个节点能够存储所有这些数据,但我们仍然做到了!这就是分片的魅力所在!
分片使 Elasticsearch 能够适应不断增长的数据量或需求。
因此,如果我们的餐车应用程序成功运行,并且我们的用户群以惊人的速度增长,我们就不必担心数据量的增加。我们可以简单地添加更多节点,并更改您正在使用的索引的分片数量!
什么是复制?
我们的餐车应用发展势头强劲。令人担忧的是,其中一个节点宕机了,数据彻底丢失。
你能想象如果我们没有备用机制来处理这样的事情,这将是一场怎样的噩梦吗?
感谢上帝,我们有复制品!
Replication
创建分片副本,并将副本保存在不同的节点上。如果一个节点宕机,存储在其他节点上的副本将承担起责任,像什么都没发生一样处理请求。
Elasticsearch 会自动复制分片,无需我们进行任何配置。它会为索引中的每个分片创建一个副本(副本分片)。
还记得我们之前创建了一个名为 food_trucks 的索引吗?让我们使用 Kibana 获取有关索引的更多信息。
转到开发工具并运行以下查询。
GET /_cat/indices?v
如果你查看该列,你会看到列 pri 和 rep(红色框)。它们分别代表主分片 (pri) 和副本分片 (rep)。
让我们检查一下绿色框突出显示的索引 food_trucks。您将看到,在创建索引时,已自动创建了主分片和副本分片!
Replica shard
是主分片的完全一样的副本。其功能与主分片完全相同。
正所谓“事不宜迟”,副本分片绝不会与主分片存储在同一个节点上。主分片和副本分片按如下所示的方式分布在各个节点上。
即使某个节点发生故障,您也可以放心,因为存储在另一个节点中的副本分片将会弥补不足,就像什么都没发生过一样!
如您所见,分片和复制有助于提高 Elasticsearch 的可扩展性和可靠性。
好了,我们所有的最终目标都达成了!你们走到今天这一步,值得掌声和长假的到来。
现在您已经扎实掌握了 Elasticsearch 的重要概念,可以开始探索更高级的技能,例如 CRUD 操作、映射、分析和高级查询。快来探索 Elasticsearch,看看您能用它做些什么吧!
