数据流
如果您正在将连续生成的时间序列数据(例如日志、事件和指标)摄取到 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-template
和 logs-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,然后选择 Indices 或 Policy managed indices。
您会看到一个数据流切换开关,您可以使用它来显示或隐藏属于某个数据流的索引。
启用此开关后,您会看到一个数据流多选下拉菜单,可用于筛选数据流。您还会看到一个数据流列,显示索引所在数据流的名称。
您可以选择一个或多个数据流并对其应用 ISM 策略。您还可以对任何单个后台索引应用策略。
您可以像在常规索引或索引别名上一样,对数据流执行可视化操作。
步骤 7:删除数据流
删除操作首先删除数据流的后台索引,然后删除数据流本身。
要删除数据流及其所有隐藏后台索引
DELETE _data_stream/<name_of_data_stream>
您可以使用通配符删除多个数据流。
我们建议使用 ISM 策略从数据流中删除数据。
您还可以使用异步搜索、SQL 和 PPL 直接查询您的数据流。您还可以使用安全插件为数据流名称定义精细权限。