elasticsearch Elasticsearch:什么是;碎片分配“;什么意思?,elasticsearch,search,elasticsearch,Search" /> elasticsearch Elasticsearch:什么是;碎片分配“;什么意思?,elasticsearch,search,elasticsearch,Search" />

elasticsearch Elasticsearch:什么是;碎片分配“;什么意思?

elasticsearch Elasticsearch:什么是;碎片分配“;什么意思?,elasticsearch,search,elasticsearch,Search,我们遇到了一个生产事件,Elasticsearch群集运行状况检查返回了红色状态。健康检查报告显示marvel-2019.06.20有2个未分配的碎片,这似乎是根本原因 curl -XGET 'localhost:9200/_cluster/health?level=indices&pretty' { "cluster_name" : "sap-jam-jam8", "status" : "red", "timed_out" : false, "number_of_no

我们遇到了一个生产事件,Elasticsearch群集运行状况检查返回了
红色
状态。健康检查报告显示
marvel-2019.06.20
有2个未分配的碎片,这似乎是根本原因

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的配置,发现
集群.路由.分配
已被禁用

curl -XGET 'localhost:9200/_cluster/settings?pretty'
{
  "persistent" : { },
  "transient" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "none"
        }
      }
    }
  }
}
正如建议的那样,我们强制分配了一个碎片,这个问题已经解决了

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

在解决了这个事件之后,我认为有必要弄清楚碎片分配的基本概念。我做了一些研究,但下面的问题仍然让我感到困惑

1.为什么elasticsearch需要
将碎片
分配给其他节点?
在我的例子中,我们有两个elasticsearch节点A和B。在A中已经创建了两个碎片,并消耗了磁盘空间

当B不可用时,为什么不在服务器A中激活这两个碎片呢

至少它返回一个
黄色
健康状态

2.
分配碎片的步骤是什么?
在第一个问题中,我们假设主碎片和副本都已在服务器A中创建。当说
将碎片分配给B
时,这是什么意思

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

3.如何解释这个零活动碎片? 主碎片和复制都已创建,但未处于活动状态。怎么可能呢?除了磁盘存储,是否还有其他开销来激活碎片?e、 记忆

".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来运行它
  • 将此碎片从源服务器复制到目标服务器
  • 激活这个碎片
参考文献

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

  • 您有两个节点群集。ES将尝试在两个节点上分配碎片,以在其中一个节点出现故障时提供HA(甚至为了更好的读/写性能)
  • 与1有关。ES尝试分配碎片accros节点以提供HA。如果两个碎片都在节点A上分配,并且您将节点B添加到集群,ES将尝试将副本碎片移动到B
  • 只创建索引,不创建碎片。所以它告诉您“好的,我已经创建了索引,但是我找不到将其数据放在哪里”。您可以通过运行
    cat shards
    ()找到原因。碎片确实需要内存,因为它们的元数据必须被缓存
  • 这可能是添加副本碎片的过程,可能只有很少的附加条件(如尝试在不包含主碎片、负载最少且可以包含数据的节点上创建副本…)