You need to enable JavaScript to run this app.
导航
利用 Data Streams 和 ISM 实现时序数据管理
最近更新时间:2024.07.04 10:22:16首次发布时间:2024.06.06 10:08:12

本文以日志数据为例,介绍如何通过 OpenSearch 的 Data Streams 和 ISM 功能轻松实现时序数据的管理。

背景信息

在时序数据场景(例如日志数据)中,为了防止单个索引大小无限增长,常见的数据管理方法是将数据按天存储,每天通过 Rollover 切换到一个新的写索引,同时通过别名保证旧索引能被检索。这个数据管理流程包含了众多步骤,包括创建索引别名、创建 Rollover 数据管理策略、创建初始化索引、设置可写索引等步骤,操作流程比较繁琐。
Data Streams 就是为时序数据管理场景而设计的功能,极大地简化了数据管理的配置步骤。本文以 nginx-log-generator 工具模拟生成的 Nginx 日志数据为例,介绍如何通过 OpenSearch 的 Data Streams 和 ISM 的功能组合来简化数据管理工作。

注意事项

  • 本文介绍的时序数据管理办法目前仅适用于 OpenSearch 实例。
  • 索引模板和 ISM 策略只能针对未创建的数据流自动关联生效,也不支持直接将一个已经存在的索引转成 Data Stream,因此请先创建索引模板和 ISM 策略,再开始日志数据的写入。

步骤一:创建索引模板

  1. 通过公网访问 Dashboards。具体步骤,请参见公网访问 Kibana/Dashboards

  2. 在页面左侧菜单,选择 Management > Dev Tools,进入开发工具页面。

  3. 创建索引模板。
    创建名称为nginx-logs-template的索引模板。如果用户写入的索引名称是以 nginx-logs-开头,则系统会自动将其创建为数据流,同时创建对应的 backing index。

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

    说明

    数据流默认要求写入的索引带有@timestamp字段,如果想用其他字段名,可以在创建索引模板的时候显式指定。

    PUT /_index_template/nginx-logs-template
    {
        "index_patterns": [
            "nginx-logs-*"
        ],
        "data_stream": {
            "timestamp_field": {"name": "request_time"}
         },
        "priority": 100
    }
    

步骤二:创建 ISM 策略

  1. 在实例的 Dashboards 页面,进入 Management > Dev Tools 开发工具页面。
  2. 创建自动 Rollover 策略,并关联索引模板。
    创建 id 为rollover_nginx_logs的 ISM 策略,该策略会把一天前创建的索引自动 Rollover,并创建新的 backing index。
    PUT _plugins/_ism/policies/rollover_nginx_logs
    {
        "policy": {
            "description": "Rollover policy for nginx logs data stream",
            "default_state": "rollover",
            "states": [
                {
                    "name": "rollover",
                    "actions": [
                        {
                            "rollover": {
                                 "min_index_age": "1d"
                            }
                        }
                    ],
                    "transitions": []
                }
            ],
            "ism_template": {
                "index_patterns": [
                      "nginx-logs-*"
                ],
                "priority": 100
            }
        }
    }
    

步骤三:写入数据

您需要完成创建索引模板和 ISM 策略的操作后,您才可以开始写入数据。如果写入的索引名称匹配到nginx-logs-*模式,系统就会自动创建对应的 Data Stream 和写入索引。
本文选择通过 Logstash 的 OpenSearch Output插件 将 Nginx log 写入到 OpenSerach 实例中。Logstash 采集管道配置如下:

input {
    file {
        path => "/tmp/nginx.log"
        type => "nginx"
        start_position => "beginning"
    }
}

filter {
    grok {
        match => { "message" => ['%{IPORHOST:remote_addr} - - \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) \"%{DATA:referrer}\" \"%{DATA:agent}\"'] }
  }
}

output {
    opensearch {
        # 目标OpenSearch实例的访问地址。
        hosts => ["https://localhost:9200"]
        # 索引名称。
        index => "nginx-logs-devbox"
        action => "create"
        # 目标OpenSearch实例的鉴权信息。
        user => "XXXX"
        password => "XXXXX"
        # 是否仅用hosts配置项数组中的https地址进行请求。
        ssl => true
        # 当使用https连接实例时,是否验证实例的服务端证书。
        ssl_certificate_verification => false
    }
}

查看 ISM 策略执行记录

ISM 会把执行记录保存到索引.opendistro-ism-managed-index-history*中,您可以在 Dashboards 中像常规索引数据的可视化查询方法一样查询 ISM Policy 策略的历史执行记录。
图片

常见问题

如果您在使用 ISM 策略时碰见异常问题或存在疑问,可以查看开源文档ISM error prevention resolutions
如果仍然无法解决你的问题,您还可以通过提交工单进行咨询,详情请参见技术支持