Como resolvo a exceção “failed to obtain in-memory shard lock” (falha ao obter o bloqueio de fragmento na memória) no Amazon OpenSearch Service?

Data da última atualização: 06/08/2021

Meu cluster do Amazon OpenSearch Service (sucessor do Amazon Elasticsearch Service) ficou amarelo com a mensagem de erro “failed to obtain in-memory shard lock” (falha ao obter o bloqueio de fragmento na memória). Por que estou recebendo essa mensagem de erro e como faço para resolvê-la?

Breve descrição

Se o fragmento não conseguir obter um bloqueio na memória (dentro dos limites definidos para o OpenSearch Service) para alocação de fragmento, você receberá a seguinte mensagem de erro:

"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]]]"

Observação: no OpenSearch Service, o cluster não deve exceder o limite de tempo (5000 ms) e o número máximo de tentativas (5) para alocação de fragmentos.

Para resolver a mensagem de erro, tente as seguintes abordagens:

  • Solucione problemas do status do cluster amarelo.
  • Aumente a configuração de repetição máxima.
  • Atualize a contagem de réplicas.
    Observação: não é uma prática recomendada atualizar a contagem de réplicas para clusters do OpenSearch Service com workloads pesados.

Resolução

Solucionar problemas do status do cluster amarelo

Seu cluster do OpenSearch Service pode entrar no estado amarelo devido a uma falha de nó ou de rede. Se os nós do cluster falharem devido a um problema de hardware interno, os nós existentes serão substituídos por novos nós. Essa substituição é um recurso de detecção automática do OpenSearch Service. No entanto, em alguns casos, os fragmentos de réplica nos nós defeituosos não são atribuídos. Os fragmentos de réplica não são atribuídos quando os recursos usados anteriormente não foram liberados. Durante esse tempo, o nó líder faz cinco tentativas de alocar os fragmentos de réplica. Se as cinco tentativas do nó líder de alocar os fragmentos de réplica não tiverem êxito, o cluster inserirá o status de integridade vermelho ou amarelo.

Observação: é uma prática recomendada executar a API cluster allocation explain para diagnosticar fragmentos não atribuídos. Para obter mais informações, consulte a API cluster allocation explain no site do Elasticsearch.

Para identificar quais índices estão fazendo com que o cluster entre no status amarelo, use a seguinte consulta:

GET /_cat/indices?v&health=yellow

Em seguida, use a seguinte consulta para identificar a causa raiz dos fragmentos não atribuídos do cluster:

GET /_cluster/allocation/explain

Observação: a API cluster reroute não é reconhecida pelo OpenSearch Service. Para obter mais informações sobre operações de API compatíveis, consulte Diferenças notáveis de API.

Aumentar a configuração de repetição máxima

Para retornar seu cluster do OpenSearch Service ao status verde, aumente o número máximo de tentativas para cada índice amarelo:

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

Quando essa chamada de API é executada, o nó líder tenta novamente a alocação de fragmentos para um índice especificado no cluster.

Observação: quando você aumenta a configuração de repetição máxima, os fragmentos nem sempre são atribuídos automaticamente. Talvez você precise atribuir manualmente os fragmentos.

Atualizar a contagem de réplica

Importante: não use essa abordagem se a carga do cluster do OpenSearch Service for alta. Quando você remove todas as réplicas de um índice, o índice deve depender apenas de fragmentos primários. Se um nó ficar inativo, o cluster poderá entrar no status vermelho do cluster porque os fragmentos primários não foram atribuídos.

Para alterar a contagem de réplicas, execute as seguintes etapas:

1.    Remova todas as réplicas para que a contagem de índices afetados se torne 0:

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

2.    Altere a contagem de réplicas de volta para a contagem desejada:

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