克隆索引 API

编辑

克隆一个现有的索引。

resp = client.indices.clone(
    index="my-index-000001",
    target="cloned-my-index-000001",
)
print(resp)
const response = await client.indices.clone({
  index: "my-index-000001",
  target: "cloned-my-index-000001",
});
console.log(response);
POST /my-index-000001/_clone/cloned-my-index-000001

请求

编辑

POST /<index>/_clone/<目标-index>

PUT /<index>/_clone/<目标-index>

先决条件

编辑
  • 如果启用了 Elasticsearch 安全功能,您必须具有要克隆的索引的 manage 索引权限
  • 要克隆索引,该索引必须标记为只读且 集群健康状态为 green

例如,以下请求阻止对 my_source_index 进行写入操作,以便可以使用 添加索引块 API 进行克隆。仍允许像删除索引这样的元数据更改。

resp = client.indices.add_block(
    index="my_source_index",
    block="write",
)
print(resp)
response = client.indices.add_block(
  index: 'my_source_index',
  block: 'write'
)
puts response
const response = await client.indices.addBlock({
  index: "my_source_index",
  block: "write",
});
console.log(response);
PUT /my_source_index/_block/write

数据流上的当前写入索引不能被克隆。为了克隆当前写入索引,必须首先滚动更新数据流,以便创建一个新的写入索引,然后可以克隆先前的写入索引。

描述

编辑

使用克隆索引 API 将现有索引克隆到新索引中,其中每个原始主分片都克隆到新索引中的新主分片中。

Elasticsearch 不会将索引模板应用于结果索引。该 API 也不会从原始索引复制索引元数据。索引元数据包括别名、ILM 阶段定义和 CCR 追随者信息。例如,如果您克隆一个 CCR 追随者索引,则生成的克隆将不是追随者索引。

克隆 API 将大多数索引设置从源索引复制到结果索引,但 index.number_of_replicasindex.auto_expand_replicas 除外。要在结果索引中设置副本数量,请在克隆请求中配置这些设置。

克隆如何工作

编辑

克隆工作方式如下

  • 首先,它创建一个与源索引定义相同的新目标索引。
  • 然后,它将来自源索引的段硬链接到目标索引。(如果文件系统不支持硬链接,则所有段都将复制到新索引中,这是一个耗时得多的过程。)
  • 最后,它恢复目标索引,就像它是刚刚重新打开的已关闭索引一样。

克隆索引

编辑

要将 my_source_index 克隆到一个名为 my_target_index 的新索引中,请发出以下请求

resp = client.indices.clone(
    index="my_source_index",
    target="my_target_index",
)
print(resp)
response = client.indices.clone(
  index: 'my_source_index',
  target: 'my_target_index'
)
puts response
const response = await client.indices.clone({
  index: "my_source_index",
  target: "my_target_index",
});
console.log(response);
POST /my_source_index/_clone/my_target_index

一旦目标索引被添加到集群状态,上述请求将立即返回 — 它不会等待克隆操作开始。

只有在满足以下要求时,才能克隆索引

  • 目标索引不得存在。
  • 源索引必须与目标索引具有相同数量的主分片。
  • 处理克隆过程的节点必须有足够的可用磁盘空间来容纳现有索引的第二个副本。

_clone API 类似于 create index API,并接受目标索引的 settingsaliases 参数

resp = client.indices.clone(
    index="my_source_index",
    target="my_target_index",
    settings={
        "index.number_of_shards": 5
    },
    aliases={
        "my_search_indices": {}
    },
)
print(resp)
response = client.indices.clone(
  index: 'my_source_index',
  target: 'my_target_index',
  body: {
    settings: {
      'index.number_of_shards' => 5
    },
    aliases: {
      my_search_indices: {}
    }
  }
)
puts response
const response = await client.indices.clone({
  index: "my_source_index",
  target: "my_target_index",
  settings: {
    "index.number_of_shards": 5,
  },
  aliases: {
    my_search_indices: {},
  },
});
console.log(response);
POST /my_source_index/_clone/my_target_index
{
  "settings": {
    "index.number_of_shards": 5 
  },
  "aliases": {
    "my_search_indices": {}
  }
}

目标索引中的分片数量。这必须等于源索引中的分片数量。

不能在 _clone 请求中指定映射。源索引的映射将用于目标索引。

监控克隆过程

编辑

可以使用 _cat recovery API 监控克隆过程,或者可以使用 cluster health API 通过将 wait_for_status 参数设置为 yellow 来等待所有主分片都被分配。

_clone API 在目标索引添加到集群状态后立即返回,在任何分片被分配之前。此时,所有分片都处于 unassigned 状态。如果出于任何原因无法分配目标索引,则其主分片将保持 unassigned 状态,直到可以在该节点上分配它。

一旦分配了主分片,它就会移动到 initializing 状态,克隆过程开始。当克隆操作完成时,分片将变为 active。此时,Elasticsearch 将尝试分配任何副本,并且可能会决定将主分片重新定位到另一个节点。

等待活动分片

编辑

由于克隆操作会创建一个新的索引来克隆分片,因此索引创建上的等待活动分片设置也适用于克隆索引操作。

路径参数

编辑
<index>
(必需,字符串)要克隆的源索引的名称。
<目标-index>

(必需,字符串)要创建的目标索引的名称。

索引名称必须满足以下条件

  • 仅限小写字母
  • 不能包含 \/*?"<>|、 ` `(空格字符)、 ,#
  • 7.0 之前的索引可以包含冒号 (:),但这已被弃用,并且在 7.0+ 中将不再支持
  • 不能以 -_+ 开头
  • 不能为 ...
  • 长度不能超过 255 个字节(请注意,它是字节,因此多字节字符将更快地计入 255 个限制)
  • . 开头的名称已被弃用,但隐藏索引和插件管理的内部索引除外

查询参数

编辑
wait_for_active_shards

(可选,字符串)在继续操作之前必须处于活动状态的每个分片的副本数量。设置为 all 或任何非负整数,最大值为索引中每个分片的副本总数 (number_of_replicas+1)。默认为 1,表示仅等待每个主分片处于活动状态。

请参阅 活动分片

master_timeout
(可选,时间单位)等待主节点的时间段。如果主节点在超时到期之前不可用,则请求失败并返回错误。默认为 30s。也可以设置为 -1 以指示请求永远不应超时。
timeout
(可选,时间单位)在更新集群元数据后,等待集群中所有相关节点响应的时间段。如果在超时到期之前没有收到响应,则集群元数据更新仍然适用,但响应将表明它没有被完全确认。默认为 30s。也可以设置为 -1 以指示请求永远不应超时。

请求正文

编辑
aliases

(可选,对象对象)结果索引的别名。

aliases 对象的属性
<alias>

(必需,对象)键是别名名称。索引别名名称支持日期数学

对象正文包含别名的选项。支持空对象。

<alias> 的属性
filter
(可选,查询 DSL 对象)用于限制别名可以访问的文档的查询。
index_routing
(可选,字符串)用于将索引操作路由到特定分片的值。如果指定,这将覆盖索引操作的 routing 值。
is_hidden
(可选,布尔值)如果 true,则别名是隐藏的。默认为 false。别名的所有索引必须具有相同的 is_hidden 值。
is_write_index
(可选,布尔值)如果 true,则索引是别名的写入索引。默认为 false
routing
(可选,字符串)用于将索引和搜索操作路由到特定分片的值。
search_routing
(可选,字符串)用于将搜索操作路由到特定分片的值。如果指定,这将覆盖搜索操作的 routing 值。
settings
(可选,索引设置对象)目标索引的配置选项。请参阅索引设置