概念
我们在发送任何一个增删改操作的时候,都可以带上一个consistency参数,指明我们想要的写一致性是什么,比如:1
PUT /index/type/id?consistency=
consistency的值可以有三个:
- one:要求这个写操作,只要有一个primary shard是active活跃可用的状态就可以执行.
- all:要求这个写操作,必须所有的primary shard和replica shard都是active活跃的,才可以执行
- quorum:默认的值,要求所有的shard中,必须大部分的shard都是active活跃的,才可以执行.
那么怎么算大部分shard都是活跃的呢,es有一个计算的公式
quorum机制
前置条件
当replica shard 的数量大于1的时候才会生效
计算公式
1 | quorum = int((number_of_priamry_shard + number_of_replica_shard) / 2) + 1 |
举例说明
如果现在有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时长.