Elasticsearch-15-写一致性原理及quorum机制

概念

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

1
PUT /index/type/id?consistency=

consistency的值可以有三个:

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

那么怎么算大部分shard都是活跃的呢,es有一个计算的公式

quorum机制

前置条件

replica shard 的数量大于1的时候才会生效

计算公式
1
2
quorum = int((number_of_priamry_shard + number_of_replica_shard) / 2) + 1
# 这里的number_of_replica_shard是相对于 primary shard的数量
举例说明

如果现在有3个primary shard, number_of_replica_shard = 3, 也就是说一共有3 + 3 * 3 = 12个shard,根据公式, int((3 + 3) / 2) + 1 = 4 意思就是说,在所有的12个shard中必须是有4个shard是active状态的才可以执行写操作

如果节点的数量少于quorum数量,可能导致quorum不齐全,进而导致无法执行任何写操作

特殊场景处理

如果说我们就一个primary shard,replica = 1,此时总共就两个shard,按照公式int((1 + 1) / 2) + 1 = 2,此时要求两个shard都是活跃的才行,但是我们可能就有一个节点,只能有一个primary shard,那么这个情况下是不是就无法写入了呢?

es提供了一种特殊的处理场景,就是说当number_of_replicas > 1的时候才生效,如果没有这种特殊处理的话,单节点集群就无法正常工作.

超时等待

当quorum不齐全时, 会默认等待一分钟,等待期间,期望活跃的shard数量可以增加,时间到了还不能添加的话就超时.
我们也可以在写操作的时候,加一个timeout的参数,比如

1
PUT /index/type/id?timeout=30ms

就是说我们自己去设定当quorum不齐全的时候es的timeout时长.