Elasticsearch é um mecanismo de pesquisa e análise NoSQL fácil de começar a usar para análise de log, pesquisa de texto, análise em tempo real e muito mais. Dito isso, sob o capô o Elasticsearch é um sistema complexo e distribuído com muitas alavancas a serem acionadas para alcançar o desempenho ideal.
Neste blog, abordamos soluções para desafios comuns de desempenho do Elasticsearch em escala, incluindo indexação lenta, velocidade de pesquisa, dimensionamento de fragmentos e índices e multilocação. Muitas soluções originam-se de entrevistas e discussões com líderes de engenharia e arquitetos que têm experiência prática na operação do sistema em escala.
Ao lidar com cargas de trabalho com alto rendimento de gravação, pode ser necessário ajustar o Elasticsearch para aumentar o desempenho da indexação. Fornecemos diversas práticas recomendadas para ter recursos adequados disponíveis para indexação, de modo que a operação não afete o desempenho da pesquisa em seu aplicativo:
Aumente o intervalo de atualização : o Elasticsearch disponibiliza novos dados para pesquisa, atualizando o índice. As atualizações são definidas para ocorrer automaticamente a cada segundo quando um índice recebe uma consulta nos últimos 30 segundos. Você pode aumentar o intervalo de atualização para reservar mais recursos para indexação.
Use a API em massa : ao ingerir dados em grande escala, sabe-se que o tempo de indexação usando a API de atualização leva semanas . Nesses cenários, você pode acelerar a indexação de dados de maneira mais eficiente em termos de recursos usando a API em massa. Mesmo com a API em massa, você deseja estar ciente do número de documentos indexados e do tamanho geral da solicitação em massa para garantir que ela não prejudique o desempenho do cluster. A Elastic recomenda comparar o tamanho em massa e, como regra geral, é de 5 a 15 MB/solicitação em massa .
Aumentar o tamanho do buffer de índice : você pode aumentar o limite de memória para solicitações de indexação pendentes acima do valor padrão de 10% do heap. Isso pode ser recomendado para cargas de trabalho com muita indexação, mas pode afetar outras operações que consomem muita memória.
Desativar replicação: você pode definir a replicação como zero para acelerar a indexação, mas isso não é recomendado se o Elasticsearch for o sistema de registro de sua carga de trabalho.
Limite upserts e mutações de dados no local : inserções, atualizações e exclusões exigem que documentos inteiros sejam reindexados. Se você estiver transmitindo CDC ou dados transacionais para o Elasticsearch, considere armazenar menos dados, pois haverá menos dados para reindexar.
Simplifique a estrutura de dados: lembre-se de que o uso de estruturas de dados como objetos aninhados aumentará as gravações e os índices. Ao simplificar o número de campos e a complexidade do modelo de dados, você pode acelerar a indexação.
Quando suas consultas demoram muito para serem executadas, isso pode significar que você precisa simplificar seu modelo de dados ou remover a complexidade da consulta. Aqui estão algumas áreas a serem consideradas:
Crie umíndice composto : mescle os valores de dois campos de baixa cardinalidade para criar um campo de alta cardinalidade que possa ser facilmente pesquisado e recuperado. Por exemplo, você pode mesclar um campo com CEP e mês, se esses forem dois campos que você normalmente filtra para sua consulta.
Habilite o roteamento personalizado de documentos: o Elasticsearch transmite uma consulta a todos os fragmentos para retornar um resultado. Com o roteamento personalizado, você pode determinar em qual fragmento seus dados residem para acelerar a execução da consulta. Dito isso, você deve estar atento a pontos de acesso ao adotar o roteamento personalizado.
Use o tipo de campo de palavra-chave para pesquisas estruturadas: quando você deseja filtrar com base no conteúdo, como ID ou CEP, é recomendado usar o tipo de campo de palavra-chave em vez do tipo inteiro ou outros tipos de campo numérico para recuperação mais rápida.
Afaste-se dos objetos pai-filho e aninhados : os relacionamentos pai-filho são uma boa solução alternativa para a falta de suporte de junção no Elasticsearch e ajudaram a acelerar a ingestão e limitar a reindexação. Eventualmente, as organizações atingem os limites de memória com esta abordagem. Quando isso ocorrer, você poderá acelerar o desempenho da consulta fazendo a desnormalização dos dados.
Muitos desafios de escalabilidade com o Elasticsearch se resumem à estratégia de fragmentação e indexação. Não existe uma estratégia que sirva para todos quantos fragmentos você deve ter ou qual o tamanho deles. A melhor maneira de determinar a estratégia é executar testes e benchmarks em cargas de trabalho de produção uniformes. Aqui estão alguns conselhos adicionais a serem considerados:
Use a API Force Merge : use a API Force Merge para reduzir o número de segmentos em cada fragmento. As mesclagens de segmentos acontecem automaticamente em segundo plano e removem quaisquer documentos excluídos. Usar uma mesclagem forçada pode remover manualmente documentos antigos e acelerar o desempenho. Isso pode consumir muitos recursos e, portanto, não deve acontecer durante o pico de uso.
Cuidado com o desequilíbrio de carga : o Elasticsearch não tem uma boa maneira de entender a utilização de recursos por fragmento e levar isso em consideração ao determinar o posicionamento do fragmento. Como resultado, é possível ter fragmentos quentes. Para evitar essa situação, você pode considerar ter mais fragmentos do que notas de dados e fragmentos menores do que nós de dados.
Use índices baseados em tempo : índices baseados em tempo podem reduzir o número de índices e fragmentos em seu cluster com base na retenção. O Elasticsearch também oferece uma API de índice de rollover para que você possa fazer rollover para um novo índice com base na idade ou no tamanho do documento para liberar recursos.
As estratégias mais comuns para multilocação são ter um índice por cliente ou locatário ou usar roteamento personalizado. Veja como você pode avaliar as estratégias para sua carga de trabalho:
Índice por cliente ou locatário: configurar índices separados por cliente funciona bem para empresas que têm uma base de usuários menor, de centenas a alguns milhares de clientes, e quando os clientes não compartilham dados. Também é útil ter um índice por cliente se cada cliente tiver seu próprio esquema e precisar de maior flexibilidade.
Roteamento personalizado: o roteamento personalizado permite especificar o fragmento no qual reside um documento, por exemplo, ID do cliente ou ID do locatário, para especificar o roteamento ao indexar um documento. Ao consultar com base em um cliente específico, a consulta irá diretamente para o fragmento que contém os dados do cliente para tempos de resposta mais rápidos. O roteamento personalizado é uma boa abordagem quando você tem um esquema consistente entre seus clientes e muitos clientes, o que é comum quando você oferece um modelo freemium.
O Elasticsearch foi projetado para casos de uso de análise de log e pesquisa de texto. Muitas organizações que usam o Elasticsearch para análises em escala em tempo real terão que fazer concessões para manter o desempenho ou a eficiência de custos, incluindo a limitação da complexidade da consulta e da latência de ingestão de dados. Quando você começa a limitar os padrões de uso, seu intervalo de atualização excede seu SLA ou você adiciona mais conjuntos de dados que precisam ser unidos, pode fazer sentido procurar alternativas ao Elasticsearch.
Rockset é uma das alternativas e foi desenvolvido especificamente para ingestão de dados de streaming em tempo real e consultas de baixa latência em escala. Aprenda como migrar do Elasticsearch e explorar as diferenças arquitetônicas entre os dois sistemas.