如何对 OpenSearch Service 集群中未分配的分片进行故障排除?

3 分钟阅读
0

我的 Amazon OpenSearch Service 集群中有未分配的分片。

简短描述

由于以下原因,您的 OpenSearch Service 中可能有未分配的分片:

  • 集群节点出现故障
  • 副本数量配置不正确
  • 分片无法获得内存锁定
  • 已超过分片限制
  • 磁盘空间问题
  • 磁盘使用偏差和分片策略
  • 集群块异常错误

解决方法

确定未分配分片的原因

要识别未分配的分片并获取更多详细信息,请执行以下步骤:

1.    列出未分配的分片:

curl -XGET 'domain-endpoint/_cat/shards?h=index,shard,prirep,state,unassigned.reason' | grep UNASSIGNED

**注意:**如果您使用的是激活了细粒度访问控制(FGAC)的 AWS Identity and Access Management(IAM)凭证或数据库凭证,则需要采取其他步骤。确保使用您的 IAM 或数据库用户凭证签署对 OpenSearch Service API 的请求。

2.    检索分片未分配原因的详细信息:

curl -XGET 'domain-endpoint/_cluster/allocation/explain?pretty'

3.    (可选)如果使用 Kibana 或 OpenSearch 控制面板,请运行以下 API:

GET _cluster/allocation/explain

集群节点出现故障

如果集群节点出现故障,则分片可能会被取消分配。集群节点出现故障可能是由于集群上的 CPU 使用率过高或硬件故障。要检查集群是否过载,请检查 CPU 利用率和 JVMMemoryPressure 指标。如果集群过载,则可以减少集群的流量。有关说明,请参阅如何解决 OpenSearch Service 集群上的高 JVM 内存压力问题?

节点启动后,分片会自动重新分配。如果集群仍处于红色或黄色状态,您可能会收到类似于以下内容的错误:

 "unassigned_info" : {  "reason" : "MANUAL_ALLOCATION",  "at" : "2022-03-18T02:45:42.730Z",  "details" : """failed shard on node [xxxxxxxxxx]: shard  failure, reason [corrupt file (source: [flush])], failure  FlushFailedEngineException[Flush failed]; nested:  CorruptIndexException[codec footer mismatch (file truncated?): actual  footer=0 vs expected footer=-1071082520   """,  "last_allocation_status" : "no_valid_shard_copy"  },  "can_allocate" : "no_valid_shard_copy",  "allocate_explanation" : "cannot allocate because all found copies of the shard are either stale or corrupt",

您可以使用快照删除和恢复这些索引,步骤如下:

1.    识别并删除红色索引:

GET _cat/indices?health=red
DELETE /index-name

2.    检查是否有成功的快照:

GET _cat/snapshots/cs-automated-enc

3.    从快照恢复索引:

POST _snapshot/Repository-name/snapshot-ID/_restore
{
 "indices": "index-name"
}

有关详细信息,请参阅恢复快照

副本数量配置不正确

如果副本分片的数量大于数据节点的数量,则未分配分片。这是因为不能在同一个节点上分配主分片和副本分片。

要解决此问题,请使用以下命令之一增加节点数量或减少副本数量:

**注意:**请将“n”值更改为所需的值:

curl -XPUT 'domain-endpoint/<indexname>/_settings' -H 'Content-Type: application/json' -d' {  "index" : {  "number_of_replicas" : n  } }
PUT <index-name>/_settings
  {
      "index" : {
        "number_of_replicas" : n
      }
  }

**注意:**有副本分片的单节点集群初始化时,始终为黄色集群状态。单节点集群之所以以这种方式初始化,是因为 OpenSearch Service 没有其他可用的节点可以分配副本。

分片无法获得内存锁定

如果分片未能获得用于分片分配的内存锁定,则会收到以下错误:

"failed_allocation_attempts" : 5,  "details" : "failed shard on node []: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[][5]: obtaining shard lock timed out after 5000ms]; ", . . "explanation" : "shard has exceeded the maximum number of retries [5] on failed allocation attempts - manually call [/_cluster/reroute?retry_failed=true] to retry, [unassigned_info[[reason=ALLOCATION_FAILED], at[], failed_attempts[5], delayed=false, details[failed shard on node [xxxxxxxxxxx]: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[xxxxxxxxx][5]: obtaining shard lock timed out after 5000ms]; ], allocation_status[no_attempt]]]"

要解决错误,请增加最大重试设置:

PUT /<index-name>/_settings {  "index.allocation.max_retries": 10 }

已超过分片限制

OpenSearch Service 版本 7.x 及更高版本的 cluster.max_shards_per_node 设置的默认限制为 1000 分片。最佳做法是将 cluster.max_shards_per_node 设置保持为默认值 1000 分片。如果设置分片分配筛选器来控制 OpenSearch Service 分配分片的方式,则分片可能因没有足够的已筛选节点而处于未分配状态。为了防止出现这种节点短缺的情况,请增加节点数量。

**注意:**请将“n”值更改为所需的值。确保每个主分片的副本数量小于数据节点的数量。

PUT _cluster/settings {  "index" : {  "cluster.max_shards_per_node" : n  } }

有关详细信息,请参阅选择分片数量

磁盘空间问题

基于磁盘的分片分配设置也可能导致出现未分配的分片。例如,如果将 cluster.routing.allocation.disk.watermark.low 指标设置为 50 GB,则指定的磁盘空间量必须可用于分片分配。有关详细信息,请参阅基于磁盘的分片分配设置(在 Elasticsearch 网站上)。

要检查当前基于磁盘的分片分配设置,请使用以下语法:

$ curl -XGET domain-endpoint/_cluster/settings?include_defaults=true&flat_settings=true

要解决磁盘空间问题,请考虑以下方法:

  • 删除黄色和红色集群的所有不需要的索引。
  • 删除红色集群的红色索引
  • 纵向扩展 EBS 卷
  • 添加更多数据节点

**注意:**当集群处于红色运行状态,请避免对集群进行任何配置更改。如果您尝试在域处于红色集群状态时重新配置该域,它可能会停留在“处理中”状态。

磁盘使用偏差和分片策略

由于以下原因,磁盘使用量可能会严重偏差:

  • 集群中的分片大小不均匀。
  • 节点上的可用磁盘空间。
  • 分片分配策略不正确。

默认情况下,Amazon OpenSearch Service 的分片策略为 5:1,其中每个索引分为五个主分片。在每个索引中,每个主分片也有自己的副本。OpenSearch Service 会自动将主分片和副本分片分配给单独的数据节点,并确保在出现故障时有备份。

您可以重新平衡 OpenSearch Service 集群中的分片分配并更新分片策略。有关详细信息,请参阅如果我的 Amazon OpenSearch Service 集群中的分片分配不均匀,如何重新平衡?

集群块异常错误

如果您尝试创建索引或向 OpenSearch Service 域写入数据,则可能会收到类似于以下内容的 ClusterBlockException 错误:

"reason": "blocked by: [FORBIDDEN/6/cluster read-only (api)];",
"type": "cluster_block_exception"

如需解决此错误,请参阅如何解决 OpenSearch Service 中的 403“index_create_block_exception”或“cluster_block_exception”错误?

相关信息

Amazon OpenSearch Service 故障排除

AWS 官方
AWS 官方已更新 10 个月前