写操作流程
笔记
新建、索引和删除请求都是写操作 必须在主分片上面完成之后才能被复制到相关的副本分片
# 步骤
- 客户端向Node 1发送新建、索引或者删除请求
- 节点使用文档的_id 确定文档属于分片 0。请求会被转发到 Node 3,因为分片0的主分片目前被分配在 Node 3上
- Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2的副本分片上;一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的
# 参数
有一些可选请求参数允许影响这个过程,以数据安全为代价提升性能;由于Elasticsearch 已经很快,这些选项很少使用
consistency 一致性
- 在默认设置下,即使仅仅是在试图执行一个写操作之前,主分片都会要求必须要有规定数量(quorum,即)的分片副本处于活跃可用状态,才会去执行写操作 (其中分片副本可以是主分片或者副本分片);为了避免在发生网络分区故障(network partition)的时候进行写操作,进而导致数据不一致
- consistency 参数的值可以设为
- 默认值 quorum:规定数量(即大多数)的分片副本状态没问题就允许执行写操
- 规定数量计算公式
- int( (primary + number_of_replicas) / 2 ) + 1
- 其中 number_of_replicas 索引设置中的设定副本分片数,而不是指当前处理活动状态的副本分片数
- 如果索引设置中指定了当前索引拥有3个副本分片,那规定数量的计算结果即:int( (primary + 3 replicas) / 2 ) + 1 = 3 =((1+3)/2+1) 如果此时只启动两个节点,那么处于活跃状态的分片副本数量就达不到规定数量,将无法索引和删除任何文档
- one:只要主分片状态 ok 就允许执行写操作
- all:必须要主分片和所有副本分片的状态没问题才允许执行写操作
- 默认值 quorum:规定数量(即大多数)的分片副本状态没问题就允许执行写操
timeout
- 如果没有足够的副本分片会发生什么? Elasticsearch 会等待,希望更多的分片出现
- 默认值 1min
注意
新索引默认有1个副本分片,为满足规定数量应该需要两个活动的分片副本。 但默认的设置会阻止在单一节点上做任何事情。为了避免这个问题,要求只有当number_of_replicas 大于1的时候,规定数量才会执行
笔记
写操作的延时:主分片延时+并行写入副本的最大延时
Last Updated: 2022/04/10, 13:57:31