数据流

如果用户正在将连续生成的时间序列数据(如日志、事件和指标)摄取到 UDB-SX 中,用户可能会遇到文档数量迅速增长且无需更新旧文档的场景。

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

数据流简化了这一过程,并强制采用最适合时间序列数据的设置,例如主要设计用于仅追加数据,并确保每个文档都有时间戳字段。

数据流在内部由多个后备索引组成。搜索请求会路由到所有后备索引,而索引请求会路由到最新的写索引。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 模板。当出现平局时,UDB-SX 选择具有更高优先级值的匹配索引模板。

步骤 2:创建数据流

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

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

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

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

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": "LhpVRV7XRP66m2OteznaRg"
        }
      ],
      "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": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": ".ds-logs-redis-000001",
        "_id": "aYBUupoBk4dTBbWdR2_h",
        "_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:在 UDB-SX 仪表板中管理数据流

要从 UDB-SX 仪表板管理数据流,请打开 UDB-SX 仪表板,选择 索引管理,选择 索引策略管理索引

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

当用户启用此开关时,用户会看到一个数据流多选下拉菜单,可以用来过滤数据流。 用户还会看到一个数据流列,显示包含索引的数据流名称。

data stream toggle

用户可以选择一个或多个数据流,并对它们应用 ISM 策略。用户也可以对任何单独的后备索引应用策略。

用户可以像对常规索引或索引别名一样对数据流执行可视化。

步骤 7:删除数据流

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

要删除数据流及其所有隐藏的后备索引:

DELETE _data_stream/<name_of_data_stream>

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

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

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