OpenStore存储引擎是阿里云Elasticsearch团队针对日志场景自研的弹性、高效、低成本的日志存储引擎,支持自定义冷热存储与智能混合存储版本,智能混合存储可突破传统冷热分离架构,大幅降低集群数据接入复杂度的同时,进一步降低云上海量数据的存储成本。本文介绍在不同的场景下,如何开启OpenStore存储,以及其使用方式。

背景信息

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

OpenStore存储引擎是阿里云Elasticsearch 7.10日志增强版的重要功能,结合Indexing Service写入托管服务,满足用户在日志场景下低成本的高并发写入及长期数据存储需求。您可以按需创建7.10日志增强版实例,开启OpenStore存储功能;也可以在满足内核小版本要求的情况下(1.5.0及以上),将7.10版本的通用商业版实例升级至日志增强版,并开启OpenStore存储功能。
说明 如果未开启OpenStore,OpenStore存储默认关闭。您可以在实例基本信息页面的节点可视化区域查看是否已开启OpenStore功能、开启OpenStore功能并查看OpenStore存储信息,详细信息请参见查看集群状态和节点信息

使用限制

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

类别 限制说明
地域 目前仅开放华东2(上海)、华北3(张家口)、华东1(杭州)、华南 1(深圳)、华北 2(北京)地域。
实例版本 仅7.10版本实例支持开启OpenStore存储,开启方式如下:
  • 新购7.10日志增强版Index Service实例开启。
  • 已购7.10通用商业版,通过集群升配功能开启。
    说明
    • 已购7.10通用商业版,内核小版本需要升级到1.5.0及以上,才可开启OpenStore自定义冷热存储。
    • Elasticsearch暂不支持在升级通用商业版实例时开启OpenStore智能混合存储,如果需要使用OpenStore智能混合存储,需要新购实例。
    • OpenStore属于阿里云Elasticsearch日志增强版特性,商业版升级后,实例类型将变为日志增强版,不会因为开启OpenStore存储而将实例升级为Indexing Service实例。
实例规格
  • 自定义冷热存储:仅支持选择OpenStore存储型16核64 GB规格。
  • 智能混合存储:仅支持选择OpenStore存储型8核64 GB、16核64 GB规格
实例存储容量 单节点最大存储数据容量为30 TB。
说明 如果您有更大的单节点存储需求,请提交工单申请,最大支持50 TB。
shard副本数
  • 开启OpenStore自定义冷热存储,冷数据存储至OpenStore时shard副本数默认为0,数据的可靠性将由底层存储保证。
    重要 如果将OpenStore自定义冷热存储的索引副本数设置为1,索引将处于yellow状态,因此不建议手动设置副本,保持默认值即可。
  • 开启OpenStore智能混合存储,shard副本数须大于等于1(建议设置为1)。
    重要 多副本之间共享一份数据,不增加额外存储成本。多副本用于保证本地存储写入加速的可靠性,如果未设置多副本可能会导致部分实时写入数据的丢失。
索引模板
  • 开启OpenStore自定义冷热存储,集群会默认提供模板openstore-index-template,模板默认使用openstore_default_ilm_policy策略。详细信息请参见通过OpenStore实现海量数据存储
  • 开启OpenStore智能混合存储,集群会默认提供模板component-hybrid-openstore-index-template。如果需要使用自定义的索引模板,请通过组合模板的方式实现。详细信息请参见通过OpenStore实现海量数据存储
说明 手动删除OpenStore存储索引时,需要将索引及索引对应的别名一起删除才可删除成功。
索引生命周期配置 不支持在索引生命周期中自定义freeze。

操作流程

  1. 步骤一:开启OpenStore存储
  2. 步骤二:管理OpenStore索引模板
  3. 步骤三:将数据流写入OpenStore索引

步骤一:开启OpenStore存储

阿里云Elasticsearch支持通用商业版和日志增强版两种类型的实例。您可以通过创建7.10日志增强版Indexing Service系列实例开启OpenStore存储功能;也可以将实例从7.10通用商业版升级至7.10日志增强版,开启OpenStore存储功能。

新购实例开启OpenStore存储

  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Elasticsearch实例
  3. Elasticsearch实例页面,单击创建
  4. 在购买页面中,选择实例类型为日志增强版7.10,系列Indexing Service
    选择实例类型和系列
  5. 单击下一步:集群配置,在集群配置中开启OpenStore存储,并选择实例规格。
    • 开启OpenStore智能混合存储
      仅支持冷热共享型数据节点:数据节点+Kibana节点,其中数据节点规格族固定为冷热共享计算型OpenStore智能混合存储
    • 开启OpenStore自定义冷热存储
      您可以通过以下方式选择实例规格:
      • 开启独立冷数据节点(默认):冷数据节点+数据节点+Kibana节点,其中冷数据节点规格固定为OpenStore存储型16核64 GB。开启OpenStore存储
        说明 开启OpenStore自定义冷热存储,默认会开启数据节点,集群采用冷热分离架构。OpenStore自定义冷热存储仅应用在冷数据节点上,且仅支持16核64 GB的固定规格。
      • 选择冷热共享型数据节点:数据节点+Kibana节点,其中数据节点规格族需要选择冷热共享计算型数据节点为冷热共享计算型
    说明 每个OpenStore节点的最大存储数据量为20 TB。如果您有更大的单节点存储需求,请提交工单申请,最大支持50 TB。
  6. 参见购买页面参数(增强版),配置其他参数,完成购买。

已购通用商业版实例开启OpenStore自定义冷热存储

说明 已购通用商业版实例暂不支持开启OpenStore智能混合存储。
  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Elasticsearch实例
  3. 进入目标实例。
    1. 在顶部菜单栏处,选择资源组和地域。
    2. 在左侧导航栏,单击Elasticsearch实例,然后在Elasticsearch实例中单击目标实例ID。
  4. 可选:升级内核版本。
    基本信息页面,查看实例的内核版本是否过低。如果页面没有有可更新的内核补丁提示,说明当前内核版本为最新版本,无需升级,可忽略此步骤。如果有,请执行以下步骤升级内核版本:
    1. 单击有可更新的内核补丁
      有可更新的内核版本
    2. 参见升级版本,将内核版本升级到1.5.0及以上。
      升级内核补丁
  5. 基本信息页面的节点可视化区域,开启OpenStore存储。
    1. 在OpenStore存储模块,打开OpenStore存储用量开关。
    2. 在弹出的对话框中,单击立即开启
      重要
      • 如果集群已开启非OpenStore的冷数据节点,则系统不展示OpenStore模块,且不支持切换至OpenStore存储。
      • 如果您实例的内核版本过低,在开启OpenStore存储时,系统会提示您升级版本,请先按照提示升级实例的内核版本,具体操作请参见升级版本
    3. 在升配页面开启OpenStore存储,勾选服务协议,单击立即购买,按照提示完成购买,并返回OpenStore存储模块。
      升配的具体操作,请参见升配集群

步骤二:管理OpenStore索引模板

通过控制台管理索引模板

  1. 进入已开启OpenStore存储的目标实例,在左侧导航栏选择配置与管理 > 索引管理中心
    说明 本章节以7.10日志增强版Indexing Service实例为例进行介绍,商业版实例不支持索引管理中心功能,具体以页面显示为准。
  2. 单击索引模板管理页签。
  3. 索引模板管理页面,管理您集群中的索引模板。
    阿里云Elasticsearch为您提供了OpenStore定制索引模板,您可以查看并修改OpenStore定制的索引模板和生命周期策略,将定制模板快速应用到您的业务索引上。您也可以创建自定义的索引模板,并配置生命周期策略。具体说明如下:
    说明 由于OpenStore索引数据默认写入热节点,达到ILM周期后会迁移到OpenStore存储,因此不支持在OpenStore索引或模板中配置index.routing.allocation.require.box_type参数。
    • 查看并修改OpenStore定制的索引模板和生命周期策略:
      1. 单击索引模板或生命周期策略名称,查看OpenStore定制的索引模板和生命周期策略。
        不同的OpenStore存储类型对应的索引模板名称和生命周期策略名称不同,具体如下。
        OpenStore存储类型 索引模板名称 生命周期策略名称
        自定义冷热存储 openstore-index-template openstore_default_ilm_policy
        智能混合存储 hybrid-openstore-index-template hybrid_openstore_default_ilm_policy
      2. 单击索引模板或生命周期策略右侧的修改,修改定制的索引模板和生命周期策略。
        定制化的OpenStore模板默认仅对log-service-*索引进行管理。修改时可将索引模式指定为业务索引名称,并开启创建数据流,定制模板即可快速应用到业务索引上。修改OpenStore定制模板
      3. 单击确认
    • 创建自定义索引模板,并配置生命周期策略:
      1. 单击创建索引模板
      2. 索引生命周期策略配置向导中,根据OpenStore存储类型,参考下图配置索引生命周期策略。
        • 智能混合存储OpenStore智能混合存储模板
        • 自定义冷热存储配置生命周期策略
        详细参数说明,请参见索引模板管理
        说明
        • Indexing Service实例建议开启滚动更新,保证数据滚动更新后自动取消云托管能力。
        • 当OpenStore存储类型为智能混合存储时,无冷阶段
        • 当OpenStore存储类型为自定义冷热存储时,系统默认开启冷阶段OpenStore存储,如果您的索引需要进行冷热生命周期配置,请勿关闭冷阶段OpenStore存储开关。
        • 取消托管时间默认为3天,3天后自动退出Indexing Service写入托管服务,减少计费开销。如果您设置的时长超过冷阶段或删除阶段的开始时间,索引进入相应阶段后会自动取消托管。取消托管后索引变成只读,索引将不再通过Indexing Service进行写入加速。
      3. 单击保存并下一步,在索引模板配置向导中,参考下图配置索引模板。配置索引模板
        详细参数说明,请参见索引模板管理
        说明 Indexing Service实例开启创建数据流后,才可在数据流管理页面管理写入的索引。详细信息请参见步骤三:将数据流写入OpenStore索引
      4. 单击确认

通过API管理索引模板

从Elasticsearch 7.10版本开始,索引模板默认会使用优先级最高的配置,不会自动组合两个索引模板内的配置。由于集群中已经存在默认的OpenStore索引模板,如果您需要再通过API自定义索引模板,而这两个模板的配置不会自动组合,因此可能会影响OpenStore功能的正常使用,所以建议您使用Elasticsearch组合模板进行配置。
说明 阿里云Elasticsearch不支持通过Kibana Stack Management管理OpenStore内容模板及策略,建议使用API操作或控制台索引管理中心进行配置管理。
开启OpenStore自定义冷热存储后,集群中会默认添加OpenStore的组合模板component-openstore-index-template;开启OpenStore智能混合存储,默认添加组合模板component-hybrid-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
    }
  • 智能混合存储
    PUT _index_template/test-template
    {
      "index_patterns" : [
        # 索引模板
        "test-index-*"
      ],
      "template" : {
        "settings" : {
          "index" : {
            "lifecycle" : {
              # 索引生命周期
              "name" : "test_ilm_policy", 
              "rollover_alias" : ""
            }
          }
        },
        "aliases" : {}
      },
      "composed_of" : [
        # 混合存储组合模板
        "component-hybrid-openstore-index-template" 
      ],
      "priority" : 100
    }
    重要 组合模板component-hybrid-openstore-index-template中包含了该集群的专有环境配置,涉及访问权限控制,非必要请勿修改,以免影响集群功能。
开启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后,将处于只读状态。
  • 智能混合存储
    • 通过GET _component_template/component-hybrid-openstore-index-template命令获取内容模板
      {
        "component_templates" : [
          {
            "name" : "component-hybrid-openstore-index-template",
            "component_template" : {
              "template" : {
                "settings" : {
                  "index" : {
                    "replication" : {
                      "type" : "segment"
                    },
                    "apack" : {
                      "cube" : {
                        "following_index" : "true"
                      }
                    },
                    "codec" : "OpenIndex",
                    "allocation" : {
                      "existing_shards_allocator" : "open_store_allocator"
                    },
                    "refresh_interval" : "1s",
                    "store" : {
                      "type" : "openstore",
                      "openstore" : {
                        "endpoint" : "http://oss-cn-hangzhou-internal.aliyuncs.com",
                        "ram_name" : "snapshot-role-133071096032****",
                        "type" : "hybrid",
                        "bucket_name" : "openstore-133071096032****-es-cn-2r42xjwrz0008****"
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      }
      重要 建议直接采用模板中的默认配置,尽量避免手动配置,以免影响集群使用。
    • 通过GET _ilm/policy/hybrid_openstore_default_ilm_policy命令获取生命周期策略
      {
        "hybrid_openstore_default_ilm_policy" : {
          "version" : 1,
          "modified_date" : "2022-09-08T03:51:23.042Z",
          "policy" : {
            "phases" : {
              "hot" : {
                "min_age" : "0ms",
                "actions" : {
                  "cube_unfollow" : {
                    "max_age" : "3d",
                    "force_merge" : true,
                    "force" : false,
                    "read_only" : true
                  }
                }
              }
            }
          }
        }
      }

      actions中的cube_unfollow参数用来设置Indexing Service退出写入托管的相关配置,默认3天退出Indexing Service写入托管。

集群中已经配置了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阶段的配置:
    • OpenStore自定义冷热存储示例
      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智能混合存储示例
      PUT _ilm/policy/zlopenstore_default_ilm_policy
      {
        "policy" : {
          "phases" : {
            "hot" : {
              "min_age" : "0s",
              "actions" : {
                "rollover" : {           
                  "max_size" : "50gb",
                  "max_age" : "30d",
                  "max_docs" : 10000
                },
                "cube_unfollow" : {      
                  "max_age" : "3d",
                  "force_merge" : true,
                  "force" : false,
                  "read_only" : true
                },
                "set_priority" : {
                  "priority" : 1000
                }
              }
            },
            "delete" : {                 
              "min_age" : "30d",
              "actions" : {
                "delete" : {
                  "delete_searchable_snapshot" : true
                }
              }
            }
          }
        }
      }
      参数 说明
      rollover 配置rollover滚动更新策略。
      cube_unfollow 配置Indexing Service退出托管策略。
      delete 配置索引过期删除策略。

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

  1. 切换到数据流管理页签,单击创建数据流
    说明 仅7.10日志增强版Indexing Service系列的实例支持在控制台进行数据流管理,通用商业版7.10升级到日志增强版后不支持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,所以集群状态会变成红色。而在该复制过程中,热索引处于正常状态,并且是可持续对外提供服务的。当写入完成后,热索引被删除,冷索引恢复正常,此时集群也会恢复正常状态。