配置生命周期策略

编辑

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

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

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

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

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

创建生命周期策略

编辑

要从 Kibana 创建生命周期策略,请打开菜单并转到 Stack Management > Index Lifecycle Policies。单击 创建策略

Create policy page

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

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

API 示例
resp = client.ilm.put_lifecycle(
    name="my_policy",
    policy={
        "phases": {
            "hot": {
                "actions": {
                    "rollover": {
                        "max_primary_shard_size": "25GB"
                    }
                }
            },
            "delete": {
                "min_age": "30d",
                "actions": {
                    "delete": {}
                }
            }
        }
    },
)
print(resp)
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
const response = await client.ilm.putLifecycle({
  name: "my_policy",
  policy: {
    phases: {
      hot: {
        actions: {
          rollover: {
            max_primary_shard_size: "25GB",
          },
        },
      },
      delete: {
        min_age: "30d",
        actions: {
          delete: {},
        },
      },
    },
  },
});
console.log(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 创建模板向导来创建模板。要访问该向导,请打开菜单并转到 Stack Management > Index Management。在 Index Templates 选项卡中,单击 创建模板

Create template page

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

API 示例
resp = client.indices.put_index_template(
    name="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"
        }
    },
)
print(resp)
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
const response = await client.indices.putIndexTemplate({
  name: "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",
    },
  },
});
console.log(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 会自动应用该模板中的设置。

resp = client.indices.create(
    index="test-000001",
    aliases={
        "test-alias": {
            "is_write_index": True
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'test-000001',
  body: {
    aliases: {
      "test-alias": {
        is_write_index: true
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "test-000001",
  aliases: {
    "test-alias": {
      is_write_index: true,
    },
  },
});
console.log(response);
PUT test-000001
{
  "aliases": {
    "test-alias":{
      "is_write_index": true 
    }
  }
}

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

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

手动应用生命周期策略

编辑

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

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

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

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

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

将策略应用于多个索引

编辑

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

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

resp = client.indices.put_settings(
    index="mylogs-pre-ilm*",
    settings={
        "index": {
            "lifecycle": {
                "name": "mylogs_policy_existing"
            }
        }
    },
)
print(resp)
response = client.indices.put_settings(
  index: 'mylogs-pre-ilm*',
  body: {
    index: {
      lifecycle: {
        name: 'mylogs_policy_existing'
      }
    }
  }
)
puts response
const response = await client.indices.putSettings({
  index: "mylogs-pre-ilm*",
  settings: {
    index: {
      lifecycle: {
        name: "mylogs_policy_existing",
      },
    },
  },
});
console.log(response);
PUT mylogs-pre-ilm*/_settings 
{
  "index": {
    "lifecycle": {
      "name": "mylogs_policy_existing"
    }
  }
}

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

切换生命周期策略

编辑

要切换索引的生命周期策略,请按照以下步骤操作

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

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

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

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

    resp = client.indices.get(
        index="logs-my_app-default",
    )
    print(resp)
    response = client.indices.get(
      index: 'logs-my_app-default'
    )
    puts response
    const response = await client.indices.get({
      index: "logs-my_app-default",
    });
    console.log(response);
    GET logs-my_app-default

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

    resp = client.indices.open(
        index="logs-my_app-default",
    )
    print(resp)
    response = client.indices.open(
      index: 'logs-my_app-default'
    )
    puts response
    const response = await client.indices.open({
      index: "logs-my_app-default",
    });
    console.log(response);
    POST logs-my_app-default/_open
  3. 使用更新设置 API 分配新策略。定位数据流或别名以将策略分配给其所有索引。

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

    resp = client.indices.put_settings(
        index="logs-my_app-default",
        settings={
            "index": {
                "lifecycle": {
                    "name": "new-lifecycle-policy"
                }
            }
        },
    )
    print(resp)
    response = client.indices.put_settings(
      index: 'logs-my_app-default',
      body: {
        index: {
          lifecycle: {
            name: 'new-lifecycle-policy'
          }
        }
      }
    )
    puts response
    const response = await client.indices.putSettings({
      index: "logs-my_app-default",
      settings: {
        index: {
          lifecycle: {
            name: "new-lifecycle-policy",
          },
        },
      },
    });
    console.log(response);
    PUT logs-my_app-default/_settings
    {
      "index": {
        "lifecycle": {
          "name": "new-lifecycle-policy"
        }
      }
    }