教程:数据流保留

编辑

在本教程中,我们将讨论数据流生命周期保留;我们将定义它,讨论如何配置以及如何应用。请记住,以下选项仅适用于由数据流生命周期管理的数据流。

您可以通过 获取数据流生命周期 API 来验证数据流是否由数据流生命周期管理。

resp = client.indices.get_data_lifecycle(
    name="my-data-stream",
)
print(resp)
response = client.indices.get_data_lifecycle(
  name: 'my-data-stream'
)
puts response
const response = await client.indices.getDataLifecycle({
  name: "my-data-stream",
});
console.log(response);
GET _data_stream/my-data-stream/_lifecycle

结果应如下所示

{
  "data_streams": [
    {
      "name": "my-data-stream",                                   
      "lifecycle": {
        "enabled": true                                           
      }
    }
  ]
}

您的数据流的名称。

确保生命周期已启用,这意味着此值应为 true

什么是数据流保留?

编辑

我们将保留定义为数据流的数据将在 Elasticsearch 中保留的最短时间。在此时间段过去后,Elasticsearch 可以删除这些数据以释放空间和/或管理成本。

保留时间不定义数据将被删除的时间段,而是它们将被保留的最短时间段。

我们定义了 4 种不同类型的保留时间

  • 数据流保留时间,或 data_retention,这是在数据流级别配置的保留时间。可以通过 索引模板 为将来的数据流设置,也可以通过 PUT 数据流生命周期 API 为现有数据流设置。当未设置数据流保留时间时,表示需要永久保留数据。
  • 全局默认保留时间,我们称之为 default_retention,它是通过集群设置 data_streams.lifecycle.retention.default 配置的保留时间,将应用于所有由数据流生命周期管理且未配置 data_retention 的数据流。实际上,它确保不会有数据流永久保留其数据。这可以通过 更新集群设置 API 来设置。
  • 全局最大保留时间,我们称之为 max_retention,它是通过集群设置 data_streams.lifecycle.retention.max 配置的保留时间,将应用于所有由数据流生命周期管理的数据流。实际上,它确保不会有数据流的保留时间超过此时间段。这可以通过 更新集群设置 API 来设置。
  • 有效保留时间,或 effective_retention,这是在给定时刻应用于数据流的保留时间。有效保留时间无法设置,它是通过考虑上面列出的所有配置的保留时间而得出的,并且计算方法如此处所述。

全局默认和最大保留时间不适用于 Elastic 内部的数据流。内部数据流可以通过将 system 标志设置为 true 或其名称以点号 (.) 开头来识别。

如何配置保留时间?

编辑
  • 通过在数据流级别设置 data_retention。此保留时间可以通过两种方式配置

    — 对于新的数据流,可以在数据流创建期间应用的索引模板中定义。您可以使用 创建索引模板 API,例如

    resp = client.indices.put_index_template(
        name="template",
        index_patterns=[
            "my-data-stream*"
        ],
        data_stream={},
        priority=500,
        template={
            "lifecycle": {
                "data_retention": "7d"
            }
        },
        meta={
            "description": "Template with data stream lifecycle"
        },
    )
    print(resp)
    const response = await client.indices.putIndexTemplate({
      name: "template",
      index_patterns: ["my-data-stream*"],
      data_stream: {},
      priority: 500,
      template: {
        lifecycle: {
          data_retention: "7d",
        },
      },
      _meta: {
        description: "Template with data stream lifecycle",
      },
    });
    console.log(response);
    PUT _index_template/template
    {
      "index_patterns": ["my-data-stream*"],
      "data_stream": { },
      "priority": 500,
      "template": {
        "lifecycle": {
          "data_retention": "7d"
        }
      },
      "_meta": {
        "description": "Template with data stream lifecycle"
      }
    }

    — 对于现有数据流,可以通过 PUT 生命周期 API 来设置。

    resp = client.indices.put_data_lifecycle(
        name="my-data-stream",
        data_retention="30d",
    )
    print(resp)
    response = client.indices.put_data_lifecycle(
      name: 'my-data-stream',
      body: {
        data_retention: '30d'
      }
    )
    puts response
    const response = await client.indices.putDataLifecycle({
      name: "my-data-stream",
      data_retention: "30d",
    });
    console.log(response);
    PUT _data_stream/my-data-stream/_lifecycle
    {
      "data_retention": "30d" 
    }

    此数据流的保留时间设置为 30 天。

  • 通过设置集群级别的 data_streams.lifecycle.retention.default 和/或 data_streams.lifecycle.retention.max 来设置全局保留时间。您可以通过 更新集群设置 API 来设置。例如

    resp = client.cluster.put_settings(
        persistent={
            "data_streams.lifecycle.retention.default": "7d",
            "data_streams.lifecycle.retention.max": "90d"
        },
    )
    print(resp)
    const response = await client.cluster.putSettings({
      persistent: {
        "data_streams.lifecycle.retention.default": "7d",
        "data_streams.lifecycle.retention.max": "90d",
      },
    });
    console.log(response);
    PUT /_cluster/settings
    {
      "persistent" : {
        "data_streams.lifecycle.retention.default" : "7d",
        "data_streams.lifecycle.retention.max" : "90d"
      }
    }

如何计算有效保留时间?

编辑

有效保留时间按以下方式计算

  • 当定义了 default_retention 且数据流没有 data_retention 时,effective_retentiondefault_retention
  • 当定义了 data_retention 且如果定义了 max_retention,则其小于 max_retention 时,effective_retentiondata_retention
  • 当定义了 max_retention,且数据流要么没有 data_retention,要么其 data_retention 大于 max_retention 时,effective_retentionmax_retention

以上内容在以下示例中进行了演示

default_retention max_retention data_retention effective_retention 保留时间由以下因素决定

未设置

未设置

未设置

无限期

不适用

不相关

12 个月

30 天

30 天

data_retention

不相关

未设置

30 天

30 天

data_retention

30 天

12 个月

未设置

30 天

default_retention

30 天

30 天

未设置

30 天

default_retention

不相关

30 天

12 个月

30 天

max_retention

未设置

30 天

未设置

30 天

max_retention

考虑到我们的示例,如果我们检索 my-data-stream 的生命周期

resp = client.indices.get_data_lifecycle(
    name="my-data-stream",
)
print(resp)
response = client.indices.get_data_lifecycle(
  name: 'my-data-stream'
)
puts response
const response = await client.indices.getDataLifecycle({
  name: "my-data-stream",
});
console.log(response);
GET _data_stream/my-data-stream/_lifecycle

我们看到它将保持与用户配置的相同

{
  "global_retention" : {
    "max_retention" : "90d",                                   
    "default_retention" : "7d"                                 
  },
  "data_streams": [
    {
      "name": "my-data-stream",
      "lifecycle": {
        "enabled": true,
        "data_retention": "30d",                                
        "effective_retention": "30d",                           
        "retention_determined_by": "data_stream_configuration"  
      }
    }
  ]
}

集群中配置的最大保留时间。

集群中配置的默认保留时间。

此数据流请求的保留时间。

数据流生命周期在此数据流上应用的保留时间。

确定有效保留时间的配置。在本例中,它是 data_configuration,因为它小于 max_retention

如何应用有效保留时间?

编辑

保留时间作为数据流生命周期运行的最后一步应用于数据流的剩余后备索引。数据流生命周期将检索其 generation_time 长于有效保留时间段的后备索引,并将其删除。generation_time 仅适用于已滚动更新的后备索引,并且它是自后备索引滚动更新以来的时间,或者是可选地在 index.lifecycle.origination_date 设置中配置的时间。

我们使用 generation_time 而不是创建时间,因为这确保后备索引中的所有数据都已超过保留时间段。因此,保留时间不是数据被删除的确切时间,而是数据将被存储的最短时间。