Elasticsearch:“分片分配”是什么意思?

时间:2019-06-20 10:35:42

标签: elasticsearch search

我们遇到了一个生产事件,Elasticsearch集群运行状况检查返回了red状态。运行状况检查报告显示marvel-2019.06.20有2个unassigned_shards,这似乎是根本原因。

curl -XGET 'localhost:9200/_cluster/health?level=indices&pretty'

{
  "cluster_name" : "sap-jam-jam8",
  "status" : "red",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 122,
  "active_shards" : 239,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 7,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "indices" : {
     ...
     ...
     ".marvel-2019.06.20" : {
          "status" : "red",
          "number_of_shards" : 1,
          "number_of_replicas" : 1,
          "active_primary_shards" : 0,
          "active_shards" : 0,
          "relocating_shards" : 0,
          "initializing_shards" : 0,
          "unassigned_shards" : 2
    }
  }

我们检查了Elasticseach的配置,发现cluster.routing.allocation已被禁用。

curl -XGET 'localhost:9200/_cluster/settings?pretty'
{
  "persistent" : { },
  "transient" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "none"
        }
      }
    }
  }
}

按照this stackoverflow post的建议,我们强制分配了一个分片,此问题已消失。

curl -XPOST -d '{ "commands" : [ {
  "allocate" : {
       "index" : ".marvel-2014.05.21", 
       "shard" : 0, 
       "node" : "SOME_NODE_HERE",
       "allow_primary":true 
     } 
  } ] }' http://localhost:9200/_cluster/reroute?pretty

解决此事件后,我认为有必要弄清楚基本概念shard allocation。我做了一些研究,但是以下问题仍然让我感到困惑。

1。为什么Elasticsearch需要assign shard到其他节点?

在我的情况下,我们有两个Elasticsearch节点A和B。已经在A中创建了两个分片,并占用了磁盘空间。

当B不可用时,为什么不只激活服务器A中的这两个分片?

至少它返回yellow健康状态。

2。 assign a shard的程序是什么?

在第一个问题中,我们假设在服务器A中同时创建了主分片和副本。说assign shard to B时,这是什么意思?

这是否意味着将分片从服务器A复制到服务器B?

3。如何解释这个零活动分片?

主分片和复制都已创建,但是未激活。这怎么可能?除了磁盘存储之外,还有其他开销来激活分片吗?例如记忆吗?

".marvel-2019.06.20" : {
  "status" : "red",
  "number_of_shards" : 1,
  "number_of_replicas" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0, // both shards are inactive.
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 2
}

4。以下假设是正确的吗?

要使分片处于活动状态,Elasticsearch需要执行以下步骤:

  • 创建一个碎片。
  • 找到一台具有足够磁盘空间和RAM来运行它的服务器。
  • 将此分片从源服务器复制到目标服务器。
  • 激活此碎片。

参考

  1. Elasticsearch blog: Red Elasticsearch Cluster? Panic no longer

  2. Stack overflow: elasticsearch - what to do with unassigned shards

1 个答案:

答案 0 :(得分:0)

我不是专家,但有一些想法:

  1. 您有2个节点集群。 ES将尝试在两个节点上分配分片以提供HA,以防其中一个节点发生故障(甚至为了获得更好的读/写性能)
  2. 与1相关。ES尝试分配分片累积节点以提供HA。如果两个分片都分配在节点A上,并且您将节点B添加到群集ES,则会尝试将副本分片移至B。
  3. 仅创建索引,而不创建分片。因此它告诉您“好的,我已经成功创建了索引,但是找不到在何处放置其数据”。您可以通过运行cat shardshttps://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html)找到原因。分片的确消耗了内存,因为必须缓存其元数据。
  4. 这可能是在可能的少数附加条件下添加副本分片的过程(例如,尝试在不包含主分片且负载最小且可以包含数据的节点上创建副本)