通过阿里云Elasticsearch(简称ES)的数据节点缩容功能,可以缩减数据节点的数量。

注意事项

缩容集群数据节点操作会触发集群重启,为保证您的业务不受影响,请确认后操作。

缩容数据节点

  1. 登录阿里云Elasticsearch控制台
  2. 在顶部菜单栏处,选择地域。
  3. 单击目标实例ID/名称链接。
  4. 基本信息页面,单击集群数据节点缩容
  5. 缩容配置区域,选择节点类型
  6. 在节点列表中单击选择需要缩容的数据节点。
    注意 保留节点数需大于2,且大于当前节点数一半。
  7. 迁移数据。
    为保证数据的安全,进行缩容的数据节点中不应该存在数据。如果所选数据节点中有数据,系统会提示您进行数据迁移。迁移后所选节点上不再有任何索引数据,新的索引数据也不会被写入该节点。
    1. 单击提示栏中的数据迁移辅助工具
      数据迁移辅助工具
    2. 集群数据节点迁移页面,选择节点迁移方式。
      参数 说明
      系统建议 通过系统建议自动选择需要迁移的数据节点。
      自定义 手动选择需要迁移的数据节点。
    3. 勾选同意数据迁移协议,单击确认
    4. 单击确定
      确定后,集群会进行重启。重启时,可在任务列表中查看数据迁移任务的进度,重启成功后,即可完成集群中对应数据节点的数据迁移任务。数据迁移任务列表
      说明 数据迁移过程中,可以在任务列表中单击中断变更,停止迁移任务。
  8. 在实例的基本信息页面,再次单击集群数据节点缩容
  9. 缩容配置区域,选择已经完成数据迁移的节点,单击确定
    确定后,集群会进行重启。重启时,可在任务列表中查看缩容任务的进度,重启成功后,即可完成集群数据节点的缩容。完成集群数据节点的缩容

迁移回滚

数据迁移是一个周期很长的过程,在此期间集群状态和数据的变更可能会导致迁移失败,具体可在任务列表中查看。当数据迁移失败或者迁移完成后,可通过以下步骤对迁移节点进行回滚。

  1. 登录对应阿里云ES实例的Kibana控制台。
    登录控制台的具体步骤请参见登录Kibana控制台
  2. 单击左侧导航栏的Dev Tools(开发工具),在Console中执行以下命令,获取迁移节点的IP地址。
    GET _cluster/settings
    执行成功后,返回如下结果。
    {
      "transient": {
        "cluster": {
          "routing": {
            "allocation": {
              "exclude": {
                "_ip": "192.168.xx.xx,192.168.xx.xx,192.168.xx.xx"
              }
            }
          }
        }
      }
    }                        
  3. 执行以下命令,回滚迁移节点数据。
    • 回滚部分节点数据。配置中要去掉需要回滚的节点,但要保留不回滚的节点。
      PUT _cluster/settings
      {
        "transient": {
          "cluster": {
            "routing": {
              "allocation": {
                "exclude": {
                  "_ip": "192.168.xx.xx,192.168.xx.xx"
                }
              }
            }
          }
        }
      }
    • 回滚全部节点数据。
      PUT _cluster/settings
      {
        "transient": {
          "cluster": {
            "routing": {
              "allocation": {
                "exclude": {
                  "_ip": null
                }
              }
            }
          }
        }
      }                            
  4. 执行以下命令,校验是否完成数据回滚。
    GET _cluster/settings

    执行成功后,如果返回结果中不包含迁移节点的IP地址,则表示已经完成该节点的迁移回滚任务。您也可以通过观察相应节点是否被重新分配shard来判断。

    说明 数据迁移或回滚时,均可以通过GET _cat/shards?v命令来查看任务状态。

常见问题

  • 出现“该操作会导致当前集群资源(Disk/CPU/Memory)不足或shard分配异常”的报错,如何处理?
    原因
    • 集群资源不足

      集群在缩容后,磁盘、内存、CPU等资源不足,不足以承担当前系统数据或者负载。

    • shard分配异常

      按照Lucene原理,对于任意一个数据节点中同一个索引的副本,ES不会把2个或者2个以上的副本同时迁移到同一个数据节点中。这会导致缩容后集群中索引的副本数可能大于等于数据节点数,从而导致shard分配异常。

    解决方案
    • 集群资源不足

      使用GET _cat/indices?v命令检查磁盘等资源是否可以在安全阈值内承担当前的数据量和请求量。如果不满足要求,需要升配集群

    • shard分配异常
      使用GET _cat/indices?v命令查看集群中索引的副本数是否小于缩容后的节点数。如果不满足,需要调整副本数,详情请参见索引模板。例如,使用索引模板设置副本数为2,示例代码如下。
      PUT _template/template_1
      {
        "template": "*",
        "settings": {
          "number_of_replicas": 2
        }
      }  
  • 出现“集群当前状态异常或有未完成任务”的报错,如何处理?

    解决方案:使用GET _cluster/health查看集群健康状况,或者在智能运维中查看集群异常原因。

  • 集群节点有数据,如何执行迁移任务?

    解决方案:进行数据迁移操作,详情请参见缩容数据节点章节。

  • 出现“保留节点数需大于2且大于当前节点数一半”的报错,如何处理?

    原因:为保证集群的可靠性,保留的节点数必须大于2;为保证集群的稳定性,每次迁移或缩容的节点数不得超过当前数据节点数的一半。

    解决方案:如果不满足以上要求,需要重新选择迁移或缩容的节点或者升配集群

  • 出现“当前ES集群配置不支持该操作”的报错,如何处理?

    解决方案:使用GET _cluster/settings查看集群配置,查看是否存在不允许数据分配的配置。

  • 使用auto_expand_replicas索引,导致数据迁移或者节点缩容失败,如何处理?

    原因:部分用户使用了X-Pack提供的权限管理功能,在早期版本中,该功能对应的.security索引默认会使用"index.auto_expand_replicas" : "0-all"配置,该配置会使得数据迁移或者节点缩容失败。

    解决方案:
    1. 查看索引配置。
      GET .security/_settings
      返回如下结果。
      {
        ".security-6" : {
          "settings" : {
            "index" : {
              "number_of_shards" : "1",
              "auto_expand_replicas" : "0-all",
              "provided_name" : ".security-6",
              "format" : "6",
              "creation_date" : "1555142250367",
              "priority" : "1000",
              "number_of_replicas" : "9",
              "uuid" : "9t2hotc7S5OpPuKEIJ****",
              "version" : {
                "created" : "6070099"
              }
            }
          }
        }
      }
    2. 选择其中一种方式修改配置。
      • 方式一
        PUT .security/_settings
        {
          "index" : {
            "auto_expand_replicas" : "0-1"
          }
        }
      • 方式二
        PUT .security/_settings
        {
          "index" : {
            "auto_expand_replicas" : "false",
            "number_of_replicas" : "1"
          }
        }
        注意 number_of_replicas表示索引的副本个数,可以根据实际需求进行配置,但要保证至少有1个,且不大于可用的数据节点个数。