Elasticsearch中的data stream确定不了解一下?

135 阅读2分钟

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" }