如何将所有elasticsearch分片从一个节点移动到另一个节点?

时间:2016-08-30 18:39:31

标签: elasticsearch

在ElasticSearch 2.X中,您可以使用重新路由移动分片:

https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-reroute.html#cluster-reroute

除了为每个分片指定一个移动之外,还有一种简单的方法可以将它们从一个节点移到另一个节点吗?

2 个答案:

答案 0 :(得分:3)

我还没有找到移动“全部”选项,但是由于awk和ES _cat API,我可以生成所需的JSON,用于将所有分片从node1移动到node2:

#!/bin/bash

OLD=node1
NEW=node2

SHARDS=`
curl -s -XGET "https://my.elasticsearch.cluster/_cat/shards/" | awk -v NEW=$NEW -v OLD=$OLD '$8==OLD {
  print "      { \"move\": { \"index\": \""$1"\", \"shard\": "$2", \"from_node\": \""OLD"\", \"to_node\": \""NEW"\" }},"
}'|sed '$ s/.$//'
`
echo '{"commands": ['
echo $SHARDS
echo ']}'

答案 1 :(得分:1)

重新路由不会确保分片保留在新节点中。 Elasticsearch可能会尝试平衡问题并将一些分片移回原始节点。如果要将分片固定到新节点,则需要使用Shard Allocation Filtering

如果要将索引index1的所有分片移动到节点node1,则要执行的命令为:

PUT index1/_settings
{
  "index.routing.allocation.include._name": "node1"
}