通过使用阿里云Elasticsearch 7.10日志增强版Indexing Service系列,可以为您实现云托管写入加速和按流量付费(即您无需按集群峰值写入吞吐预留资源),能够极低成本实现海量时序日志分析。本文为您介绍如何基于Indexing Service系列实现数据流管理以及日志场景分析。

背景信息

在复杂业务场景下,海量服务器、物理机、Docker容器、移动设备和IoT传感器等设备中往往存在着结构分散、种类多样且规模庞大的各类指标和日志数据,而除了底层系统的各类指标和日志数据外,往往还存在着规模庞大的业务数据,例如用户行为、行车轨迹等。当面对海量时序数据和日志数据写入出现性能瓶颈时,您可以根据业务需求选择使用阿里云Elasticsearch 7.10日志增强版Indexing Service系列,此功能基于读写分离架构以及写入按量付费的Serverless模式,实现了Elasticsearch集群的云端写入托管和降本提效的目标。

在阿里云Elasticsearch 7.10日志增强版Indexing Service系列中,推荐使用数据流管理,可以帮您实现跨多索引存储仅追加时间序列数据,为请求提供唯一的命名资源;并且您可以根据关联的索引模板和Rollover策略实现自动取消托管,从而达到云端托管数据的自动清理和成本优化。数据流管理非常适用于日志、事件、指标和其他连续生成数据的场景。除此之外,您还可以通过使用索引生命周期管理(ILM)定期管理后备索引,帮助您降低成本及开销。

Elasticsearch集群中既可以存在数据流(Data Stream),也可以存在独立索引(Index)对象。除系统索引不托管外,其他索引均默认开启云端托管功能。独立索引支持增、删、改、查操作,操作前需要您手动取消云端托管。为了帮助您更好的使用数据流管理云端托管索引,阿里云Elasticsearch控制台分别提供了数据流管理索引管理索引模板管理功能模块,通过白屏化的方式为您实现数据流一站式管理。

使用场景

本文通过将采集到的nginx服务日志数据,写入到阿里云Elasticsearch 7.10日志增强版Indexing Service系列实例中,通过数据流管理和索引生命周期管理,实现日志数据的分析和检索。

注意事项

  • 因为数据流写入依赖时间字段@timestamp,所以请确保写入数据中存在@timestamp字段的数据,否则数据流写入过程中会报错。如果源数据中没有@timestamp字段数据,您可以使用ingest pipeline指定_ingest.timestamp,获取元数据值,从而引入@timestamp字段数据。
  • Indexing Service提供了写入Serverless保护机制,因此使用前请参见使用限制,提前优化配置,以避免使用过程中出现不合规的情况。
  • Indexing Service日志增强版实例与用户集群进行数据同步时,依赖于apack/cube/metadata/sync任务(可通过GET _cat/tasks?v命令获取该任务信息),不建议手动清理该任务。如果被清理,请尽快使用POST /_cube/meta/sync命令恢复,否则会影响业务写入。

操作流程

  1. 步骤一:创建Indexing Service实例
    创建一个阿里云Elasticsearch 7.10日志增强版Indexing Service系列的实例。
  2. 步骤二:创建索引模板
    在使用数据流之前,需要创建索引模板,通过模板对数据流后备索引进行结构配置。
  3. 步骤三:创建数据流
    创建数据流并写入数据。
  4. 步骤四:管理托管索引
    对数据流或者独立索引进行云端托管管理。
  5. 步骤五:查看集群信息
    在节点可视化页面,查看集群当天写入的总流量以及写入托管总数量。
  6. 步骤六:分析日志
    在Kibana控制台中,查看基于Indexing Service实现的数据流管理的实时日志流和实时数据指标。

步骤一:创建Indexing Service实例

  1. 前往实例创建页面
  2. 根据页面提示,按照以下说明选择实例配置,完成购买。
    购买实例的具体操作请参见创建阿里云Elasticsearch实例。下表为购买页的部分参数说明,未提及的参数保持默认,详细信息请参见购买页面参数(增强版)
    参数 示例值 说明
    付费模式 按量付费
    • 按量付费:在前期程序研发或功能测试期间,建议购买按量付费实例进行测试。支持在控制台手动释放实例。
    • 包年包月:目前在购买包年包月实例时,可以享受优惠条件。购买后,支持5天内退余款。超过5天后,将不再支持退款。

      支持手动续费和自动续费,详细信息,请参见Elasticsearch续费。不支持在控制台手动释放实例。

    选择服务 日志增强版 仅阿里云Elasticsearch日志增强版7.10支持Indexing Service系列介绍。本文以7.10版本为例。
    系列 Indexing Service 阿里云Elasticsearch 7.10日志增强版Indexing Service提供云端托管能力,能够在低成本下,提高数据写入速度。
    场景初始化配置 日志场景 阿里云Elasticsearch 7.10日志增强版默认应用日志场景模板,使集群配置适配于日志场景。
    地域和可用区 华东1(杭州)

    杭州可用区I

    购买页仅显示日志增强版Indexing Service系列支持的地域和可用区。
    说明 建议您选择和云端其他业务相同的地域和可用区,提高业务的集中化管理。
    可用区数量 单可用区
    • 单可用区:普通部署模式,适用于非关键任务型工作(默认)。
    • 两个可用区:跨可用区容灾部署模式,适用于生产型工作。
    • 三个可用区:高可用部署模式,适用于具有更高可用性要求的生产型工作。
    写入Serverless资源 开启 日志增强版Indexing Service默认开启写入Serverless模块,开启后集群无写入计算压力,您可以减少数据节点的配置规格及数量,并通过OpenStore存储实现海量日志存储分析。

    写入Serverless模块按实际写入流量及托管存储空间进行按量计费,详情请参见Elasticsearch计费项

    查询集群资源 开启 当您配置集群资源时,可以按照查询业务要求配置冷、热节点资源,具体说明如下:
    • 写入云端托管场景下,当您查询集群无写入计算压力时,推荐使用冷数据节点配置,降低资源成本。
    • 如果您对日志数据查询时延有较高要求,可以对冷、热数据节点进行规划,选择规格合适的热数据节点。
  3. 提示开通成功后,单击管理控制台,进入阿里云Elasticsearch实例的控制台概览页面。
  4. 在左侧导航栏,单击Elasticsearch实例。在顶部菜单栏,选择资源组和地域,然后在实例列表页面查看创建成功的日志增强版Indexing Service实例。
    说明
    • 实例创建后,需要一段时间才能生效。时间长短与您的集群规格、数据结构和大小等相关,一般在小时级别。
    • 当实例的信息没有及时更新时,例如刚创建完成的实例状态显示失败,可在基本信息页面,单击刷新,手动刷新页面中的状态信息。

步骤二:创建索引模板

  1. 登录阿里云Elasticsearch控制台
  2. 进入目标实例。
    1. 在顶部菜单栏处,选择资源组和地域。
    2. 在左侧导航栏,单击Elasticsearch实例,然后在Elasticsearch实例中单击目标实例ID。
  3. 在左侧导航栏,选择配置与管理 > 索引管理中心
  4. 单击索引模板管理页签。
  5. 单击创建索引模板
  6. 可选:创建索引模板面板,参考下图配置索引生命周期策略。
    说明 如果您无需对数据流后备索引进行生命周期策略管理,单击跳过此步即可。
    配置索引生命周期策略
    部分参数说明如下。未提及参数请参考页面上的具体说明。
    参数 示例值 说明
    索引生命周期策略 新建索引生命周期策略
    • 新建索引生命周期策略:创建新的索引生命周期策略。
      说明 Indexing Service架构下,不支持在索引生命周期中自定义freeze。
    • 选择已有索引生命周期策略:集群中存在服务业务逻辑策略,点击下拉框选择即可。
    策略名称 nginx_policy 新建索引生命周期策略时,需要自定义输入;选择已有索引生命周期策略时,需要在下拉列表中选择集群中已存在的生命周期策略。
    删除时间 7天 设置索引保留多少天后会被自动删除。
    本步骤使用的命令示例如下。
    PUT /_ilm/policy/nginx_policy
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "30GB",
                "max_age": "1d",
                "max_docs": 1000000
              },
              "set_priority" : {
                "priority": 1000
              }
            }
          },
          "delete": {
            "min_age": "7d",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    以上新建的索引生命周期策略表示,当托管索引满足以下任意条件时,将触发滚动更新,生成新的后备索引,原索引保留7天后将自动删除:
    • 写入文件数超过1000000。
    • 索引大小达到30 GB。
    • 索引从创建开始满1天。
  7. 单击保存并下一步,配置索引模版信息。
    配置索引模板信息
    参数 示例值 说明
    模板名称 nginx_telplate 定义的模板名称。
    索引模式 nginx-* 定义索引模式,使用通配符(*)表达式匹配数据流及索引名称,不允许使用空格和字符\/?"<>|
    创建数据流 开启 开启数据流模式。如果未开启,索引模式无法生成数据流。详细信息,请参见Data stream
    优先级 100 定义模板优先级,数值越大,优先级越高。
    索引生命周期策略 nginx_policy 只能引用一个索引生命周期策略。
    内容模板配置 Settings配置如下:
    {
       "index.number_of_replicas": "1",
       "index.number_of_shards": "6",
       "index.refresh_interval": "5s"
    }
    配置索引SettingsMappingsAliases组合内容模板
    注意
    • 写入到数据流中的每个文档都要求包含一个@timestamp字段,建议在索引模板中为@timestamp字段指定映射。如果不指定,该字段会映射为Elasticsearch中的date或者date_nanos类型的字段。
    • 配置格式严格按照Elastic官方配置。
    本步骤使用的命令示例值如下:
    PUT /_index_template/nginx_telplate
    {
      "index_patterns": [ "nginx-*" ],
      "data_stream": { },
      "template": {
        "settings": {
          "index.number_of_replicas": "1",
          "index.number_of_shards": "6",
          "index.refresh_interval": "5s",
          "index.lifecycle.name": "nginx_policy",
          "index.apack.cube.following_index": true
        }
      },
      "priority": 100
    }
    注意
    • 通过命令创建模板时,务必将index.apack.cube.following_index设置为true。
    • 云端托管集群上index.refresh_interval参数已默认配置最优,手动配置不生效。如果需要通过手动配置index.refresh_interval生效,需要先取消云托管功能。
  8. 单击确认,索引模板列表中会显示您创建的模板。

步骤三:创建数据流

  1. 索引管理中心页面,单击数据流管理页签。
  2. 单击创建数据流
  3. 创建数据流面板,单击预览已有索引模板,根据对应的索引模板,输入可匹配索引模板的数据流名称。
    创建数据流

    本步骤使用的命令示例值如下。

    PUT /_data_stream/nginx-log
    注意
    • 创建数据流之前必须存在数据流可匹配的索引模板,该模板包含用于配置数据流的后备索引映射及设置。
    • 数据流名称支持以短划线(-)结尾,不支持通配符星号(*)。
  4. 单击确定,系统会自动生成数据流及后备索引。
    每个数据流创建成功后,都会自动生成一个统一格式的后备索引,格式如下。
    .ds-<data-stream>-<yyyy.MM.dd>-<generation>
    参数 说明
    .ds 隐藏索引名统一标识,数据流生成的后备索引名,默认均以.ds开头。
    <data-stream> 数据流名称。
    <yyyy.MM.dd> 后备索引创建日期。
    <generation> 每个数据流都会生成一个六位数,默认从000001开始的累积整数值,generation值更大的后备索引包含更多新数据。
  5. 写入数据,具体操作请参见最佳实践
    数据写入过程中,必须带@timestamp字段,否则写入失败。本场景采用filebeat+kafka+logstash架构将日志采集写入到Elasticsearch实例中,采集过程中会自动生成@timestamp字段。命令示例如下。
    POST /nginx-log/_doc/
    {
      "@timestamp": "2099-03-07T11:04:05.000Z",
      "user": {
        "id": "vlb44hny"
      },
      "message": "Login attempt failed"
    }

步骤四:管理托管索引

  1. 索引管理中心页面,单击索引管理页签,查看处于云托管状态的索引。
    管理托管索引
    参数 说明
    仅查看托管中的索引 系统默认展示集群中的所有索引(不包括系统索引),选择仅查看托管中的索引后,系统仅展示托管中的索引,帮助您快速获取处于托管的数据。
    云端托管索引总大小 当前时刻,正处于云端写入托管中的索引总大小。
    注意 云端托管索引总大小为实时变化数值,不是历史索引总大小。
    索引个数 当前时刻,正处于云端写入托管中的索引总个数。 该数值为当前系统中的实时数值。
    注意 索引个数为实时变化数值,不是历史索引总个数。
    写入托管状态
    • 开启:该索引的云端写入托管处于开启状态。默认开启。
    • 关闭:取消该索引的云端写入托管。支持手动关闭,关闭后不支持开启。
    说明
    • 手动关闭某一索引的云端写入托管,数据将直接写入用户集群中。请在关闭前确认该索引是否持续有数据写入,以及用户集群负载情况,否则可能出现用户集群负载较高风险。
    • Indexing Service按照写入托管索引总大小和写入流量进行按量计费,业务上建议使用数据流(Data Stream)和索引生命周期管理(ILM)滚动策略实现云端托管空间最优化。
    • Indexing Service场景,索引处于托管状态,不兼容ILM Action中的shrink操作,建议ILM取消shrink配置或取消托管后再执行shrink操作,详细信息请参见ILM-shrink
    • 在独立索引的云端写入托管过程中,索引数据会全量存储在云托管服务Indexing Service中,将会增加云托管费用。请根据业务使用场景(如索引是否仍有数据写入)评估是否需要手动关闭该索引的写入托管。
    说明 由于数据流nginx-log配置了索引滚动策略,所以在云托管服务上,每次仅保存最新生成的后备索引(本场景中的.ds-nginx-log-2021.04.26-000004),旧的后备索引会自动从云托管上关闭。
  2. 取消索引托管。
    独立索引或未设置滚动策略的索引将一直在云托管服务保存,需要手动关闭。关闭后,对应索引的写入托管状态会处于关闭状态。关闭独立索引
    注意
    • 取消云托管后,无法再次开启云端Indexing Service写入托管功能。
    • Elasticsearch集群中既可以存在数据流(Data Stream),又可以存在独立索引(Index)对象,除系统索引不托管外,其他索引均默认开启托管功能。
    • 您可以通过Indexing Service API获取更多Indexing Service托管集群信息。
    1. 索引管理页签中,单击对应索引右侧写入托管状态列下的开启开关。
    2. 取消托管弹框中,单击确认
      本步骤对应的命令示例如下。
      POST /.ds-nginx-log-xxx/_cube/unfollow

步骤五:查看集群信息

  1. 进入节点可视化页面,查看写入Indexing Service实时写入流量和数据量信息。
  2. Indexing Service区域,单击当天写入总流量,即可查看每小时平均写入吞吐量的曲线图。
    每小时写入平均吞吐量
    说明 Indexing Service写入总流量监控为非实时整点展示的静态趋势监控图,监控数据展示延时最长为1小时。例如在14:00~14:59间写入的总流量,需要等到15:10后,在监控页面的14:00处获取。
  3. 单击查看监控详情,将跳转至Grafana监控展示更详细的监控数据。
    注意 Grafana的登录名和密码请从高级监控报警获取。
  4. Indexing Service页面,单击写入托管总数据量,即可查看当天写入托管总数据量
    当天写入托管总数据量
    说明 Indexing Service写入总流量监控为非实时整点展示的静态趋势监控图,监控数据展示延时最长为1小时,例如在14:00~14:59间写入的总数据量,需要等到15:10后,在监控页面的14:00处获取。

步骤六:分析日志

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 7.10.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 创建索引模板。
    1. 单击左上角的进入kibana
    2. 在左侧导航栏,选择Management > Stack Management
    3. Stack Management页面的Kibana区域,单击Index Patterns
    4. 单击Create index pattern
    5. Create index pattern页面的Index pattern name文本框中,输入索引模板名称。
      创建索引模板
      说明 Index pattern name不仅可以指定为数据流名称,也可以指定为后备索引名称。
  3. 设置Settings
    1. 单击左上角进入kibana
    2. 在左侧导航栏,选择Observability > Logs
    3. Logs页面,单击Settings页签。
    4. Log indices文本框中,输入数据流名称。
      本文以nginx-log数据流名称为例,其他字段的默认配置符合数据流数据要求,可不修改。设置settings
    5. 在右下角,单击Apply
  4. 获取实时日志流数据。
    1. Logs页面,单击Stream页签。
    2. 在页面右侧,单击Stream live
    3. Stream页签中,查看获取到的实时数据流。
      实时数据流
  5. 获取实时数据指标。
    1. 单击左上角进入kibana
    2. 在左侧导航栏,选择Kibana > Discover
    3. Discover页面,选择对应索引,获取该索引的实时数据指标。
      实时数据流指标

更多Kibana日志分析功能请参见Kibana Guide

常见问题

Q:为Indexing Service实例中的写入托管索引配置refresh、merge等写入参数,是否会生效?

A:不会生效。Indexing Service实例中的写入托管索引已使用默认写入参数配置,用户侧配置不生效。默认写入参数配置如下。
"index.merge.policy.max_merged_segment" : "1024mb",
"index.refresh_interval" : "3s",
"index.translog.durability" : "async",
"index.translog.flush_threshold_size" : "2gb",
"index.translog.sync_interval" : "100s"