阿里云首页

通过手动迁移shard临时解决热点数据分布不均匀问题

问题描述

阿里云Elasticsearch通过哈希映射将文档均匀地路由到分片(shard)中,同时shard会均匀地分散在各个数据节点中,但是会出现某些节点存储的热点数据较多,从而导致这些节点的负载较高。此问题主要会导致以下两个现象:

  • 负载高的节点中存在大量的同一属性分片,例如仅存在主分片。
  • 业务索引在负载高的节点中存储的shard比其他节点多。

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

针对这种情况,您可以采用以下两种方式,重新分配shard,临时降低高负载节点的压力。

副本数配置法

使用副本数配置的方法建议将副本设置为0,待分片平衡后,节点负载正常时,重新恢复副本数即可:

  1. 登录阿里云Elasticsearch控制台在左侧导航栏单击Elasticsearch实例,然后选择目标地域
  2. 单击目标实例ID,然后单击可视化控制
  3. 在Kibana区域右下角单击公网入口,在登录页面输入您创建Elasticsearch实例时的账号密码。
    说明
    • 如果您忘记了账号和密码,可以在左侧导航栏的安全配置页面中查看与修改。
    • 登录Kibana控制台需要添加白名单,您可以单击修改配置,进行添加。
  4. 登录Kibana控制台后,单击左侧导航栏的开发工具(Dev Tools),
  5. 使用副本数配置建议将副本设置为0,待分片平衡后,重新恢复副本数即可,可参考以下命令。
    PUT /[$Index_Name]/settings
    {
      "index" : {
         "number_of_replicas": 0
      }
    }
    说明
    • [$Index_Name]为索引名称。
    • 本文使用Kibana控制台执行对应的命令为例进行介绍。

手动迁移shard

注意

  • 手动迁移shard仅能临时解决节点压力较高的问题。如果节点短暂地脱离集群,shard重新分配,这些节点可能还会出现同样的问题。因此建议在迁移shard前,先优化shard负载不均的问题,详情请参见集群负载不均问题的分析方法及解决方案
  • 如果热点索引分配均衡,而集群整体压力较大,您可以参见升配集群或扩容节点,解决资源紧张的问题。
  1. 参见副本数配置法,登录Kibana控制台,单击左侧导航栏的开发工具(Dev Tools),在Console页面左侧执行以下命令,临时禁用分片分配。
    说明:执行该命令前,可以先执行GET /_cluster/settings命令,确认cluster.routing.allocation.enable值不为none。
    PUT /_cluster/settings
    {
      "transient" : {
         "cluster.routing.allocation.enable" : "none"
      }
    }
  2. 执行以下命令,手动迁移shard,将index_test_v1索引由192.XXX.XXX.77节点上的3号shard迁移到192.XXX.XXX.78节点上,具体迁移的索引和节点以实际环境为准。
    说明
    • 迁移shard时,请确保同一序号的shard不能迁移到同一节点。例如,A节点中已经存在某个索引的3号副本shard,那么该索引的3号主shard就不能迁移到A节点中。
    • 手动迁移shard更详细的说明,请参见cluster-reroute
    POST /_cluster/reroute
    {
     "commands" : [
      {
       "move" : {
        "index" : "index_test_v1", 
        "shard" : 3,
        "from_node" : "192.XXX.XXX.77", 
        "to_node" : "192.XXX.XXX.78"
       }
      }
     ]
    }
  3. 执行以下命令,查看shard迁移状态。
    GET _cat/shards?v
    系统显示类似如下,说明迁移完成。
    查看shard迁移过程
  4. shard迁移完成后,执行以下命令,重新启用分片分配。
    PUT /_cluster/settings
    {
     "transient" : {
      "cluster.routing.allocation.enable" : "all"
     }
    }

适用于

  • 阿里云Elasticsearch
首页 通过手动迁移shard临时解决热点数据分布不均匀问题