Shrink Index

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

收缩的工作原理如下:

  • 首先,它创建一个新的目标索引,其定义与源索引相同,但主分片数量较少。
  • 然后,它将源索引中的段硬链接到目标索引。(如果文件系统不支持硬链接,则所有段都将复制到新索引中,这是一个更耗时的过程。另外,如果使用多个数据路径,则不同数据路径上的分片需要分段的完整副本文件,如果它们不在同一磁盘上,因为硬链接不能跨磁盘工作)
  • 最后,它恢复了目标索引,好像它是一个刚重新打开的封闭索引。

Preparing an index for shrinking 准备收缩

为了收缩索引,必须将索引标记为只读,并且索引中每个分片的(主要或副本)副本必须重定位到同一节点并且运行状况为绿色。

可以通过以下请求实现这两个条件:

  1. PUT /my_source_index/_settings
  2. {
  3. "settings": {
  4. "index.routing.allocation.require._name": "shrink_node_name", #@1
  5. "index.blocks.write": true n #@2
  6. }
  7. }

@1: 强制将每个分片的副本重定位到名为shrink_node_name的节点。有关更多选项,请参阅索引级分片分配筛选。
@2: 阻止对此索引的写入操作,同时仍允许更改元数据,如删除索引。

重新定位源索引可能需要一段时间。可以使用_cat恢复API跟踪进度,或者可以使用集群运行状况API等待所有分片都使用wait_for_no_relocating_shards参数重定位。

Shrinking an index

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

  1. POST my_source_index/_shrink/my_target_index
  2. {
  3. "settings": {
  4. "index.routing.allocation.require._name": null,
  5. "index.blocks.write": null
  6. }
  7. }

@1: 清除从源索引复制的分配要求。
@2: 清除从源索引复制的索引写入块。

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

_shrink API类似于create index API,并接受目标索引的设置和别名参数:

  1. POST my_source_index/_shrink/my_target_index
  2. {
  3. "settings": {
  4. "index.number_of_replicas": 1,
  5. "index.number_of_shards": 1, # @1
  6. "index.codec": "best_compression" #@2
  7. },
  8. "aliases": {
  9. "my_search_indices": {}
  10. }
  11. }

@1: 目标索引中的分片数。这必须是源索引中分片数量的一个因素。
@2: 最佳压缩仅在对索引进行新写入时生效,例如将分片强制合并到单个段时。

Monitoring the shrink process

可以使用_cat恢复API监视收缩过程,或者可以使用集群运行状况API等待,直到通过将wait_for_status参数设置为黄色来分配所有主分片。

在分配任何分片之前,只要目标索引已添加到群集状态,_shrink API就会返回。此时,所有分片都处于未分配的状态。如果由于任何原因无法在收缩节点上分配目标索引,则其主分片将保持未分配状态,直到可以在该节点上分配为止。

一旦分配了主分片,它就会转到状态初始化,并开始缩小过程。收缩操作完成后,分片将变为活动状态。此时,Elasticsearch将尝试分配任何副本,并可能决定将主分片重定位到另一个节点。

Wait For Active Shards

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