首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ElasticSearch:未分配分片,如何修复?

ElasticSearch:未分配分片,如何修复?
EN

Stack Overflow用户
提问于 2013-11-14 08:49:34
回答 27查看 270K关注 0票数 186

我有一个包含4个节点的ES集群:

number_of_replicas: 1
search01 - master: false, data: false
search02 - master: true, data: true
search03 - master: false, data: true
search04 - master: false, data: true

我不得不重新启动search03,当它回来时,它重新加入集群没有问题,但留下了7个未分配的碎片。

{
  "cluster_name" : "tweedle",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 15,
  "active_shards" : 23,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 7
}

现在我的集群处于黄色状态。解决此问题的最佳方法是什么?

  • 删除(取消)碎片?
  • 将碎片移动到另一个节点?
  • 将碎片分配给节点?
  • 将'number_of_replicas‘更新为2?
  • 完全不同?

有趣的是,当添加新的索引时,该节点开始处理它,并与集群的其余部分合作得很好,只是留下了未分配的碎片。

接下来的问题:我是不是做错了什么,导致了这种情况的发生?我对当节点重启时以这种方式运行的集群没有太大的信心。

注意:如果您出于某种原因正在运行单节点集群,您可能只需要执行以下操作:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'
EN

回答 27

Stack Overflow用户

回答已采纳

发布于 2013-11-16 05:02:00

好的,我已经在ES支持的帮助下解决了这个问题。在所有节点(或您认为是导致问题的节点)上向API下发以下命令:

curl -XPUT 'localhost:9200/<index>/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

其中,<index>是您认为是罪魁祸首的索引。如果您不知道,只需在所有节点上运行以下命令:

curl -XPUT 'localhost:9200/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

我还将这一行添加到我的yaml配置中,从那时起,服务器/服务的任何重新启动都没有问题。碎片会立即重新分配回来。

FWIW,为了回答一个经常被追问的问题,将MAX_HEAP_SIZE设置为30G,除非您的计算机的内存小于60G,在这种情况下,将其设置为可用内存的一半。

参考文献

票数 61
EN

Stack Overflow用户

发布于 2014-05-21 18:48:13

默认情况下,Elasticsearch会动态地为节点重新分配分片。但是,如果您已经关闭了分片分配(可能您做了一个rolling restart,但忘记重新启用),您可以重新启用分片分配。

# v0.90.x and earlier
curl -XPUT 'localhost:9200/_settings' -d '{
    "index.routing.allocation.disable_allocation": false
}'

# v1.0+
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
    "transient" : {
        "cluster.routing.allocation.enable" : "all"
    }
}'

然后Elasticsearch会像往常一样重新分配分片。这可能会很慢,可以考虑提高indices.recovery.max_bytes_per_seccluster.routing.allocation.node_concurrent_recoveries来加快速度。

如果您仍然看到问题,可能是其他问题,所以在您的Elasticsearch日志中查找错误。如果你看到EsRejectedExecutionException,你的线程池may be too small

最后,您可以显式地将分片重新分配给具有reroute API的节点。

# Suppose shard 4 of index "my-index" is unassigned, so you want to
# assign it to node search03:
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands": [{
        "allocate": {
            "index": "my-index",
            "shard": 4,
            "node": "search03",
            "allow_primary": 1
        }
    }]
}'
票数 124
EN

Stack Overflow用户

发布于 2014-11-05 06:24:05

这个小bash脚本将暴力重新分配,你可能会丢失数据。

NODE="YOUR NODE NAME"
IFS=$'\n'
for line in $(curl -s 'localhost:9200/_cat/shards' | fgrep UNASSIGNED); do
  INDEX=$(echo $line | (awk '{print $1}'))
  SHARD=$(echo $line | (awk '{print $2}'))

  curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
     "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
          }
        }
    ]
  }'
done
票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19967472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档