我们都知道,es存储的时候分主副分片来提高高可用,那es是如何确定写一致性的呢,下面我们一起了解一下。
我们在发送任何一个增删改操作的时候,比如说put /index/type/id,都可以带上一个consistency参数,指明我们想要的写一致性是什么
es有三种一致性参数:
1.one:要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行
2.all:要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作
3.quorum:默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作
这里着重介绍一下quorum,quorum机制,写之前必须确保大多数shard都可用,如下算法:shardNum = int( (primary + number_of_replicas) / 2 ) + 1,只有至少shardNum个节点处于active状态才能执行写操作。
但是这里我们要注意一点,举例说明:比如新建一个索引,有一个主分片,一个副分片,那(1 + 1/2) + 1 = 2,那就必须要有两个节点活跃才能执行写操作,那咱们要是只有单节点集群,这就无法玩了,所以es对这种特殊情况,做了处理,就是说当number_of_replicas>1时才生效。
另外quorum不齐全时,不会立即判定写入失败,而是进入wait状态,默认1分钟,等待期间,期望活跃的shard数量可以增加,最后实在不行,就会timeout我们其实可以在写操作的时候,加一个timeout参数,比如说put /index/type/id?timeout=30,这个就是说自己去设定quorum不齐全的时候,es的timeout时长,可以缩短,也可以增长
es写入一致性就介绍到这里,如有帮助请关注,谢谢!