gpt4 book ai didi

Elasticsearch: "shard allocation"是什么意思?

转载 作者:行者123 更新时间:2023-11-29 02:53:24 26 4
gpt4 key购买 nike

我们遇到了一个生产事件,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需要分配分片给其他节点?

在我的例子中,我们有两个 elasticsearch 节点,A 和 B。两个分片已经在 A 中创建,并且占用了磁盘空间。

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

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

2。 分配分片的过程是怎样的?

在第一个问题中,我们假设主分片和副本都已在服务器 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. 您有 2 个节点集群。 ES 将尝试在两个节点上分配分片以提供 HA,以防其中一个节点发生故障(甚至为了更好的读/写性能)
  2. 与 1 有关。ES 尝试分配分片到节点以提供 HA。如果两个分片都分配在节点 A 上,并且您将节点 B 添加到集群,ES 将尝试将副本分片移动到 B。
  3. 只创建索引,不创建分片。所以它告诉你“好的,我已经成功地创建了索引,但我找不到放置它的数据的地方”。您可以通过运行 cat shards ( https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html ) 找到原因。分片确实会消耗内存,因为它们的元数据必须被缓存。
  4. 这可能是添加副本分片的过程,可能还有一些额外的条件(比如尝试在不包含主分片且负载最小且可以包含数据的节点上创建副本......)

关于Elasticsearch: "shard allocation"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56684152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com