Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何对 OpenSearch Service 集群中未分配的分片进行故障排除?
我的 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”错误?
相关信息
- 语言
- 中文 (简体)
