如何对 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”错误?
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前