如何解决 Amazon OpenSearch Service 中“无法获取内存中分片锁”的异常?

上次更新日期: 2021 年 8 月 6 日

我的 Amazon OpenSearch Service 集群变为黄色,显示“无法获取内存中分片锁”错误消息。为什么我会收到此错误消息,我该如何解决?

简短描述

如果您的分片无法为分片分配获取内存锁(在 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 [lga-THKoSXykhSDbghN57A]: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[evelog-zdn-2020.04.28][5]: obtaining shard lock timed out after 5000ms]; ], allocation_status[no_attempt]]]"

注意: 在 OpenSearch Service 中,您的集群不得超过分片分配的时间限制 (5000ms) 和最大重试次数 (5)。

要解决错误消息,请尝试以下方法:

  • 排查您的黄色群集状态。
  • 增加最大重试设置。
  • 更新副本数量。
    注意: 为具有繁重工作负载的 OpenSearch Service 集群更新副本数量不是最佳实践。

解决方法

排查您的黄色群集状态

由于节点或网络故障,您的 OpenSearch Service 群集会进入黄色状态。如果集群中的节点因内部硬件问题出现故障,则现有节点将被新节点替换。此替换是 OpenSearch Service 的自动检测功能。但是,在某些情况下,故障节点中的副本分片尚未分配。如果先前使用的资源尚未释放,则副本分片将保留未分配状态。在此期间,领导节点进行了五次分配副本分片尝试。如果领导节点的五次分配副本分片尝试都失败,则您的集群将进入红色或黄色运行状态。

注意: 诊断未分配分片是运行 集群分配说明 API 的最佳实践。有关更多信息,请参阅 Elasticsearch 网站上的 集群分配说明 API

要识别哪些索引导致集群进入黄色状态,请使用以下查询:

GET /_cat/indices?v&health=yellow

然后,使用以下查询来识别集群未分配分区的根本原因:

GET /_cluster/allocation/explain

注意:OpenSearch Service 无法识别集群重新路由 API。有关支持的 API 操作的更多信息,请参阅显著的 API 差异

增加最大重试设置

要使 OpenSearch Service 集群恢复到绿色状态,请增加每个黄色索引的最大重试次数:

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

运行此 API 调用时,领导节点将重试您的集群上指定索引的分片分配。

注意: 当您增加最大重试设置时,分片不会总是自动分配。您可能需要手动分配分片。

更新副本数量

重要提示: 如果 OpenSearch Service 集群负载高,请不要使用此方法。从索引中删除所有副本时,索引必须且仅能依赖于主分片。如果节点出现故障,您的集群则可能因为主分区尚未分配而进入红色集群状态

要更改副本数量,请执行以下步骤:

1.    删除所有副本,使受影响的索引数量变为 0:

PUT /<yellow-index-name>/_settings
{
    "index" : {
        "number_of_replicas" : 0
    }
}

2.    将副本数量更改回所需的数量:

PUT /< yellow -index-name>/_settings
{
    "index" : {
        "number_of_replicas" : 1
    }
}

Amazon OpenSearch Service 是 Amazon Elasticsearch Service 的后继者。