缩减编辑

允许的阶段:热、温。

阻止写入 源索引,并将其缩减为具有较少主分片的的新索引。生成的索引名称为 shrink-<随机 UUID>-<原始索引名称>。此操作对应于 缩减 API

shrink 操作之后,指向源索引的所有别名都将指向新的缩减索引。如果 ILM 对数据流的 backing 索引执行 shrink 操作,则缩减索引将替换流中的源索引。您无法对写入索引执行 shrink 操作。

要在 hot 阶段使用 shrink 操作,必须 存在 rollover 操作。如果没有配置 rollover 操作,ILM 将拒绝该策略。

shrink 操作将取消设置索引的 index.routing.allocation.total_shards_per_node 设置,这意味着将没有限制。这是为了确保可以将索引的所有分片复制到单个节点。即使在步骤完成后,此设置更改仍将保留在索引上。

如果对 跟随者索引 使用 shrink 操作,则策略执行将等待,直到领导者索引翻转(或 以其他方式标记为完成),然后在执行 shrink 操作之前,使用 取消跟随 操作将跟随者索引转换为常规索引。

缩减选项编辑

number_of_shards
(可选,整数)要缩减到的分片数。必须是源索引中分片数的因子。此参数与 max_primary_shard_size 冲突,只能设置其中一个。
max_primary_shard_size
(可选,字节单位)目标索引的最大主分片大小。用于查找目标索引的最佳分片数。设置此参数后,目标索引中每个分片的存储空间都不会大于该参数。目标索引的分片计数仍将是源索引的分片计数的因子,但如果该参数小于源索引中的单个分片大小,则目标索引的分片计数将等于源索引的分片计数。例如,当此参数设置为 50gb 时,如果源索引有 60 个主分片,总计 100gb,则目标索引将有 2 个主分片,每个分片大小为 50gb;如果源索引有 60 个主分片,总计 1000gb,则目标索引将有 20 个主分片;如果源索引有 60 个主分片,总计 4000gb,则目标索引仍将有 60 个主分片。此参数与 number_of_shardssettings 中冲突,只能设置其中一个。
allow_write_after_shrink
(可选,布尔值)如果为 true,则通过移除 写入块 使缩减后的索引可写。默认为 false。

示例编辑

显式设置新缩减索引的分片数编辑

response = client.ilm.put_lifecycle(
  policy: 'my_policy',
  body: {
    policy: {
      phases: {
        warm: {
          actions: {
            shrink: {
              number_of_shards: 1
            }
          }
        }
      }
    }
  }
)
puts response
PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "shrink" : {
            "number_of_shards": 1
          }
        }
      }
    }
  }
}

计算缩减索引的最佳主分片数编辑

以下策略使用 max_primary_shard_size 参数根据源索引的存储大小自动计算新缩减索引的主分片计数。

response = client.ilm.put_lifecycle(
  policy: 'my_policy',
  body: {
    policy: {
      phases: {
        warm: {
          actions: {
            shrink: {
              max_primary_shard_size: '50gb'
            }
          }
        }
      }
    }
  }
)
puts response
PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "shrink" : {
            "max_primary_shard_size": "50gb"
          }
        }
      }
    }
  }
}

缩减的分片分配编辑

shrink 操作期间,ILM 会将源索引的主分片分配给一个节点。缩减索引后,ILM 会根据您的分配规则将缩减索引的分片重新分配给适当的节点。

这些分配步骤可能会因多种原因而失败,包括

  • shrink 操作期间移除节点。
  • 没有节点有足够的磁盘空间来托管源索引的分片。
  • 由于分配规则冲突,Elasticsearch 无法重新分配缩减的索引。

当其中一个分配步骤失败时,ILM 会等待 index.lifecycle.step.wait_time_threshold 中设置的时间段,默认为 12 小时。此阈值时间段允许集群解决导致分配失败的任何问题。

如果超过阈值时间段,并且 ILM 尚未缩减索引,则 ILM 会尝试将源索引的主分片分配给另一个节点。如果 ILM 缩减了索引,但在阈值时间段内无法重新分配缩减索引的分片,则 ILM 会删除缩减的索引,并重新尝试整个 shrink 操作。