《深入理解Elasticsearch(原书第2版)》一1.2.3 Elasticsearch的工作流程

1.2.3 Elasticsearch的工作流程

本节我们将探索一些关键的Elasticsearch特性,如启动、故障检测、数据索引和查询等。
1. 启动过程
当Elasticsearch节点启动时,它使用发现(discovery)模块来发现同一个集群中的其他节点(这里的关键是配置文件中的集群名称)并与它们连接。默认情况下,Elasticsearch节点会向网络中发送广播请求,以找到拥有相同集群名称的其他节点。读者可以通过下图的描述来了解相关的处理。

集群中有一个节点被选为主(master)节点。该节点负责集群的状态管理以及在集群拓扑变化时做出反应,分发索引分片至集群的相应节点上去。
 请记住,从用户的角度来看,Elasticsearch中的管理节点并不比其他节点重要,这与其他的某些分布式系统不同(例如数据库)。在实践中,你不需要知道哪个节点是管理节点,所有操作可以发送至任意节点,Elasticsearch内部会自行处理这些不可思议的事情。如果有需要,任意节点可以并行发送子查询给其他节点,并合并搜索结果,然后返回给用户。所有这些操作并不需要经过管理节点处理(请记住,Elasticsearch是基于对等架构的)。
管理节点读取集群的状态信息,如果有必要,它会进行恢复(recovery)处理。在该阶段,管理节点会检查有哪些索引分片,并决定哪些分片将用作主分片。此后,整个集群进入黄色状态。
这意味着集群可以执行查询,但是系统的吞吐量以及各种可能的状况是未知的(这种状况可以简单理解为所有的主分片已经被分配了,但是副本没有被分配)。下面的事情就是寻找到冗余的分片用作副本。如果某个主分片的副本数过少,管理节点将决定基于某个主分片创建分片和副本。如果一切顺利,集群将进入绿色状态(这意味着所有主分片以及副本均已分配好)。
2. 故障检测
集群正常工作时,管理节点会监控所有可用节点,检查它们是否正在工作。如果任何节点在预定义的超时时间内不响应,则认为该节点已经断开,然后错误处理过程开始启动。这意味着可能要在集群–分片之间重新做平衡,选择新的主节点等。对每个丢失的主分片,一个新的主分片将会从原来的主分片的副本中选出来。新分片和副本的放置策略是可配置的,用户可以根据具体需求进行配置。更多的信息可以在第7章了解到。
为了描述故障检测(failure detection)是如何工作的,我们用一个只有3个节点的集群作为例子,将会有一个管理节点,两个数据节点。管理节点会发送ping请求至其他节点,然后等待响应。如果没有响应(实际上多少次ping请求无响应可以确认节点失败取决于配置),则该节点会被从集群中移除出去。相反地,所有节点也会向主节点发送ping请求来检查主节点是否在正常工作。节点之间的相互探测如下图所示。

3. 与Elasticsearch通信
前面已经讨论过Elasticsearch是如何构建的了,然而,对普通用户来说,最重要的部分是如何向Elasticsearch推送数据以及构建查询。为了提供这些功能,Elasticsearch对外公开了一个设计精巧的API。如果我们说,基本上每个Elasticsearch功能模块都有一个API,这将是令人鼓舞的。这个主API是基于REST的(REST细节请参考http://en.wikipedia.org/wiki/Representational_state_transfer),并且在实践中能轻松整合到任意支持HTTP协议的系统中去。
Elasticsearch假设数据由URL携带或者以JSON(JSON细节请参考(http://en.wikipedia.org/wiki/JSON)文档的形式由HTTP消息体携带。使用Java或者基于JVM语言的用户,应该了解一下Java API,它除了REST API提供的所有功能以外还有内置的集群发现功能。
值得一提的是,Elasticsearch在内部也使用Java API进行节点间通信。因此,Java API提供了所有可被REST API调用的功能。
(1)索引数据
Elasticsearch提供了多种索引数据的方式。最简单的方式是使用索引API,它允许用户发送一个文档至特定的索引。例如,使用curl工具(curl细节请参考http://curl.haxx.se/),可以使用如下命令创建一个文档:

第2种方式允许用户通过bulk API或UDP bulk API一次发送多个文档至集群。两者的区别在于网络连接方式,前者使用HTTP协议,后者使用UDP协议。后者速度快,但是不可靠。还有一种方式使用被叫作河流(river)的插件来发送数据。不过在这里我们不需要了解这种河流插件,因为它们将在Elasticsearch未来版本中被移除。
有一件事情需要记住,建索引操作只会发生在主分片上,而不是副本上。当一个索引请求被发送至一个节点上时,如果该节点没有对应的主分片或者只有副本,那么这个请求会被转发到拥有正确的主分片的节点。然后,该节点将会把索引请求群发给所有副本,等待它们的响应(这一点可以由用户控制),最后,当特定条件具备时(比如说达到规定数目的副本都完成了更新时)结束索引过程。
下图展示了我们刚刚探讨的索引处理过程。

(2)查询数据
查询API占据了Elasticsearch API的大部分。使用查询DSL(基于JSON的可用于构建复杂查询的语言),我们可以做下面这些事情:

  • 使用各种查询类型,包括,简单的词项查询,短语查询,范围查询,布尔查询,模糊查询,区间查询,通配符查询,空间查询,以及具备人类可读的打分控制功能的函数查询,等等。
  • 组合简单查询构建复杂查询。
  • 文档过滤,在不影响评分的前提下抛弃那些不满足特定查询条件的文档。- 这一点可以提升性能。
  • 查找与特定文档相似的文档。
  • 查找特定短语的查询建议和拼写检查。
  • 使用切面构建动态导航和计算各种统计量。

使用预搜索(prospective search)和查找与指定文档匹配的query集合。
谈到查询操作,读者应该了解一个很重要的事实:查询并不是一个简单的、单步骤的操作。一般来说,查询分为两个阶段:分散阶段(scatter phase)和合并阶段(gather phase)。在分散阶段将查询分发到包含相关文档的多个分片中去执行查询,而在合并阶段则从众多分片中收集返回结果,然后对它们进行合并、排序,进行后续处理,然后返回给客户端。该机制可以由下图描述。

 Elasticsearch对外提供了6个系统参数,通过使用其中之一来定制分散/合并机制。在本书的姐妹版《Elasticsearch Server, Second Edition》(Packt出版社)中已经讨论过这个问题了。

时间: 2024-09-18 15:28:06

《深入理解Elasticsearch(原书第2版)》一1.2.3 Elasticsearch的工作流程的相关文章

《机器学习与R语言(原书第2版)》一2.3 探索和理解数据

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.3节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.3 探索和理解数据 在收集数据并把它们载入R数据结构以后,机器学习的下一个步骤是仔细检查数据.在这个步骤中,你将开始探索数据的特征和案例,并且找到数据的独特之处.你对数据的理解越深刻,你将会更好地让机器学习模型匹配你的学习问题. 理解数据探索的最好方法就是通过例子.在

《机器学习与R语言(原书第2版)》一 第2章 数据的管理和理解

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第2章 数据的管理和理解 任何机器学习项目初期的核心部分都是与管理和理解所收集的数据有关的.尽管你可能发现这些工作不像建立和部署模型那样令人有成就感(建立和部署模型阶段就开始看到了劳动的成果),但是忽视这些重要的准备工作是不明智的.任何学习算法的好坏取决于输入数据的好坏.

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

ROS机器人程序设计(原书第2版).

机器人设计与制作系列 ROS机器人程序设计 (原书第2版) Learning ROS for Robotics Programming,Second Edition 恩里克·费尔南德斯(Enrique Fernández) 路易斯·桑切斯·克雷斯波(Luis Sánchez Crespo) 阿尼尔·马哈塔尼(Anil Mahtani) 亚伦·马丁内斯(Aaron Martinez) 著 刘锦涛 张瑞雷 等译 图书在版编目(CIP)数据 ROS机器人程序设计(原书第2版) / (西)恩里克·费尔南

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读

前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开发时需要了解的高级主题.因此,与本书卷Ⅰ和之前的版本一样,我们仍将本书定位于用Java技术进行实际项目开发的编程人员. 编写任何一本书籍都难免会有一些错误或不准确的地方.我们非常乐意听到读者的意见.当然,我们更希望对本书问题的报告只听到一次.为此,我们创建了一个FAQ.bug修正以及应急方案的网站http:/

《JavaScript和jQuery实战手册(原书第3版)》---第1章 编写第一个JavaScript程序 1.1 编程简介

本节书摘来自华章出版社<JavaScript和jQuery实战手册(原书第3版)>一书中的第1章,第1.1节,作者David Sawyer McFarland,姚待艳 李占宣 译,更多章节内容可以访问"华章计算机"公众号查看. 第1章 编写第一个JavaScript程序 HTML自身并没有太多智能:它不能做数学运算,不能判断某人是否正确填写了一个表单,而且不能根据Web访问者的交互来做出判断.基本上,HTML让人们阅读文本.观看图片或视频,并且单击链接转向拥有更多文本.图片

《面向对象的思考过程(原书第4版)》一1.1 基本概念

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.1节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著 1.1 基本概念 本书主要目标是让你学会思考如何将面向对象概念应用于面向对象的系统设计中.历史上定义面向对象的语言拥有以下特点:封装(encapsulation).继承(inheritance)和多态(polymorphism).因此,如果设计一门语言时没有完全实现以上特性,那么通常我们认为该语言不是完全面向对象的.即使实现了这三点,我也往往会加入组

《用户至上:用户研究方法与实践(原书第2版)》一1.1 什么是用户体验

本节书摘来自华章出版社<用户至上:用户研究方法与实践(原书第2版)>一书中的第1章,第1.1节,作者 Understanding Your Users: A Practical Guide to User Research Methods, Second Edition凯茜·巴克斯特(Kathy Baxter)[美]凯瑟琳·卡里奇(Catherine Courage) 凯莉·凯恩(Kelly Caine)更多章节内容可以访问"华章计算机"公众号查看. 第1章 用户体验入门

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.4 给着色器添加纹理

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.4节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.4 给着色器添加纹理 在模拟现实效果方面,纹理可以让着色器迅速生动起来.为了高效使用纹理,我们需要理解二维图像是如何映射成三维模型的.这个映射过程称为纹理映射.为了进行纹理映射,我们需要在着色器和想要应用纹理的三维模型上

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.9节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.9 打包和混合纹理 纹理不仅在存储许多像素颜色数据的时候非常有用,同时还可以用来存储x和y方向的一堆像素集合以及其RGBA通道.可以将几个图像打包成一个RGBA纹理,然后通过着色器代码来提取每一个R,G,B,A组件作为单