缩减索引 API编辑

将现有索引缩减为具有较少主分片的新索引。

response = client.indices.shrink(
  index: 'my-index-000001',
  target: 'shrunk-my-index-000001'
)
puts response
POST /my-index-000001/_shrink/shrunk-my-index-000001

请求编辑

POST /<index>/_shrink/<target-index>

PUT /<index>/_shrink/<target-index>

先决条件编辑

  • 如果启用了 Elasticsearch 安全功能,您必须对该索引具有 manage 索引权限
  • 在缩减索引之前

    • 该索引必须为只读。
    • 索引中每个分片的副本必须驻留在同一节点上。
    • 该索引必须具有 green 健康状态

为了使分片分配更容易,我们建议您还删除索引的副本分片。您可以在缩减操作中重新添加副本分片。

您可以使用以下 更新索引设置 API 请求删除索引的副本分片,并将索引的剩余分片重新分配到同一节点。

PUT /my_source_index/_settings
{
  "settings": {
    "index.number_of_replicas": 0,                                
    "index.routing.allocation.require._name": "shrink_node_name"  
  }
}

删除索引的副本分片。

将索引的分片重新分配到 shrink_node_name 节点。请参阅 索引级分片分配过滤

重新分配源索引可能需要一段时间。可以使用 _cat recovery API 跟踪进度,或者可以使用 cluster health API 等待所有分片重新分配,方法是使用 wait_for_no_relocating_shards 参数。

然后,您可以使用以下请求使用 添加索引块 API 使索引变为只读

PUT /my_source_index/_block/write

描述编辑

缩减索引 API 允许您将现有索引缩减为具有较少主分片的新索引。目标索引中请求的主分片数必须是源索引中分片数的因数。例如,具有 8 个主分片的索引可以缩减为 421 个主分片,或者具有 15 个主分片的索引可以缩减为 531 个主分片。如果索引中的分片数是素数,则它只能缩减为单个主分片。在缩减之前,索引中每个分片(主分片或副本分片)的副本必须存在于同一节点上。

数据流上的当前写入索引无法缩减。为了缩减当前写入索引,必须首先将数据流 回滚,以便创建一个新的写入索引,然后可以缩减先前的写入索引。

缩减的工作原理编辑

缩减操作

  1. 创建一个新的目标索引,其定义与源索引相同,但具有更少的主分片。
  2. 将源索引中的段硬链接到目标索引。(如果文件系统不支持硬链接,则所有段都将复制到新索引中,这将是一个耗时得多的过程。此外,如果使用多个数据路径,则如果不同数据路径上的分片不在同一磁盘上,则需要完全复制段文件,因为硬链接无法跨磁盘工作)
  3. 恢复目标索引,就好像它是一个刚刚重新打开的关闭索引一样。将分片恢复到 索引设置 .routing.allocation.initial_recovery._id

缩减索引编辑

要将 my_source_index 缩减为名为 my_target_index 的新索引,请发出以下请求

response = client.indices.shrink(
  index: 'my_source_index',
  target: 'my_target_index',
  body: {
    settings: {
      'index.routing.allocation.require._name' => nil,
      'index.blocks.write' => nil
    }
  }
)
puts response
POST /my_source_index/_shrink/my_target_index
{
  "settings": {
    "index.routing.allocation.require._name": null, 
    "index.blocks.write": null 
  }
}

清除从源索引复制的分配要求。

清除从源索引复制的索引写入块。

上述请求在目标索引已添加到集群状态后立即返回,它不会等待缩减操作开始。

索引只能在满足以下要求的情况下缩减

  • 目标索引必须不存在。
  • 源索引必须具有比目标索引更多的主分片。
  • 目标索引中的主分片数必须是源索引中主分片数的因数。源索引必须具有比目标索引更多的主分片。
  • 索引中包含的文档总数(跨所有分片)不能超过 2,147,483,519 个,这些分片将缩减为目标索引上的单个分片,因为这是单个分片可以容纳的最大文档数。
  • 处理缩减过程的节点必须有足够的可用磁盘空间来容纳现有索引的第二个副本。

_shrink API 类似于 create index API,并接受 settingsaliases 参数以用于目标索引

response = client.indices.shrink(
  index: 'my_source_index',
  target: 'my_target_index',
  body: {
    settings: {
      'index.number_of_replicas' => 1,
      'index.number_of_shards' => 1,
      'index.codec' => 'best_compression'
    },
    aliases: {
      my_search_indices: {}
    }
  }
)
puts response
POST /my_source_index/_shrink/my_target_index
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 1, 
    "index.codec": "best_compression" 
  },
  "aliases": {
    "my_search_indices": {}
  }
}

目标索引中的分片数。这必须是源索引中分片数的因数。

最佳压缩只有在对索引进行新的写入时才会生效,例如,当 强制合并 分片到单个段时。

映射不能在 _shrink 请求中指定。

监控缩减过程编辑

可以使用 _cat recovery API 监控缩减过程,或者可以使用 cluster health API 等待所有主分片分配,方法是将 wait_for_status 参数设置为 yellow

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

主分片分配后,它将变为 initializing 状态,缩减过程开始。缩减操作完成后,分片将变为 active 状态。此时,Elasticsearch 将尝试分配任何副本,并可能决定将主分片重新分配到另一个节点。

等待活动分片编辑

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

路径参数编辑

<index>
(必需,字符串) 要缩减的源索引的名称。
<target-index>

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

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

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

查询参数编辑

wait_for_active_shards

(可选,字符串) 必须处于活动状态的分片副本数量,然后才能继续执行操作。设置为 all 或任何正整数,直到索引中的分片总数 (number_of_replicas+1)。默认值:1,主分片。

请参阅 活动分片

master_timeout
(可选,时间单位) 等待主节点的时间段。如果在超时时间到期之前主节点不可用,则请求失败并返回错误。默认值为 30s。也可以设置为 -1 表示请求永远不会超时。
timeout
(可选,时间单位) 等待响应的时间段。如果在超时时间到期之前未收到响应,则请求失败并返回错误。默认值为 30s

请求体编辑

别名

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

aliases 对象的属性
<别名>

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

对象主体包含别名的选项。支持空对象。

<别名> 的属性
过滤器
(可选,查询 DSL 对象) 用于限制别名可以访问的文档的查询。
索引路由
(可选,字符串) 用于将索引操作路由到特定分片的 value。如果指定,这将覆盖索引操作的 routing value。
is_hidden
(可选,布尔值) 如果为 true,则别名是 隐藏的。默认为 false。别名的所有索引都必须具有相同的 is_hidden value。
is_write_index
(可选,布尔值) 如果为 true,则索引是别名的 写入索引。默认为 false
路由
(可选,字符串) 用于将索引和搜索操作路由到特定分片的 value。
搜索路由
(可选,字符串) 用于将搜索操作路由到特定分片的 value。如果指定,这将覆盖搜索操作的 routing value。
设置
(可选,索引设置对象) 目标索引的配置选项。请参阅 索引设置
max_primary_shard_size
(可选,字节大小单位) 目标索引的最大主分片大小。用于查找目标索引的最佳分片数量。当设置此参数时,目标索引中每个分片的存储空间不会大于参数。目标索引的分片数量仍然是源索引分片数量的倍数,但如果参数小于源索引中的单个分片大小,则目标索引的分片数量将等于源索引的分片数量。例如,当此参数设置为 50gb 时,如果源索引有 60 个主分片,总计 100gb,则目标索引将有 2 个主分片,每个分片大小为 50gb;如果源索引有 60 个主分片,总计 1000gb,则目标索引将有 20 个主分片;如果源索引有 60 个主分片,总计 4000gb,则目标索引仍然有 60 个主分片。此参数与 settings 中的 number_of_shards 冲突,只能设置其中一个。