对于时序数据场景,随着时间的积累数据量会越来越大。如果一直保留详细数据,会导致存储成本线性增长,此时您可以通过Elasticsearch(简称ES)的RollUp机制节省数据存储成本。本文以汇总Logstash流量为例介绍RollUp的使用方法。

前提条件

  • 确保您已拥有manage或manage_rollup权限。

    使用RollUp必须要有manage或manage_rollup权限,详情请参见Security Privileges

  • 已创建阿里云ES实例。
    详情请参见 创建阿里云Elasticsearch实例,本文使用的实例版本为通用商业版7.4。
    说明 下文中的RollUp命令适用于ES 7.4版本,6.x版本的命令请参见 RollUp Job

背景信息

本文的需求场景如下:
  • 每15分钟定时汇总整小时内instanceId的networkoutTraffic、networkinTraffic流量。
  • 通过Kibana大图展示指定instanceId的入口流量和出口流量。
本文以monitordata-logstash-sls-*为前缀的索引为例,该索引以每天创建一个索引的规则切分索引。索引的Mapping格式如下。
"monitordata-logstash-sls-2020-04-05" : {
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        },
        "__source__" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "disk_type" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "host" : {
          "type" : "keyword"
        },
        "instanceId" : {
          "type" : "keyword"
        },
        "metricName" : {
          "type" : "keyword"
        },
        "monitor_type" : {
          "type" : "keyword"
        },
        "networkinTraffic" : {
          "type" : "double"
        },
        "networkoutTraffic" : {
          "type" : "double"
        },
        "node_spec" : {
          "type" : "keyword"
        },
        "node_stats_node_master" : {
          "type" : "keyword"
        },
        "resource_uid" : {
          "type" : "keyword"
        }
      }
    }
  }
}
说明 本文中的命令均可在Kibana控制台上执行,详情请参见 登录Kibana控制台

操作流程

  1. 步骤一:创建RollUp作业
  2. 步骤二:启动RollUp作业并查看作业信息
  3. 步骤三:查询汇总索引的数据
  4. 步骤四:创建Rollup索引模式
  5. 步骤五:创建Kibana流量监控大图
  6. 步骤六:创建Kibana流量监控仪表板

步骤一:创建RollUp作业

RollUp作业配置包含该作业如何运行、何时索引文档及将来对汇总索引执行哪些查询的详情信息。以下示例通过 PUT _rollup/job命令定义1小时内汇总的作业。
PUT _rollup/job/ls-monitordata-sls-1h-job1
{
    "index_pattern": "monitordata-logstash-sls-*",
    "rollup_index": "monitordata-logstash-rollup-1h-1",
    "cron": "0 */15 * * * ?",
    "page_size" :1000,
    "groups" : {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "1h"
      },
      "terms": {
        "fields": ["instanceId"]
      }
    },
    "metrics": [
        {
            "field": "networkoutTraffic",
            "metrics": ["sum"]
        },
        {
            "field": "networkinTraffic",
            "metrics": ["sum"]
        }
    ]
}
参数 是否必选 类型 说明
index_pattern string 汇总的索引或索引模式。支持通配符(*)。
rollup_index string 汇总结果的索引。不支持通配符,必须是一个完整的名称。
cron string 执行汇总作业任务的时间间隔。与汇总数据的时间间隔无关。
page_size integer 汇总索引每次迭代中处理的存储桶的结果数。值越大,执行越快,但是处理过程中需要更多的内存。
groups object 为汇总作业定义分组字段和聚合。
date_histogram object 将date字段汇总到基于时间的存储桶中。
field string 需要汇总的date字段。
fixed_interval time units 数据汇总的时间间隔。例如设置为1h,表示按照1小时汇总field指定的时间字段。该参数定义了数据能够聚合的最小时间间隔。
terms object 无。
fields string 定义terms字段集。此数组字段可以是keyword也可以是numerics类型,无顺序要求。
metrics object 无。
field string 定义需要采集的指标的字段。例如以上示例是分别对networkoutTraffic、networkinTraffic进行采集。
metrics array 定义聚合算子。设置为sum,表示对networkinTraffic进行sum运算。仅支持min、max、sum、average、value count。
说明 └表示子参数。
更多参数说明请参见 Create rollup jobs API。配置参数时,请注意:
  • index_pattern中指定通配符时,请确保不会匹配到rollup_index指定的汇总索引名,否则报错。
  • 由于汇总索引的Mapping是object类型,请确保集群中不存在与汇总索引相匹配的索引模板,否则报错。
  • 字段分组聚合仅支持Date Histogram aggregation、Histogram aggregation、Terms aggregation,详细限制说明请参见Rollup aggregation limitations

步骤二:启动RollUp作业并查看作业信息

  1. 启动RollUp作业。
    POST _rollup/job/ls-monitordata-sls-1h-job1/_start
  2. 查看RollUp作业的配置、统计和状态信息。
    GET _rollup/job/ls-monitordata-sls-1h-job1/

    更多详细说明请参见Get rollup jobs API

    执行成功后,返回如下结果。
    {
         ........
          "status" : {
            "job_state" : "indexing",
            "current_position" : {
              "@timestamp.date_histogram" : 1586775600000,
              "instanceId.terms" : "ls-cn-ddddez****"
            },
            "upgraded_doc_id" : true
          },
          "stats" : {
            "pages_processed" : 3,
            "documents_processed" : 11472500,
            "rollups_indexed" : 3000,
            "trigger_count" : 1,
            "index_time_in_ms" : 766,
            "index_total" : 3,
            "index_failures" : 0,
            "search_time_in_ms" : 68559,
            "search_total" : 3,
            "search_failures" : 0
          }
    }

步骤三:查询汇总索引的数据

在Rollup内部,由于汇总文档使用的文档结构和原始数据不同,Rollup查询端口会将标准查询DSL重写为与汇总文档匹配的格式,然后获取响应并将其重写回给原始查询的客户端所期望的格式。

  1. 使用match_all获取汇总索引的所有数据。
    GET monitordata-logstash-rollup-1h-1/_search
    {
      "query": {
        "match_all": {}
      }
    }
    • 查询仅能指定一个汇总索引,即不支持模糊匹配。对实时索引数据查询没有限制要求,查询可指定多个索引。
    • 查询仅支持Term、Terms、Range query、MatchAll query、Any compound query(Boolean、Boosting、ConstantScore等),更多限制请参见Rollup search limitations
  2. 使用_rollup_search聚合出口流量总数据。
    GET /monitordata-logstash-rollup-1h-1/_rollup_search
    {
        "size": 0,
        "aggregations": {
            "sum_temperature": {
                "sum": {
                    "field": "networkoutTraffic"
                }
            }
        }
    }
    _rollup_search支持常规的Search API特性子集:
    _rollup_search不可用功能包括:
    • size:由于汇总适用于聚合数据,无法返回查询结果,因此将size设置为0或者完全省略。
    • 不支持highlighter、suggestors、post_filter、profile、explain等参数。

步骤四:创建Rollup索引模式

  1. 登录Kibana控制台。
    登录控制台的具体步骤请参见 登录Kibana控制台
  2. 在左侧导航栏,单击Management图标。
    Management图标
  3. Kibana区域,单击Index Patterns
  4. 可选:关闭About index patterns页面。
    说明 如果您不是首次创建索引模式,可忽略此步骤。
  5. 单击Create index pattern > Rollup index pattern
    Rollup index pattern
  6. 输入索引模式名称(monitordata-logstash-rollup-1h-1),然后单击Next step
    输入索引名称
  7. Time Filter field name列表中,选择@timestamp
    选择时间过滤字段
  8. 单击Create index pattern

步骤五:创建Kibana流量监控大图

在Kibana上分别配置汇总索引的入口流量及出口流量监控大图,操作步骤如下:

  1. 登录Kibana控制台。
    登录控制台的具体步骤请参见 登录Kibana控制台
  2. 创建Line曲线图。
    1. 在左侧导航栏,单击Visualize图标。
      Visualize图标
    2. 单击Create new visualization
    3. New Visualization对话框中,单击Line
    4. 在索引模式列表中,单击选择已创建的Rollup索引模式。
  3. 设置MetricsBuckets
    1. Metrics区域,单击Y-axi下拉箭头
    2. 设置Y-axis参数。
      Y-axis参数
      参数 说明
      Aggregation 选择Sum
      Field 选择networkinTraffic或networkoutTraffic。
      Custom label 自定义Y轴标签。
    3. Buckets区域,单击Add > X-axis
    4. 设置X-axis参数。
      设置x-axis参数
      参数 说明
      Aggregation 设置为步骤一:创建RollUp作业时,group中定义的date_histogram
      Field 选择@timestamp
      Minimum interval 默认为RollUp作业中定义的聚合时间粒度。必须是汇总配置间隔的整数倍,例如2h、3h等。
    5. 单击Apply Changes图标图标。
  4. 在顶部菜单栏,单击Save
    配置成功后,可看到如下结果。 Line图
  5. 使用同样的方式创建Gauge图。
    创建Gauge图
  6. 参考下图配置Gauge图。
    配置Guage图

步骤六:创建Kibana流量监控仪表板

  1. 在Kibana控制台中,单击左侧导航栏的Dashboard图标。
    Dashboard图标
  2. 单击Create new dashboard
  3. 在顶部菜单栏,单击Add
  4. Add panels页面,单击选择Visualize中配置的可视化大图。
  5. 关闭Add panels页面,在顶部菜单栏,单击Save
  6. 修改仪表板名称,单击Confirm Save
    仪表板保存成功后,可查看仪表板展示结果。 查看Kibana仪表板
  7. 单击+ Add filter,选择一个过滤项并配置过滤条件,单击Save
    本文使用term过滤项,指定查询某个instance的流量,最终结果如下。 展示某个instance的流量