Bootstrap

elasticsearch分片迁移操作

elasticsearch可以通过/_cluster/reroute api来手动进行索引分片的分配。

不过要想完全手动,必须先禁止es进行自动索引分片分配,否则你从一节点把分片移到另外一个节点,那么另外一个节点的一个分片又会移到那个节点。数据量很少的时候,可能影响不大,但是如果数据量很大,这个参数必须要设置,因为如果不设置,即便你不手动迁移分片,在我们重启机群的时候,也会产生分片的迁移,导致大量资源被占用,重启变慢。

一共有三种操作,分别为:移动(move),取消(cancel)和分配(allocate_replica)。下面分别介绍这三种情况:

移动(move)
把分片从一节点移动到另一个节点。可以指定索引名和分片号。
取消(cancel)
取消分配一个分片。可以指定索引名和分片号。node参数可以指定在那个节点取消正在分配的分片。allow_primary参数支持取消分配主分片。
分配(allocate)
分配一个未分配的分片到指定节点。可以指定索引名和分片号。node参数指定分配到那个节点。allow_primary参数可以强制分配主分片,不过这样可能导致数据丢失。我一般用来清空某个未分配分片的数据的时候才设置这个参数.

示例

elasticsearch集群有node-1,node-2,node-3三个节点,top_n_database_statement-20200519、为一个三分片,双副本的索引,当前分片的分布情况如下node-1(0,1),node-2(0,2),node-3(1,2),需要下线node-3节点,操作如下:

  1. 关闭集群自动索引分片分配

    # 1. 关闭集群自动shard allocation
    PUT _cluster/settings 
    { 
      "persistent": { 
        "cluster.routing.allocation.enable": "none"
      }
    }
    
  2. 迁移node-3上分片到node-1,node-2节点

    # node-3分片1迁移到node-2
    POST /_cluster/reroute
    {
        "commands" : [
            {
                "move" : {
                    "index" : "top_n_database_statement-20200519", "shard" : 1,
                    "from_node" : "node-3", "to_node" : "node-1"
                }
            }
        ]
    }
    # node-3分片2迁移到node-1
    POST /_cluster/reroute
    {
        "commands" : [
            {
                "move" : {
                    "index" : "top_n_database_statement-20200519", "shard" : 2,
                    "from_node" : "node-3", "to_node" : "node-1"
                }
            }
        ]
    }
    
  3. 确认node-3无分片后,节点下线。

  4. 开启集群自动索引分片分配

    # 开启集群自动shard allocation
    PUT _cluster/settings 
    { 
      "persistent": { 
        "cluster.routing.allocation.enable": "all"
      }
    }
    
;