-
验证输入操作并在结构无效时拒绝它(例如:想要一个数字结果给了一个对象)
-
先在本地执行操作,例如索引或删除相关文档,如果执行出错时也将拒绝(例如:关键字值太长,无法在Lucene中进行索引)
-
将操作转发到当前同步副本集中的每个副本。如果有多个副本,则并行执行该操作
-
一旦所有副本成功执行了操作并响应给主服务器,主服务器就会确认成功完成对客户端的请求
2.1 故障处理
在索引的过程可能会出现各种各样的异常情况,例如:1.磁盘损坏;2.节点相互断开连接;3.由于配置错误导致复制副本上的操作失败,尽管它在主服务器上操作成功,等等。虽然这些问题并不一定常见,但是开发者还是有必要作出相应的预案。
在主分片本身发生故障的情况下,托管主分片的节点将向Master发送有关它的消息,此时索引操作将等待(默认情况下最多1分钟),以便Master将其中一个副本提升为新主分片,然后,该操作将被转发到新的主分片处理。
请注意,Master还会监控节点的运行状况,并可能决定主动对主分片进行降级(这通常是由于网络问题导致的)。一旦在主分片上成功执行了操作,主分片就必须处理在副本上执行操作时存在的潜在故障,这些潜在的故障可能是由副本上的实际故障或由于网络问题导致操作无法到达副本(或阻止副本响应)引起的。所有这些都具有相同的最终结果:同步副本集中的一部分副本错过了即将被确认的操作。此时,主分片向Master发送消息,请求从同步副本集中删除有问题的分片。只有在Master确认删除了分片后,主分片才会确认操作。注意,Master还将指示另一个节点开始构建新的分片副本,以便将系统还原到正常状态。
在将操作转发到副本时,主分片将使用副本来验证它仍然是活动主分片。如果主分片由于网络原因(或长GC)而被分离,它依然可能会在被降级之前继续处理传入的索引操作,此时副本将拒绝来自旧主分片的操作。主分片收到副本的拒绝请求后会请求Master节点,Master会告诉旧的主分片你已经被替换掉,然后操作会被路由到新的主分片。
2.2 如果没有副本会怎么样
由于索引的配置原因或者所有副本都已失效,在这种情况下,会发生主分片没有副本。此时,主分片处理操作而没有任何外部验证,这可能看起来有问题。另一方面,主分片本身不能使其他分片失效,但可以请求Master代表它执行此操作。这意味着Master知道主分片是唯一的好副本。因此,我们保证Master不会将任何其他(过时的)分片副本提升为新的主分片,并且任何索引到主分片的操作都不会丢失。当然,由于此时我们只使用单个数据副本运行,因此物理硬件问题可能导致数据丢失。
3.读模型
=====
Elasticsearch中的读取操作,可以是按照ID查找这种非常轻量级的操作,也可以是具有复杂聚合的大量搜索请求,这些聚合操作会占用非常大的CPU算力。 主-备
模型的优点之一是它使所有分片副本保持一致(除了飞行中的操作)。基于此,单个同步的副本足以处理读取请求。
当节点收到读取请求时,该节点负责将其转发到保存相关分片的节点,整理响应并对客户端做出响应。此时,我们将该节点称为该请求的协调节点,该节点的基本工作流程如下:
-
对读取请求进行解析,然后将请求分发到不同分片上。请注意,由于大多数搜索请求将被发送到一个或多个索引,因此它们通常需要从多个分片中读取,每个分片代表数据的不同子集。
-
从replication group中选择每个相关分片的可用副本,可以是主分片或副本。默认情况下,Elasticsearch将简单地在分片副本之间循环。
-
将分片级读取请求发送到所选副本。
-
整合请求结果并给客户端作出响应,注意,在通过ID查找的情况下,只有一个分片是相关的,并且可以跳过此步骤(即不需要整合请求结果,用过MyCat的读者,可能会发现这个步骤的作用和MyCat比较类似)。
3.1 故障处理
当分片无法响应读取请求时,协调节点将从同一复制组中选择另一个副本,并将分片级别搜索请求发送到该副本,不过要是重复失败可能导致没有可用的分片副本。在某些情况下,例如search请求中,Elasticsearch更愿意快速响应,而不是等待问题得到解决(此时虽然只有部分结果,部分结果会在shards中指出)。
4.一些简单的含义
=========
这些基本流程确定了Elasticsearch读取和写入系统的行为。此外,由于读取和写入请求可以同时执行,因此这两个基本流程彼此交互,有一些固有的含义:
4.1 Efficient reads
在正常操作下,对每个相关的replication group执行一次读取操作。只有在失败的情况下,才会对同一个分片的多个副本执行相同的搜索。
4.2 Read unacknowledged
由于主分片首先在本地进行索引,然后将操作发给副本去执行,因此并发读取可能在确认之前就已经看到了更改的数据。
4.3 Two copies by default
此模型可以容错,同时只保留两个数据副本。这与基于法定数量的系统形成对比(容错的最小副本数为3)。
5.关于操作失败
========
在操作失败的情况下,以下是可能的:
1.单个分片可以减慢索引速度
由于主分片在每个操作期间等待同步副本集中的所有副本,因此单个分片操作速度慢可能会降低整个replication group的速度。这是我们为上述阅读效率付出的代价,同时,单个慢速分片也会降低已经路由到它的搜索请求。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!