配置生命周期策略编辑

为了让 ILM 管理索引,必须在 index.lifecycle.name 索引设置中指定有效的策略。

要为 滚动索引 配置生命周期策略,您需要创建策略并将其添加到 索引模板 中。

要使用策略管理不滚动的索引,您可以在创建索引时指定生命周期策略,或者将策略直接应用于现有索引。

ILM 策略存储在全局集群状态中,可以通过在 创建快照 时将 include_global_state 设置为 true 来将其包含在快照中。当恢复快照时,全局状态中的所有策略都会被恢复,并且任何具有相同名称的本地策略都会被覆盖。

当您为 Beats 或 Logstash Elasticsearch 输出插件启用索引生命周期管理时,必要的策略和配置更改会自动应用。您可以修改默认策略,但无需显式配置策略或引导初始索引。

创建生命周期策略编辑

要从 Kibana 创建生命周期策略,请打开菜单并转到 堆栈管理 > 索引生命周期策略。点击 创建策略

Create policy page

您需要指定策略的生命周期阶段以及每个阶段要执行的操作。

创建或更新策略 API 用于将策略添加到 Elasticsearch 集群。

API 示例
response = client.ilm.put_lifecycle(
  policy: 'my_policy',
  body: {
    policy: {
      phases: {
        hot: {
          actions: {
            rollover: {
              max_primary_shard_size: '25GB'
            }
          }
        },
        delete: {
          min_age: '30d',
          actions: {
            delete: {}
          }
        }
      }
    }
  }
)
puts response
PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_primary_shard_size": "25GB" 
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {} 
        }
      }
    }
  }
}

当索引大小达到 25GB 时滚动索引

在滚动后 30 天删除索引

滚动操作隐式地始终滚动数据流或别名,如果一个或多个分片包含 200000000 个或更多文档。通常,分片在达到 200M 个文档之前很久就会达到 25GB,但对于空间效率高的数据集来说并非如此。如果分片包含超过 200M 个文档,搜索性能很可能会受到影响。这是内置限制的原因。

使用索引模板应用生命周期策略编辑

要使用触发滚动操作的策略,您需要在用于创建每个新索引的索引模板中配置策略。您需要指定策略的名称以及用于引用滚动索引的别名。

仅当将索引生命周期管理与别名一起使用时,才需要 index.lifecycle.rollover_alias 设置。在使用 数据流 时,它是不必要的。

您可以使用 Kibana 创建模板向导来创建模板。要访问向导,请打开菜单并转到 堆栈管理 > 索引管理。在 索引模板 选项卡中,点击 创建模板

Create template page

向导会调用 创建或更新索引模板 API 将模板添加到集群。

API 示例
response = client.indices.put_index_template(
  name: 'my_template',
  body: {
    index_patterns: [
      'test-*'
    ],
    template: {
      settings: {
        number_of_shards: 1,
        number_of_replicas: 1,
        'index.lifecycle.name' => 'my_policy',
        'index.lifecycle.rollover_alias' => 'test-alias'
      }
    }
  }
)
puts response
PUT _index_template/my_template
{
  "index_patterns": ["test-*"], 
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.lifecycle.name": "my_policy", 
      "index.lifecycle.rollover_alias": "test-alias" 
    }
  }
}

将此模板用于所有名称以 test- 开头的新的索引

my_policy 应用于使用此模板创建的新索引

定义一个索引别名,用于引用由 my_policy 管理的索引

创建初始管理索引编辑

当您为自己的滚动索引设置策略时,如果您没有使用推荐的 数据流,则需要手动创建由策略管理的第一个索引,并将其指定为写入索引。

当您为 Beats 或 Logstash Elasticsearch 输出插件启用索引生命周期管理时,必要的策略和配置更改会自动应用。您可以修改默认策略,但无需显式配置策略或引导初始索引。

索引的名称必须与索引模板中定义的模式匹配,并以数字结尾。此数字会递增,以生成由滚动操作创建的索引的名称。

例如,以下请求创建了 test-00001 索引。由于它与 my_template 中指定的索引模式匹配,Elasticsearch 会自动应用该模板中的设置。

response = client.indices.create(
  index: 'test-000001',
  body: {
    aliases: {
      "test-alias": {
        is_write_index: true
      }
    }
  }
)
puts response
PUT test-000001
{
  "aliases": {
    "test-alias":{
      "is_write_index": true 
    }
  }
}

将此初始索引设置为该别名的写入索引。

现在,您可以开始将数据索引到生命周期策略中指定的滚动别名。使用示例 my_policy 策略,一旦初始索引超过 25GB,就会触发滚动操作。然后,ILM 会创建一个新的索引,该索引将成为 test-alias 的写入索引。

手动应用生命周期策略编辑

您可以在创建索引时指定策略,或者通过 Kibana 管理或 更新设置 API 将策略应用于现有索引。当您应用策略时,ILM 会立即开始管理索引。

不要手动应用使用滚动操作的策略。使用滚动的策略必须通过 索引模板 应用。否则,当滚动操作创建新索引时,策略不会被传递。

index.lifecycle.name 设置指定了索引的策略。

API 示例
response = client.indices.create(
  index: 'test-index',
  body: {
    settings: {
      number_of_shards: 1,
      number_of_replicas: 1,
      'index.lifecycle.name' => 'my_policy'
    }
  }
)
puts response
PUT test-index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "my_policy" 
  }
}

设置索引的生命周期策略。

将策略应用于多个索引编辑

您可以通过在调用 更新设置 API 时在索引名称中使用通配符,将相同的策略应用于多个索引。

请注意,不要无意中匹配您不想修改的索引。

response = client.indices.put_settings(
  index: 'mylogs-pre-ilm*',
  body: {
    index: {
      lifecycle: {
        name: 'mylogs_policy_existing'
      }
    }
  }
)
puts response
PUT mylogs-pre-ilm*/_settings 
{
  "index": {
    "lifecycle": {
      "name": "mylogs_policy_existing"
    }
  }
}

更新所有名称以 mylogs-pre-ilm 开头的索引

切换生命周期策略编辑

要切换索引的生命周期策略,请执行以下步骤

  1. 使用 删除策略 API 删除现有策略。针对数据流或别名,以删除其所有索引的策略。

    response = client.ilm.remove_policy(
      index: 'logs-my_app-default'
    )
    puts response
    POST logs-my_app-default/_ilm/remove
  2. 删除策略 API 会从索引中删除所有 ILM 元数据,并且不会考虑索引的生命周期状态。这可能会导致索引处于不希望的状态。

    例如,forcemerge 操作会在重新打开索引之前暂时关闭索引。在 forcemerge 期间删除索引的 ILM 策略可能会导致索引无限期地关闭。

    删除策略后,使用 获取索引 API 检查索引的状态。针对数据流或别名,以获取其所有索引的状态。

    response = client.indices.get(
      index: 'logs-my_app-default'
    )
    puts response
    GET logs-my_app-default

    然后,您可以根据需要更改索引。例如,您可以使用 打开索引 API 重新打开任何已关闭的索引。

    response = client.indices.open(
      index: 'logs-my_app-default'
    )
    puts response
    POST logs-my_app-default/_open
  3. 使用 更新设置 API 分配新的策略。针对数据流或别名,以将其策略分配给其所有索引。

    不要在不先删除现有策略的情况下分配新的策略。这会导致 阶段执行 默默地失败。

    response = client.indices.put_settings(
      index: 'logs-my_app-default',
      body: {
        index: {
          lifecycle: {
            name: 'new-lifecycle-policy'
          }
        }
      }
    )
    puts response
    PUT logs-my_app-default/_settings
    {
      "index": {
        "lifecycle": {
          "name": "new-lifecycle-policy"
        }
      }
    }