三十、Elasticsearch一致性和quorum机制深入剖析

1、一致性
consistency,one(primary shard),all(all shard),quorum(default)

我们在发送任何一个增删改操作的时候,比如PUT /index/type/id,都可以带上一个consistency参数,指明我们想要的写一致性是什么?
PUT /index/type/id?consistency=quorum

one:要求我们这个写操作,只要有一个primary shard是active状态,就可以执行。
all:要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作。
quorum:默认值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作。

2、quorum机制
写之前必须确保大多数shard可用
(1)公式:
int((primary shard + number_of_replicas) / 2) + 1
当number_of_replicas > 1时才生效。

(2)举例
3个primary shard,1个副本,则
int((3 + 1) /2) + 1 = 3;
所以要求6个shard中至少有3个shard是active状态的,才可以执行这个写操作

(3)若节点数少于quorum数量,可能导致quorum不齐全,进而导致无法执行任何写操作

比如:
1个primary shard,3个replica。那么
quorum=((1 + 3) / 2) + 1 = 3,要求1个primary shard+3个replica shard=4个shard,其中必须有3个shard是要处于active状态,若这时候只有两台机器的话,会出现什么情况?

三十、Elasticsearch一致性和quorum机制深入剖析_第1张图片
Paste_Image.png

ES提供了一种特殊处理场景,就是说当number_of_replicas>1时才生效,因为假如说,你就一个primary shard,replica=1,此时就2个shard
((1 + 1) / 2) + 1 = 2;要求必须有2个shard是活跃的,但是可能就1个node,此时就1个shard是活跃的,若你不特出处理的话,导致我们的单节点集群就无法工作。

(4)quorum不齐全时,会wait(等待)1分钟
默认1分钟,可以设置timeout手动去调,默认单位毫秒。

等待期间,期望活跃的shard数量可以增加,最后实在不行,就会timeout,我们其实可以在写操作的时候,加一个timeout参数,比如说PUT /index/type/id?timeout=30s,这个就是说自己去设定quorum不齐全的时候,ES的timeout时长。默认是毫秒,加个s代表秒

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg

你可能感兴趣的:(三十、Elasticsearch一致性和quorum机制深入剖析)