elasticsearch write - yaokun123/php-wiki GitHub Wiki

es的写一致性

一、概述

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

1、one:primary shard要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行。

2、all:all shard要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个操作。

3、quorum:默认值,要求所有的shard中,必须大部分的shard都是活跃的,可用的才可以执行这个写操作。

二、quorum机制

写之前必须确保大多数shard都可用int((primary+number_of_replicas)/2)+1(当number_of_replicas>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按照replica机制,
必须在不同节点上(这个说法感觉不正确),
如果只有两台机器的话,是不是有可能出现3个shard无法分布齐全,此时就可能出现操作无法执行的情况。

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

quorum不齐全时,wait默认1分钟,timeout,100,30

等待期间,希望活跃的shard数量可以增加,最后是在不行,就会timeout
我们其实可以在写操作的时候,加一个timeout参数