Como melhorar a performance de indexação em meu cluster do Amazon OpenSearch Service?

Data da última atualização: 30/07/2021

Quero otimizar as operações de indexação no Amazon OpenSearch Service (sucessor do Amazon Elasticsearch Service) para obter a taxa de transferência máxima de ingestão. Como posso fazer isso?

Resolução

Certifique-se de que os fragmentos sejam distribuídos uniformemente pelos nós de dados para o índice que você está ingerindo

Use a seguinte fórmula para confirmar se os fragmentos são distribuídos uniformemente:

Number of shards for index = k * (number of data nodes), where k is the number of shards per node

Por exemplo, se houver 24 fragmentos no índice e houver oito nós de dados, o OpenSearch Service atribui três fragmentos a cada nó. Para obter mais informações, consulte Primeiros passos com o Amazon OpenSearch Service: De quantos fragmentos eu preciso?

Aumente o refresh_interval para 60 segundos ou mais

Atualize seu índice do OpenSearch Service para disponibilizar seus documentos para pesquisa. Observe que a atualização do índice requer os mesmos recursos usados pelos threads de indexação.

O intervalo de atualização padrão é de 1 segundo. Quando você aumenta o intervalo de atualização, o nó de dados faz menos chamadas de API. O intervalo de atualização pode ser mais curto ou mais rápido, dependendo da duração do intervalo de atualização. Para evitar erros 429, é uma prática recomendada aumentar o intervalo de atualização.

Observação: O intervalo de atualização padrão é de 1 segundo para índices que recebem uma ou mais solicitações de pesquisa nos últimos 30 segundos. Para obter mais informações sobre o intervalo padrão atualizado, consulte _refresh API versão 7.x no site do Elasticsearch.

Altere a contagem de réplicas para zero

Se você está prevendo uma indexação pesada, considere definir o valor index.number_of_replicas como “0”. Cada réplica duplica o processo de indexação. Como resultado, desabilitar as réplicas melhorará a performance do cluster. Depois que a indexação pesada estiver concluída, reative os índices replicados.

Importante: se um nó falhar enquanto as réplicas estiverem desabilitadas, você poderá perder dados. Desabilite as réplicas somente se você puder tolerar a perda de dados por um curto período.

Experimente para encontrar o tamanho ideal da solicitação em massa

Comece com o tamanho da solicitação em massa de 5 a 15 MiB. Em seguida, aumente lentamente o tamanho da solicitação até que a performance da indexação pare de melhorar. Para obter mais informações, consulte Using and sizing bulk requests (“Uso e dimensionamento de solicitações em massa”) no site do Elasticsearch.

Observação: alguns tipos de instância limitam as solicitações em massa a 10 MiB. Para obter mais informações, consulte Limites de rede.

Use um tipo de instância que tenha volumes de armazenamento de instâncias SSD (como I3)

As instâncias I3 fornecem armazenamento rápido e local memory express (NVMe). As instâncias I3 oferecem melhor performance de ingestão do que as instâncias que usam volumes de SSD de uso geral (gp2) do Amazon Elastic Block Store (Amazon EBS). Para obter mais informações, consulte Execução de clusters em escala de petabytes no Amazon Elasticsearch Service usando instâncias I3.

Reduzir o tempo de resposta

Para reduzir o tamanho da resposta do OpenSearch Service, use o parâmetro filter_path para excluir campos desnecessários. Certifique-se de não filtrar os campos necessários para identificar ou tentar novamente as solicitações com falha. Esses campos podem variar de acordo com o cliente.

No exemplo a seguir, os campos index-name, type-name, e took são excluídos da resposta:

curl -X POST "es-endpoint/index-name/type-name/_bulk?pretty&filter_path=-took,-items.index._index,-items.index._type" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test2", "_id" : "1" } }
{ "user" : "testuser" }
{ "update" : {"_id" : "1", "_index" : "test2"} }
{ "doc" : {"user" : "example"} }

Para obter mais informações, consulte Redução do tamanho da resposta.

Aumente o valor de index.translog.flush_threshold_size

Por padrão, index.translog.flush_threshold_size é definido como 512 MB. Isso significa que translog é liberado quando atinge 512 MB. O peso da carga de indexação determina a frequência do translog. Quando você aumenta index.translog.flush_threshold_size, o nó executa a operação de translog com menos frequência. Como as liberações do OpenSearch Service são operações que consomem muitos recursos, a redução da frequência de translogs melhora a performance da indexação. Ao aumentar o tamanho do limite de descarga, o cluster do OpenSearch Service também cria menos segmentos grandes (em vez de vários segmentos pequenos). Segmentos grandes se fundem com menos frequência e mais threads são usados para indexação em vez de mesclar.

Observação: um aumento no index.translog.flush_threshold_size também pode aumentar o tempo que leva para um translog ser concluído. Se um fragmento falhar, a recuperação demorará mais, porque o translog é maior.

Antes de aumentar index.translog.flush_threshold_size, chame a seguinte operação de API para obter as estatísticas atuais da operação de descarga:

$ curl 'os-endpoint/index-name/_stats/flush?pretty'

Substitua os-endpoint e index-name pelas respectivas variáveis.

Na saída, observe o número de descargas e o tempo total. O exemplo de saída a seguir mostra que há 124 descargas, que levaram 17.690 milissegundos:

"flush" { "total" : 124, "total_time_in_millis" : 17690 }

Para aumentar o tamanho do limite de liberação, chame a seguinte operação de API:

$ curl -XPUT 'os-endpoint/index-name/_settings?pretty' -d '{"index":{"translog.flush_threshold_size" : "1024MB"}}'

Neste exemplo, o tamanho do limite de liberação é definido como 1024 MB, o que é ideal para instâncias com mais de 32 GB de memória.

Observação: escolha o tamanho de limite apropriado para o domínio do OpenSearch Service.

Execute a operação da API _stats novamente para ver se a atividade de descarga mudou:

$ curl 'os-endpoint/index-name/_stats/flush?pretty'

Observação: é uma prática recomendada aumentar o index.translog.flush_threshold_size somente para o índice atual. Depois de confirmar o resultado, aplique as alterações ao modelo de índice.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?