Data Stream

data stream 允许跨多个仅追加的时间序列索引,同时为请求提供单个命名资源。数据流非常适合日志、事件、指标和其他持续生成的数据。

为什么需要 data stream?

单纯 ILM 方案管理时间序列索引较繁琐,需要使用别名,多次操作。使用 data stream 可以简化操作

适合场景

数据流非常适合日志、事件、指标和其他持续生成的数据。

符合如下特点:

  • 数据极少更新
  • 时间序列数据

优点

  1. 管理时序数据更方便
  2. 不需要使用别名,避免 rollover 别名滚动出错问题
  3. 删除 index,data stream 都不会影响 ds 设置,重新写入即可

缺点

需要@timestamp时间字段,无法对后备索引进行 clone, close, freeze, shrink 和 split ,不适合频繁删除、更新的业务场景。

data stream 不支持单条删除或单条更新数据,只支持:update_by_query 以及 delete_by_query

索引名为固定格式:.ds-<data-stream>-<yyyy.MM.dd>-<generation>

使用

要使用 data stream 需要进行至少两步操作:

第一步:创建 ILM

PUT _ilm/policy/my-lifecycle-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"set_priority": {
"priority": 100
},
"rollover": {
"max_primary_shard_size": "25gb",
"max_age": "1d"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {
"delete_searchable_snapshot": true
}
}
}
}
}
}

第二步:创建 template

可以单独使用 index template,或者使用 component templates+index template

这里demo仅使用index template

PUT _index_template/my-index-template
{
"index_patterns": [
"my-data-stream*"
],
"data_stream": {},
"template": {
"settings": {
"index": {
"lifecycle": {
"name": "my-lifecycle-policy"
},
"routing": {
"allocation": {
"total_shards_per_node": "3"
}
},
"mapping": {
"nested_fields": {
"limit": "10"
},
"nested_objects": {
"limit": "100"
},
"depth": {
"limit": "5"
},
"total_fields": {
"limit": "100"
}
},
"number_of_shards": "1",
"number_of_replicas": "1"
}
},
"mappings": {
"dynamic": "true",
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"date_detection": false,
"properties": {
"@timestamp": {
"type": "date"
},
"flag": {
"type": "boolean"
},
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"moreInfo": {
"type": "object",
"enabled": false
}
}
}
},
"priority": 500
}

第三步:创建 data stream(此步可以省略)

直接往 template 定义的 index patterns 中写入数据就可以完成自动创建 data stream。

或者使用创建 api

PUT _data_stream/my-data-stream

注意:使用 bulk 写入数据的时候,不要使用index,使用create。例如:

PUT my-data-stream/_bulk
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:21:15.000Z", "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736" }
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:25:42.000Z", "message": "192.0.2.255 - - [06/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" }