写一致性及quorum机制

one all quorum

consistency,one(primary shard),all(all shard),quorum(default)

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

put /index/id?consistency=quorum

定义

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

quorum机制

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

quroum = int( (primary + number_of_replicas) / 2 ) + 1

举个例子,3 个 primary shard,number_of_replicas=1,总共有 3 + 3 * 1 = 6 个 shard:

quorum = int( (3 + 1) / 2 ) + 1 = 3

所以,要求 6 个 shard 中至少有 3 个 shard 是 active 状态的,才可以执行这个写操作。如果节点数少于 quorum 数量,可能导致 quorum 不齐全,进而导致无法执行任何写操作。

3 个 primary shard,replica=1,要求至少 3 个 shard 是 active,3 个 shard 按照之前学习的 shard&replica 机制,必须在不同的节点上,如果说只有 2 台机器的话,是不是有可能出现说,3 个 shard 都没法分配齐全,此时就可能会出现写操作无法执行的情况

es 提供了一种特殊的处理场景,就是说当 number_of_replicas > 1 时才生效,因为假如说,你就一个 primary shard,replica=1,此时就 2 个 shard。

(1 + 1 / 2) + 1 = 2,要求必须有 2 个 shard 是活跃的,但是可能就 1 个 node,此时就 1 个 shard 是活跃的,如果你不特殊处理的话,导致我们的单节点集群就无法工作。

quorum不齐全

quorum 不齐全时,写操作会默认进行 wait,默认 1 分钟。等待期间,期望活跃的 shard 数量可以增加,最后实在不行,就会 timeout。

我们其实可以在写操作的时候,加一个 timeout 参数,比如说:

put /index/id?timeout=30

这个就是说自己去设定 quorum 不齐全的时候,es 的 timeout 时长,可以缩短,也可以增长。