当前位置: 首页 > 知识库问答 >
问题:

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

毛弘博
2023-03-14

我有一个包含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
    }
}'

共有3个答案

糜鸿风
2023-03-14

这个小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
南门承教
2023-03-14

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

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

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

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

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

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

  • 碎片分配感知
黄流觞
2023-03-14

默认情况下,Elasticsearch将动态地重新为节点分配碎片。但是,如果您已经禁用了碎片分配(也许您执行了滚动重新启动,但忘记重新启用它),那么您可以重新启用碎片分配。

# 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会像正常一样重新分配碎片。这可能很慢,请考虑提高index.recovery.max_bytes_per_seccluster.routing.allocation.node_concurrent_recoveries以加快速度。

如果您仍然看到问题,那么可能是其他问题,所以在您的Elasticsearch日志中查找错误。如果您看到esRejectedExecutionException,您的线程池可能太小。

最后,您可以使用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
        }
    }]
}'
 类似资料:
  • 问题内容: 我有一个具有4个节点的ES集群: 我不得不重新启动search03,当它回来时,它又重新加入了群集,没有问题,但是留下了7个未分配的碎片。 现在,我的集群处于黄色状态。解决此问题的最佳方法是什么? 删除(取消)分片? 将分片移动到另一个节点? 将分片分配给节点? 将“ number_of_replicas”更新为2? 还有其他东西吗? 有趣的是,当添加新索引时,该节点开始在该节点上工作

  • centOS上的elasticsearch 1.7.x 我们的三节点集群变成了两节点集群。一切都很好。每个碎片我们都有3个复制品,所以我们都有了。 但现在集群运行状况是黄色的,我们有: 我们已经将ElasticSearch.yml中的副本计数设置更改为1(从2)并在两个节点上重新启动ES。这没有什么区别。 下一步是什么? 我看到了如何重新分配碎片,但没有看到如何消除未分配的碎片。

  • 我在低源硬件配置的机器上得到了1个节点、1个碎片、1个副本体系结构。我必须将Elasticsearch堆大小保持在总内存的20%,并且我索引1K~1M文档到Elasticsearch关于硬件配置。我有不同类型机器,从2GB到16GB,但由于它们是32bit体系结构,我只能使用300M到1.5GB的最大内存作为堆大小。 由于某些原因,我不知道为什么,Elasticsearch创建了一些带有未分配碎片

  • 问题:我已经启动了五个elasticsearch节点,但只有66,84%的数据在kibana中可用。当我用localhost检查集群运行状况时:9200/u cluster/health?pretty=true我得到了以下信息: 除kibana指数外,我所有的指数都是红色的。 小部分:

  • 我正在运行一个2节点的elasticsearch集群,并将我的所有索引配置为2个主碎片和1个副本。起初,我认为每个节点将存储1个主碎片和1个副本,尽管这不是正在发生的事情。 如上所示,每个碎片都由单个节点托管,没有分配副本。 我做错了什么?

  • 问题内容: 我的集群处于黄色状态,因为未分配某些分片。怎么办呢? 我尝试设置所有索引,但是我认为这不起作用,因为我使用的是1.1.1版本。 我也尝试过重新启动所有机器,但同样发生。 任何想法? 编辑: 群集统计信息: 问题答案: 这些未分配的分片实际上是主节点上实际分片的未分配副本。 为了分配这些分片,您需要运行一个新的elasticsearch实例来创建一个辅助节点来承载数据副本。 编辑: 有时