通过OpenStore自定义冷热存储实现海量数据存储

OpenStore自定义冷热存储引擎是阿里云Elasticsearch针对日志场景自研的弹性、高效、低成本的日志存储引擎。本文介绍使用OpenStore自定义冷热存储实现海量数据存储的方法。

背景信息

在日志全观测场景下,通常因为业务场景或监管需求,需要长时间存储数据或归档审计。在使用开源Elasticsearch的过程中,需要进行集群冷热数据分离,将30天或者更长时间的数据通过集群快照的方式存储在其他存储介质上,例如对象存储OSS等。该方式虽然能够实现长期日志数据归档,但是存储后不能直接进行查询,查询前需要调用相关API把快照信息恢复到集群中,等待快照中的索引初始化完成后再进行查询,面临着查询复杂度大、长时间存储成本高的问题。

OpenStore存储引擎结合Indexing Service写入托管服务,满足用户在日志场景下低成本的高并发写入及长期数据存储需求。

使用限制

使用OpenStore存储时,存在以下使用限制。

类别

限制说明

是否支持新购

OpenStore自定义冷热存储已不支持新购。

地域

仅开放以下地域(具体以控制台为准):

  • 华东2(上海)、华北3(张家口)、华东1(杭州)、华南 1(深圳)、华北 2(北京)

  • 新加坡

实例版本

仅7.10版本实例支持开启OpenStore自定义冷热存储。

实例规格

  • 数据节点规格族为冷热共享计算型,数据节点仅支持16核64 GB规格。

  • 数据节点规格族为云盘型,冷数据节点仅支持16核64 GB规格,数据节点可按需购买。

实例存储容量

单节点最大存储数据容量为30 TB。

说明

如果您有更大的单节点存储需求,请提交工单申请,最大支持50 TB。

shard副本数

开启OpenStore自定义冷热存储,冷数据存储至OpenStore时shard副本数默认为0,数据的可靠性将由底层存储保证。

重要

如果将OpenStore自定义冷热存储的索引副本数设置为1,索引将处于yellow状态,因此不建议手动设置副本,保持默认值即可。

索引模板

开启OpenStore自定义冷热存储,集群会默认提供模板openstore-index-template,模板默认使用openstore_default_ilm_policy策略。详细信息请参见通过OpenStore自定义冷热存储实现海量数据存储

说明

手动删除OpenStore存储索引时,需要将索引及索引对应的别名一起删除才可删除成功。

索引生命周期配置

不支持在索引生命周期中自定义freeze。

查询限制

  • 以下Agg查询类型仅内核1.9及以上版本支持,其他内核版本不支持。

    PercentilesAggregation、PercentileRanksAggregation、SamplerAggregation、DiversifiedAggregation、SignificantTextAggregation、GeoDistanceAggregation、GeoHashGridAggregation、GeoTileGridAggregation、GeoBoundsAggregation、GeoCentroidAggregation、ScriptedMetricAggregation。

  • 以下Agg查询类型暂不支持,不区分内核版本。

    FiltersAggregation、AdjacencyMatrixAggregation、ReverseNestedAggregation、CompositeAggregation。

前提条件

存在已购买的开启OpenStore自定义冷热存储的7.10版本实例。

操作步骤

步骤一:管理OpenStore索引模板

如果您的业务存在频繁的Put Mapping操作,为避免消耗大量计算资源,对托管服务稳定性造成影响,建议您写数据前提前定义索引模板,降低Put Mapping操作影响集群稳定性。

方法一:通过控制台管理索引模板

  1. 进入已开启OpenStore存储的目标实例,在左侧导航栏选择配置与管理 > 索引管理中心

  2. 单击索引模板管理页签。

  3. 索引模板管理页面,管理您集群中的索引模板。

    阿里云Elasticsearch为您提供了OpenStore定制索引模板,您可以查看并修改OpenStore定制的索引模板和生命周期策略,将定制模板快速应用到您的业务索引上。您也可以创建自定义的索引模板,并配置生命周期策略。具体说明如下:

    说明

    由于OpenStore索引数据默认写入热节点,达到ILM周期后会迁移到OpenStore存储,因此不支持在OpenStore索引或模板中配置index.routing.allocation.require.box_type参数。

    • 查看并修改OpenStore定制的索引模板和生命周期策略:

      1. 单击索引模板或生命周期策略名称,查看OpenStore定制的索引模板和生命周期策略。

        OpenStore自定义冷热存储对应的索引模板名称为openstore-index-template,生命周期策略名称为openstore_default_ilm_policy。

      2. 单击索引模板或生命周期策略右侧的修改,修改定制的索引模板和生命周期策略。

        定制化的OpenStore模板默认仅对log-service-*索引进行管理。修改时可将索引模式指定为业务索引名称,并开启创建数据流,定制模板即可快速应用到业务索引上。

        image..png

      3. 单击确认

    • 创建自定义索引模板,并配置生命周期策略:

      1. 单击创建索引模板

      2. 索引生命周期策略配置向导中,参考下图配置索引生命周期策略。配置生命周期策略

        详细参数说明,请参见创建索引模板

        说明
        • Indexing Service实例建议开启滚动更新,保证数据滚动更新后自动取消云托管能力。

        • 当OpenStore存储类型为自定义冷热存储时,系统默认开启冷阶段OpenStore存储,如果您的索引需要进行冷热生命周期配置,请勿关闭冷阶段OpenStore存储开关。

        • 取消托管时间默认为3天,3天后自动退出Indexing Service写入托管服务,减少计费开销。如果您设置的时长超过冷阶段或删除阶段的开始时间,索引进入相应阶段后会自动取消托管。取消托管后索引变成只读,索引将不再通过Indexing Service进行写入加速。

      3. 单击保存并下一步,在索引模板配置向导中,参考下图配置索引模板。

        image..png

        详细参数说明,请参见创建索引模板

        说明

        Indexing Service实例开启创建数据流后,才可在数据流管理页面管理写入的索引。详细信息请参见步骤二:将数据流写入OpenStore索引

      4. 单击确认

方法二:通过API管理索引模板

从Elasticsearch 7.10版本开始,索引模板默认会使用优先级最高的配置,不会自动组合两个索引模板内的配置。由于集群中已经存在默认的OpenStore索引模板,如果您需要再通过API自定义索引模板,而这两个模板的配置不会自动组合,因此可能会影响OpenStore功能的正常使用,所以建议您使用Elasticsearch组合模板进行配置。

说明

阿里云Elasticsearch不支持通过Kibana Stack Management管理OpenStore内容模板及策略,建议使用API操作或控制台索引管理中心进行配置管理。

创建自定义冷热分离存储索引模板

开启OpenStore自定义冷热存储后,集群中会默认添加OpenStore的组合模板component-openstore-index-template。在自定义模板时,您只需要在脚本的composed_of参数中配置依赖的组合模板,即可使用OpenStore存储。自定义索引模板的示例脚本如下。

说明
  • 本文中的脚本均可在Kibana控制台上运行,具体操作请参见登录Kibana控制台

  • 以下脚本中的...表示省略部分配置。实际运行时,需要删除脚本中的注释信息。

  • 如果您使用了自定义的组合模板和策略,请确保索引模板中配置的组合模板名称与您自定义的组合模板名称保持一致,即composed_of参数值配置为您自定义的组合模板名称。

PUT _index_template/template_instance-sls
{
  "index_patterns" : [
    "-.*"
  ],
  "template" : {
    "settings" : {
            ...
    },
    "mappings" : {
            ...
    }
  },
  # 如果您使用了自定义的组合模板和策略,此处需要配置为您自定义的组合模板名称。
  "composed_of" : ["component-openstore-index-template"],
  "priority" : 100
}

获取默认冷热分离存储策略

开启OpenStore存储的实例默认提供其依赖的内容模板和生命周期策略,您可以通过对应命令获取配置信息:

  • 通过GET _component_template/component-openstore-index-template命令获取内容模板

    {
      "component_templates" : [
        {
          "name" : "component-openstore-index-template",
          "component_template" : {
            "template" : {
              "settings" : {
                "index" : {
                  "lifecycle" : {
                    "name" : "openstore_default_ilm_policy",
                    "rollover_alias" : ""
                  },
                  "apack" : {
                    "cube" : {
                      "following_index" : "true"
                    }
                  },
                  "codec" : "OpenIndex",
                  "refresh_interval" : "1s"
                }
              }
            }
          }
        }
      ]
    }
  • 通过GET _ilm/policy/openstore_default_ilm_policy命令获取生命周期策略

    {
      "openstore_default_ilm_policy" : {
        "version" : 2,
        "modified_date" : "2022-03-16T06:33:42.802Z",
        "policy" : {
          "phases" : {
            "hot" : {
              "min_age" : "0s",
              "actions" : { }
            },
            "cold" : {
              "min_age" : "3d",
              "actions" : {
                "openstore" : {
                  "openstore_repository" : "aliyun_auto_snapshot",
                  "force_merge_index" : true,
                  "user_id" : "1330710960******",
                  "region_id" : "cn-hangzhou",
                  "instance_id" : "es-cn-7mz2lpnaf0012****"
                },
                "set_priority" : {
                  "priority" : 50
                }
              }
            }
          }
        }
      }
    }

    以下参数均为actions中的必选参数,详细说明如下。

    参数

    说明

    openstore_repository

    OpenStore存储仓库名称,固定为aliyun_auto_snapshot,不支持其他名称。

    user_id

    您阿里云账号的ID。在控制台上,将鼠标移至右侧头像处,获取账号ID获取账号ID

    region_id

    目标实例所在的地域ID。参见查看实例的基本信息,在实例的基本信息页面查看实例所在地域,并参见参数说明获取地域ID。

    instance_id

    目标实例的ID。参见查看实例的基本信息,在实例的基本信息页面查看实例的ID。

    force_merge_index

    是否执行forcemerge,必须设置为true,不能为false。设置为true,表示数据存储至OpenStore后,将处于只读状态。

自定义冷热分离存储策略

集群中已经配置了OpenStore部分的索引模板和生命周期策略名称,建议不要修改。如果您的业务需要自定义组合模板和策略,可以参考默认模板结构进行配置,示例如下:

  • 索引模板

    以下示例创建了名称为zlcomponent-openstore-index-template的OpenStore索引模板,并使用了自定义的zlopenstore_default_ilm_policy策略。

    PUT _component_template/zlcomponent-openstore-index-template
    {
      "template" : {
        "settings" : {
          "index" : {
            "lifecycle" : {
              "name" : "zlopenstore_default_ilm_policy"
            },
            "apack" : {
              "cube" : {
                "following_index" : "true"
              }
            },
            "codec" : "OpenIndex87",
            "refresh_interval" : "1s"
          }
        }
      }
    }
  • 生命周期策略

    以下示例创建了名称为zlopenstore_default_ilm_policy的策略,并在模板的基础上添加了delete阶段的配置:

    PUT _ilm/policy/zlopenstore_default_ilm_policy
    {
        "policy" : {
          "phases" : {
            "hot" : {
              "min_age" : "0ms",
              "actions" : { }
            },
            "cold" : {
              "min_age" : "3d",
              "actions" : {
                "openstore" : {
                  "openstore_repository" : "aliyun_auto_snapshot",
                  "force_merge_index" : true,
                  "user_id" : "1330710960******",
                  "region_id" : "cn-hangzhou",
                  "instance_id" : "es-cn-7mz2lpnaf0012****"
                },
                "set_priority" : {
                  "priority" : 50
                }
              }
            },
              "delete": {
                "min_age": "40d",
                "actions": {
                  "delete": {
                    "delete_searchable_snapshot": true
                 }
              }
            }
        }
      }
    }

步骤二:将数据流写入OpenStore索引

  1. 切换到数据流管理页签,单击创建数据流

    说明

    仅7.10版本同时开启Openstore和Indexing Service的实例支持在控制台进行数据流管理。建议您使用数据流相关API(CreateDataStreamRolloverDataStreamListDataStreamsDeleteDataStream)管理数据。

  2. 输入与索引模板匹配的数据流名称,单击确定

    数据流名称需要一个匹配的索引模板,此处需要输入ds-您在步骤一:管理OpenStore索引模板中定义的OpenStore索引模板名称。如果您忘记已创建的索引模板名称,可单击预览已有索引模板查看。创建数据流

  3. 登录Kibana控制台,通过bulk批量写入数据。

    在写入数据时,您可以通过设置写入的文档数量超过生命周期配置中文件数限制参数设置的值进行测试。文件数限制参数设置的值,可在步骤一:管理OpenStore索引模板中查看。

  4. 切换至索引管理页签,查看OpenStore索引的写入托管状态、当前生命周期阶段等信息。

    索引管理

    说明

    如果是非数据流场景,数据写入到OpenStore存储后,索引名称将以openstore-*开头,不影响业务查询。

常见问题

  • Q:索引数据存储至OpenStore后,为什么无法写入更新,只能读取?

    A:集群提供的openstore_default_ilm_policyactions中指定了force_merge_index参数为true,不可更改。当索引force_merge后,索引将处于只读状态,无法写入。

  • Q:索引数据存储至OpenStore的过程中,集群状态为什么会变为异常(红色)?

    A:因为在索引数据复制进OpenStore冷存储的过程中,冷索引会处于写入状态,导致索引状态变为red,所以集群状态会变成红色。而在该复制过程中,热索引处于正常状态,并且是可持续对外提供服务的。当写入完成后,热索引被删除,冷索引恢复正常,此时集群也会恢复正常状态。