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"
      }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章