新建、索引和删除文档

新建、索引和删除 请求都是 操作, 必须在主分片上面完成之后才能被复制到相关的副本分片,如下图所示 Figure 9, “新建、索引和删除单个文档”.

Figure 9. 新建、索引和删除单个文档

新建、索引和删除单个文档

以下是在主副分片和任何副本分片上面 成功新建,索引和删除文档所需要的步骤顺序:

  1. 客户端向 Node 1 发送新建、索引或者删除请求。
  2. 节点使用文档的 _id 确定文档属于分片 0`。请求会被转发到 `Node 3`,因为分片 0 的主分片目前被分配在 `Node 3 上。
  3. Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。

在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。

有一些可选的请求参数允许您影响这个过程,可能以数据安全为代价提升性能。这些选项很少使用,因为Elasticsearch已经很快,但是为了完整起见,在这里阐述如下:

一致性

默认情况下,主分片 需要 规定数量(quorum),或大多数的分片 (其中分片副本可以是主分片或者副本分片)在写入操作时可用。这是为了防止将数据写入到网络分区的‘`背面’'。规定的数量定义公式如下:

int( (primary + number_of_replicas) / 2 ) + 1

允许的 一致性 值是 一个 (只是主分片)或者 `所有`(主分片和副本分片), 或者默认的规定数量或者大多数的副本分片。

注意 number_of_replicas 是在索引中的设置_指定_的分片数,不是当前处理活动状态的副本分片数。如果你指定索引应该有三个副本分片,那规定数量计算公式是:

int( (primary + 3 replicas) / 2 ) + 1 = 3

但是如果只启动两个节点,则活动分片副本无法满足规定数量,并且您将无法索引和删除任何文档。

超时
如果没有足够的副本分片会发生什么? Elasticsearch会等待,希望更多的分片出现。默认情况下,它最多等待1分钟。 如果你需要,你可以使用 timeout 参数 使它更早终止: 100 100毫秒,30s 是30秒。
Note

新索引默认有 1 个副本分片,这意味着为满足 规定数量 应该 需要两个活动的分片副本。 但是,这些默认的设置会阻止我们在单一节点上做任何事情。为了避免这个问题,要求只有当 number_of_replicas 大于1的时候,规定数量才会执行。