更新时间:2024-10-25 GMT+08:00

切换Elasticsearch集群冷热数据

云搜索服务支持给Elasticsearch集群配置冷数据节点,支持对索引数据进行冷热切换。

场景描述

通过切换冷热数据,可以将部分现查要求秒级返回的数据放在高性能机器上面作为热数据,对于历史数据要求分钟级别返回的数据放在大容量低规格节点作为冷数据。冷热数据切换可以减低存储成本,提升搜索效率。

图1 切换冷热数据原理

在创建集群时,启用的冷数据节点会被打上“cold”标签,用来存放冷数据,数据节点会被打上“hot”标签,用于存放热数据。用户可以通过配置指定索引,将数据分配到冷数据节点上。只有集群存在冷数据节点时,数据节点才会被打上热标签。

冷数据节点只有在创建集群时可以选择启用,已建集群不支持添加冷数据节点,如果集群没有冷数据节点又想切换冷热数据,可以使用存算分离功能,具体操作请参见配置Elasticsearch集群存算分离

冷数据节点支持节点数量扩缩容和磁盘存储容量的扩容,具体操作请参见扩缩容Elasticsearch集群

约束限制

仅启用了冷数据节点的集群才支持进行冷热数据切换。只有在创建集群时可以选择启用冷数据节点,已建集群不支持添加冷数据节点。

切换冷热数据

  1. 登录云搜索服务管理控制台。
  2. 确认集群是否已启用冷数据节点。
    “集群管理”页面,选择需要进行存算分离的集群,单击集群名称进入集群详情页,查看“节点信息”中是否有冷数据节点的信息。
    图2 查看冷数据节点
    • 是,集群存在冷数据节点,则执行下一步。
    • 否,集群不存在冷数据节点,则不支持切换集群的冷热数据。如果想将历史数据定义为冷数据,减低存储成本,提升搜索效率,可以使用存算分离功能,具体操作请参见配置Elasticsearch集群存算分离
  3. 单击集群操作列“Kibana”,登录Kibana页面。
  4. 选择左侧导航栏的“Dev Tools”,进入操作页面。
  5. 在Kibana操作页面设置template,通过设置集群模板将相应的索引数据存储到冷热数据节点上。

    例如,执行如下命令设置template将以“myindex”开头的索引存储到冷数据节点上。

    • Elasticsearch版本<6.x的创建模板命令
      PUT _template/test
      {
          "order": 1,
          "template": "myindex*",
          "settings": {
              "index": {
                  "refresh_interval": "30s",
                  "number_of_shards": "3",
                  "number_of_replicas": "1",
                  "routing.allocation.require.box_type": "cold"
              }
          }
      }
    • Elasticsearch版本≥6.x的创建模板命令
      PUT _template/test
      {
        "order": 1,
        "index_patterns": "myindex*",
        "settings": {
          "refresh_interval": "30s",
          "number_of_shards": "3",
          "number_of_replicas": "1",
          "routing.allocation.require.box_type": "cold"
        }
      }

    也支持直接将已有索引存储到冷热数据节点上。

    例如,执行如下命令将“myindex”索引存储到冷数据节点上。
    PUT myindex/_settings   
     { 
            "index.routing.allocation.require.box_type": "cold"
        }

    “myindex”表示索引名称。“cold”可以基于需要改成“hot”

  6. 当需要回退冷热数据时,可以执行如下命令,删除冷热数据配置。这时候索引数据会被当成普通索引,随机均衡分布在冷热数据节点中。
    PUT myindex/_settings    
    {
            "index.routing.allocation.require.box_type": null
        }

    “myindex”表示索引名称。