0

所以我不小心在同一台机器上启动了 2 个 ElasticSearch 实例。一个使用端口 9200,另一个使用端口 9201。这意味着有 2 个集群节点,每个具有相同的名称,每个具有每个索引总分片的 1/2。

如果我杀死其中一个实例,我现在会得到一个拥有 1/2 碎片的实例。

我该如何解决这个问题?我只想拥有 1 个包含所有碎片的实例(就像以前一样)

4

1 回答 1

1

所以......有一个干净的方法来解决这个问题。尽管我必须说 ElasticSearch 文档非常令人困惑(所有这些流行词,如集群和禅宗发现都让我大吃一惊!)

1) 现在,如果您有 2 个实例,一个在端口 9200,另一个在 9201。并且您希望所有分片都在 9200 中。

运行此命令以禁用 9201 实例中的分配。如果您希望此更改不是永久性的,您可以将持久性更改为瞬态。我会坚持下去,这样就不会再发生了。

curl -XPUT localhost:9201/_cluster/settings -d '{
    "persistent" : {
        "cluster.routing.allocation.disable_allocation" : true
    }
}'

2) 现在,运行命令将 9201 实例中的所有分片移动到 9200。

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands" : [ {
          "move" : 
            {
              "index" : "<NAME OF INDEX HERE>", "shard" : <SHARD NUMBER HERE>, 
              "from_node" : "<ID OF 9201 node>", "to_node" : "<ID of 9200 node>"
            }
        }
    ]
}'

您需要为 9201 实例中的每个分片(您想要删除的分片)运行此命令。

如果您有 ElasticSearch 头,则该分片将是紫色的,并且将具有“REALLOCATING”状态。如果您有大量数据,例如 > 1 GB,则移动分片需要一段时间 - 可能长达一个小时甚至更长时间,所以请耐心等待。在一切都完成移动之前,不要关闭实例/节点。

就是这样!

于 2013-09-20T20:13:00.533 回答