Elasticsearch sobrecarregado?

Jeferson Martins
b2w engineering
Published in
6 min readDec 16, 2020

Fazer scaling nem sempre é a solução

Qual é o motivo de um cluster de Elasticsearch ficar sobrecarregado? Você já pensou sobre isso?

Há diversos motivos fáceis de serem percebidos como:

  • Alta quantidade de eventos sendo indexados;
  • Eventos com características diferentes do padrão;
  • Alta quantidade de CPU nos nodes do Elasticsearch;
  • Consultas pesadas demais sendo executadas no Cluster;
  • Falta de configuração dos templates.

Além destes motivos mais óbvios, há dois pontos que fazem com que um cluster de Elasticsearch seja menos saudável e menos estável.

Ponto 1: Falta de planejamento de índices

Planejar os índices de um cluster de Elasticsearch nem sempre é óbvio, como não foi para o nosso time. A necessidade de existir um planejamento surgiu após novos índices que passavam de 100GBs por dia aparecerem, pois a falta de planejamento da distribuição deles no cluster aumentava a demanda de retrabalho.

No nosso caso, os índices eram criados por dia, pelos seguintes motivos:

  • Facilidade no momento de fazer e recuperar os snapshots (backups);
  • Maior facilidade em movimentar shards menores pelo cluster.

Mas mesmo assim , sempre haviam problemas no cluster, como veremos a seguir:

Índices grandes com muita escrita

Esse problema pode afetar diretamente qualquer cluster, onde o responsável não dê a devida atenção ao armazenamento e no tamanho dos índices gerados.

No Elasticsearch, os índices são separados em shards de tamanhos quase equivalentes. Então, em um índice de 100MBs dividido em 3 partes, o Elasticsearch pode separar em 3 shards de 33MBs.

Tudo vai funcionar muito bem se esse índice manter o tamanho descrito acima durante todo o tempo. Mas quando esse índice muda de tamanho e vai para 100GBs, a situação é outra.

Nesse caso, o cluster fica sobrecarregado e o Elasticsearch não consegue armazenar os dados na velocidade que o Logstash envia os dados, causando problemas na fila dos eventos.

A primeira coisa que geralmente as pessoas fazem é o scaling do cluster, mas isso não adianta. A figura abaixo mostra o que acontece quando simplesmente adicionamos 3 novos hosts no cluster:

Podemos observar que a CPU dos hosts não mudou, pois a pressão de escrita continua somente nos 3 primeiros hosts. Para resolver este primeiro cenário, temos que responder a 2 perguntas:

Qual o tamanho máximo de índice e dos shards que meu cluster pode ter?

Sabendo o tamanho máximo do índice e dos shards, podemos definir quantos shards o nosso índice poderá ser dividido. Nesse exemplo, vamos dividir em seis partes, ficando 16,66 GBs por shard.

Podemos ver que o problema diminuiu e o cluster ficou mais balanceado entre os hosts. Nessa situação, fica muito claro quantos shards cada host pode ter, pois temos somente um índice dividido em seis hosts.

O que acontece quando temos mais de 100 índices no cluster de diferentes tamanhos?

Podemos imaginar um cenário onde todos os índices terão o mesmo tamanho e estarão espalhados igualmente no cluster:

Mas a realidade será esta aqui:

Sem planejamento dos índices no cluster, teremos:

  • Shards de índices grandes juntos em um mesmo host;
  • Shards de um mesmo índice em um mesmo host;
  • Concentração de índices pequenos juntos;
  • Desbalanceamento de CPU (poucos hosts com CPU alta e muitos com CPU baixa)

Há 3 pontos de atenção para minimizar este problema:

1 — Monitorar o tamanho dos índices

Podemos monitorar o tamanho dos índices na URL do cluster /_cat/indices.

Nessa URL , é possível ver o tamanho total do índice, seus shards e quantidade de réplicas.

2 — Monitorar a localização dos shards no cluster

Podemos avaliar onde os shards estão pelo endpoint /cat/shards.

Neste endpoint será indicado onde está cada shard do cluster, o que dará a oportunidade de fazer a movimentação entre os nodes, através do endpoint /cluster/reroute.

3 — Configurar o template corretamente

Configurar o Template do índice do ElasticSearch é parte essencial para evitar problemas futuros.

Devemos então:

  • Ter um template por conjunto de índices ou por índice;
  • Especificar a quantidade de shards;
  • Especificar a quantidade de réplicas;
  • Configurar para que um shard não fique em um mesmo host (para índices grandes).

Ponto 2: O horário problemático

O “horário problemático” acontece principalmente quando a maioria dos índices são recriados em um mesmo horário.

No nosso caso, todos os índices eram criados em um mesmo horário (às 21 e 22 horas no antigo horário de verão).

É exatamente este o problema, a criação de todos os índices em um mesmo horário quando há grande pressão de escrita de dados.

Isso acontece porque quando um índice é gerado no Elasticsearch, em um primeiro momento, o cluster deve criar toda a estrutura do índice (todos os shards e todas as réplicas).

Na fase 1, o Elasticsearch deve produzir os shards primários. Nesse momento o índice ficará com o status RED, impossibilitando a escrita no índice até a criação completa de todos os shards primários.

Na fase 2, o Elasticsearch irá criar as réplicas, copiando as primárias para outros hosts, com o objetivo de deixar os dados do índice mais seguros, deixando-os com o status YELLOW até terminar a cópia das réplicas.

Sendo assim, caso não seja planejado como será feita a criação dos índices diários, todos os índices que estão sofrendo escrita são criados no mesmo momento, fazendo com que o cluster do ElasticSearch fique com status RED, parando totalmente a escrita de dados.

Um efeito colateral deste problema é a saúde da equipe, pois todos os dias tínhamos alguém tratando este problema, acompanhando e fazendo scaling do cluster de Logstash.

Mas afinal de contas… Como resolver este problema?

É extremamente simples!

Para minimizar esse efeito do horário problemático, basta simplesmente criar o futuro índice em um horário que ele não esteja recebendo escrita.

Para deixar mais claro o problema, quando o Logstash está configurado para criar um índice por dia ou por hora, de tempos em tempos eles são criados automaticamente, deixando o novo índice criado com status em RED.

Como sabemos exatamente o padrão de nomes dos índices, podemos criar o índice do dia seguinte ou da hora seguinte, criando um processo que faça isso.

Desta forma, quando o Logstash começar a escrever no índice, ele já estará criado, resolvendo o problema.

Concluindo, resolvendo estes 2 pontos, você consegue minimizar problemas que podem afetar o seu cluster sem causa aparente, conseguindo mais qualidade de vida para sua equipe e um cluster mais saudável e sem problemas de retenção.

Se você busca uma oportunidade de desenvolvimento, trabalhando com inovação em um negócio de alto impacto, acesse o portal B2W Carreiras! Nele, você consegue acessar todas as vagas disponíveis. Venha fazer parte do nosso time!

--

--