Link Search Menu Expand Document Documentation Menu

数据流

如果您正在将连续生成的时间序列数据(例如日志、事件和指标)摄取到 OpenSearch 中,那么您很可能面临文档数量迅速增长且无需更新旧文档的场景。

管理时间序列数据的典型工作流程涉及多个步骤,例如创建滚动索引别名、定义写入索引以及为后台索引定义通用映射和设置。

数据流简化了此过程,并强制执行最适合时间序列数据的设置,例如主要为仅追加数据设计,并确保每个文档都包含一个时间戳字段。

数据流内部由多个后台索引组成。搜索请求被路由到所有后台索引,而索引请求则路由到最新的写入索引。ISM 策略允许您自动处理索引滚动或删除。

数据流入门

步骤 1:创建索引模板

要创建数据流,您首先需要创建一个索引模板,将一组索引配置为数据流。data_stream 对象表示它是一个数据流,而不是一个常规索引模板。索引模式与数据流的名称匹配。

PUT _index_template/logs-template
{
  "index_patterns": [
    "my-data-stream",
    "logs-*"
  ],
  "data_stream": {},
  "priority": 100
}

在这种情况下,每个摄取文档都必须有一个 @timestamp 字段。您还可以选择在 data_stream 对象中定义自己的自定义时间戳字段作为属性。您还可以在此处添加索引映射和其他设置,就像您对常规索引模板所做的那样。

PUT _index_template/logs-template-nginx
{
  "index_patterns": "logs-nginx",
  "data_stream": {
    "timestamp_field": {
      "name": "request_time"
    }
  },
  "priority": 200,
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  }
}

在这种情况下,logs-nginx 索引匹配 logs-templatelogs-template-nginx 模板。当出现冲突时,OpenSearch 会选择优先级值更高的匹配索引模板。

步骤 2:创建数据流

创建索引模板后,您可以创建数据流。您可以使用数据流 API 显式创建数据流。数据流 API 会初始化第一个后台索引。

PUT _data_stream/logs-redis
PUT _data_stream/logs-nginx

您也可以直接开始摄取数据,而无需创建数据流。

因为我们有一个带有 data_stream 对象的匹配索引模板,OpenSearch 会自动创建数据流。

POST logs-staging/_doc
{
  "message": "login attempt failed",
  "@timestamp": "2013-03-01T00:00:00"
}

要查看特定数据流的信息

GET _data_stream/logs-nginx

示例响应

{
  "data_streams" : [
    {
      "name" : "logs-nginx",
      "timestamp_field" : {
        "name" : "request_time"
      },
      "indices" : [
        {
          "index_name" : ".ds-logs-nginx-000001",
          "index_uuid" : "-VhmuhrQQ6ipYCmBhn6vLw"
        }
      ],
      "generation" : 1,
      "status" : "GREEN",
      "template" : "logs-template-nginx"
    }
  ]
}

您可以查看时间戳字段的名称、后台索引列表以及用于创建数据流的模板。您还可以查看数据流的健康状况,它表示其所有后台索引中的最低状态。

要查看有关数据流的更多洞察信息,请使用 _stats 端点

GET _data_stream/logs-nginx/_stats

示例响应

{
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "data_stream_count" : 1,
  "backing_indices" : 1,
  "total_store_size_bytes" : 208,
  "data_streams" : [
    {
      "data_stream" : "logs-nginx",
      "backing_indices" : 1,
      "store_size_bytes" : 208,
      "maximum_timestamp" : 0
    }
  ]
}

要查看所有数据流的信息,请使用以下请求

GET _data_stream

步骤 3:将数据摄取到数据流中

要将数据摄取到数据流中,您可以使用常规索引 API。请确保您索引的每个文档都包含一个时间戳字段。如果您尝试摄取一个没有时间戳字段的文档,将会收到错误。

POST logs-redis/_doc
{
  "message": "login attempt",
  "@timestamp": "2013-03-01T00:00:00"
}

步骤 4:搜索数据流

您可以像搜索常规索引或索引别名一样搜索数据流。搜索操作适用于所有后台索引(流中存在的所有数据)。

GET logs-redis/_search
{
  "query": {
    "match": {
      "message": "login"
    }
  }
}

示例响应

{
  "took" : 514,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : ".ds-logs-redis-000001",
        "_type" : "_doc",
        "_id" : "-rhVmXoBL6BAVWH3mMpC",
        "_score" : 0.2876821,
        "_source" : {
          "message" : "login attempt",
          "@timestamp" : "2013-03-01T00:00:00"
        }
      }
    ]
  }
}

步骤 5:滚动数据流

滚动操作会创建一个新的后台索引,该索引将成为数据流新的写入索引。

要对数据流执行手动滚动操作

POST logs-redis/_rollover

示例响应

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "old_index" : ".ds-logs-redis-000001",
  "new_index" : ".ds-logs-redis-000002",
  "rolled_over" : true,
  "dry_run" : false,
  "conditions" : { }
}

如果您现在对 logs-redis 数据流执行 GET 操作,您会看到生成 ID 从 1 增加到 2。

您还可以设置索引状态管理 (ISM) 策略来自动化数据流的滚动过程。ISM 策略在后台索引创建时应用于它们。当您将策略与数据流关联时,它只影响该数据流未来的后台索引。

您也不需要提供 rollover_alias 设置,因为 ISM 策略会从后台索引中推断出此信息。

步骤 6:在 OpenSearch Dashboards 中管理数据流

要从 OpenSearch Dashboards 管理数据流,请打开 OpenSearch Dashboards,选择 Index Management,然后选择 IndicesPolicy managed indices

您会看到一个数据流切换开关,您可以使用它来显示或隐藏属于某个数据流的索引。

启用此开关后,您会看到一个数据流多选下拉菜单,可用于筛选数据流。您还会看到一个数据流列,显示索引所在数据流的名称。

data stream toggle

您可以选择一个或多个数据流并对其应用 ISM 策略。您还可以对任何单个后台索引应用策略。

您可以像在常规索引或索引别名上一样,对数据流执行可视化操作。

步骤 7:删除数据流

删除操作首先删除数据流的后台索引,然后删除数据流本身。

要删除数据流及其所有隐藏后台索引

DELETE _data_stream/<name_of_data_stream>

您可以使用通配符删除多个数据流。

我们建议使用 ISM 策略从数据流中删除数据。

您还可以使用异步搜索SQLPPL 直接查询您的数据流。您还可以使用安全插件为数据流名称定义精细权限。