首页 > 试题

primary怎么读

更新时间:2022-12-02 17:42:25 阅读: 评论:0

学而思网盘免费-奕是什么意思


2022年12月2日发(作者:水晶粽子)

elasticarch读写⽂档--写模型

本⽂档基于es7.1版本。较新或交旧的版本可能在个别地⽅有出⼊。

es中的每⼀个index,都被切分成多个shards存储,这每⼀个shard称之为primaryshard,并且每⼀个shard可能没有,或者有⼀个或多

个copy,这些个copy称之为replicate。primaryshard与其对应的replicate⼀起合称为replicationgroup。replicationgroup内部必须

保证同步,也既各个shard内容⼀致。否则在读数据的时候,从不同的shard会获得不同的内容,这是任何⼀个系统都不能容忍的。keep

sync的过程称之为datareplicationmodel。es使⽤primary-backup的复制模型,关于这个模型的详细介绍,可以参考微软的⼀篇论⽂。

这个我们后⾯再说。下⾯先来看看es写模型的简图:

上⾯这个是正常流程下,es的写流程,⾸先

1,客户端向es集群中某个节点发送⼀个indexdocument的请求,这个请求可能是CUD中的任⼀种。

2,接收到这个请求的节点作为coordinator,根据请求⽂档的_id或者routing值以及其他设置,计算对应的shard号,这个过程会得到⼀个

replicationgroup。因为任何的写操作必须在primaryshard上进⾏,所以还要得到primaryshard所在的节点。

3,然后coordinator会将请求转发给对应的primaryshard处理。

4,primaryshard接收到请求后,会验证变更内容的有效性,例如字段类型,长度等。

5,验证成功后,会向集群的master节点请求当前active的replicate的集合,称为in-synct。

6.

7,每个索引会有⼀个_for_active_shards的参数。表⽰primary在处理更新请求之前,需要确保有对应数量的replicate

处于active状态,⼀定程度上可以确保更新在适当数量上replicatecopy成功应⽤。如果此时active的replicatecopy数量⼩于设置值,则

请求会⼀直等待,直到超时。也就是说这个更新请求不会得到处理。

8,

9,primaryshard在本节点上处理更新,更新的过程⼤致为按照内容索引(⽣成)新记录,增加version,q_no,并标记旧的记录为

delete的,等待后台merge进程清理。如果请求携带了refresh参数的话,也会⽴即进⾏。默认情况下,refresh过程每隔

h_interval时间进⾏⼀次,refresh后,在此之前更新的记录可以被读请求获取。这⾥也会涉及到translog、gment、

commit等⼀系列概念,留在后⾯单独说明。

10,primary处理完成后,会将更新parallell发送到各个replicatecopy进⾏。

11,in-synct中可能全部成功,也可能有个别replicatecopy失败。

12,primary需要把失败的copy通知到master,由master将这些copy从in-synct中除去。同时,如果集群中有其他多余的

node,master可能会在后台挑选⼀个node,迁移copy到其上。

13,master响应已从in-sync中除去失败的copy。

14,更新请求处理完成,primaryshard返回成功到coordinator节点。

15,coordinator返回成功到客户端。

16,如果集群中有其他多余的node,master可能会在后台挑选⼀个node,迁移copy到其上。

以上,是正常流程下的写模型。

下⾯来看看异常情况:,

异常1:

这⾥的异常从第11步开始,当前处理请求的primaryshard因为⽹络分区,或其他原因造成primary⽆法连接到集群中其他replicate

copy或者master节点,此时集群已从in-synct中promote了新的primaryshard。promote的过程后⾯单独开篇。因为新的primary

shard已在集群内取得⼀致,所以in_synct中的replicatecopy拒绝reject了当前oldprimaryshard的同步请求。然后oldprimary

shard通过master得知新的primaryshard(到master的⽹络通),将请求转发到新的primaryshard上重新进⾏之前的步骤。或者old

primary停⽌处理更新请求(到master的⽹络不通)。

这个异常会导致dirtyread的并发读问题,读者可思考⼀下。

还有另外⼀种异常,异常2:

这⾥,在第9步的时候,primaryshard因为⾃⾝的原因处理失败,例如资源异常等,会主动通知master,由masterpromote新的

primaryshard出来接收请求继续处理。在这个过程中,请求会等待默认1分钟。

⼤家可以想⼀想,如果只有⼀个primaryshard,没有replicatecopy的情况下是怎样的。

总结,由上⾯两个处理模型可以看出来,es并不是⼗分的健壮,会出现只写⼀个shard的情况,以及幻读问题。同时,客户端的写请求需要

等待in-synct中的replicatecopy处理完成,降低了写性能。并且,存在⽊桶效应,整个系统的replicationgroup的写性能由最慢的那

个shard决定。

本文发布于:2022-12-02 17:42:25,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/39294.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:december怎么读
下一篇:whereas
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图