Elastic Search

Práticas recomendadas do Elasticsearch e aumento de desempenho

Práticas recomendadas do Elasticsearch e aumento de desempenho
Nesta postagem, tentaremos coletar as melhores práticas e também o que evitar ao trabalhar com o Elasticsearch e alimentar dados nele. Desta forma, saberemos de que tudo precisamos cuidar antes mesmo de começarmos a trabalhar com este excelente Search Engine.

Elasticsearch Best Practices

Começaremos a trabalhar com as melhores práticas a serem seguidas com Elasticsearch e quais problemas ele pode criar quando evitamos esses pontos. Vamos começar.

Sempre defina mapeamentos ES

Uma coisa que o ES certamente pode fazer é trabalhar sem mapeamentos. Então, quando você começa a alimentar dados JSON para seu índice ES, ele itera sobre os campos de dados e cria um mapeamento adequado. Isso parece direto e fácil, pois o ES está selecionando o próprio tipo de dados. Com base em seus dados, pode ser necessário que um campo seja de um tipo de dados específico.

Por exemplo, suponha que você indexe o seguinte documento:


"id": 1,
"title": "Instalar ElasticSearch no Ubuntu",
"link": "https: // linuxhint.com / install-elasticsearch-ubuntu / ",
"data": "25/03/2018"

Desta forma, Elasticsearch marcará o campo “data” como tipo “data”. Mas quando você indexa o seguinte documento:


"id": 1,
"title": "ES Best Practices and Performance",
"data": "Pendente"

Desta vez, o tipo do campo de data foi alterado e o ES lançará um erro e não permitirá que seu documento seja indexado. Para tornar as coisas mais fáceis, você pode indexar alguns documentos, ver quais campos são indexados por ES e obter o mapeamento deste URL:

GET / index_name / doc_type / _mapping

Dessa forma, você não terá que construir o mapeamento completo também.

Bandeiras de produção

O nome do cluster padrão que o ES inicia é chamado elasticsearch. Quando você tem muitos nós em seu cluster, é uma boa ideia manter os sinalizadores de nomenclatura o mais consistentes possível, como:

grupo.nome: app_es_production
nó.nome: app_es_node_001

Além disso, as configurações de recuperação para nós também importam muito. Suponha que alguns dos nós em um cluster reiniciem devido a uma falha e alguns nós reiniciem um pouco depois de outros nós. Para manter os dados consistentes entre todos esses nós, teremos que executar um programa de consistência que manterá todos os clusters em um estado consistente.

Porta de entrada.recovery_after_nodes: 10

Também é útil quando você informa ao cluster com antecedência quantos nós estarão presentes no cluster e de quanto tempo de recuperação serão necessários:

Porta de entrada.esperados_nodes: 20
Porta de entrada.recovery_after_time: 7m

Com a configuração correta, uma recuperação que levaria horas pode levar apenas um minuto e pode economizar muito dinheiro para qualquer empresa.

Provisionamento de capacidade

É importante saber quanto espaço seus dados ocuparão e a taxa na qual eles fluem para o Elasticsearch, porque isso decidirá a quantidade de RAM necessária em cada um dos nós do cluster e também no nó mestre.

Claro, não há diretrizes específicas para atingir os números necessários, mas podemos tomar algumas medidas que nos fornecem uma boa ideia. Uma das etapas será simular o caso de uso. Faça um cluster ES e alimente-o com quase a mesma taxa de dados que você esperaria com sua configuração de produção. O conceito de comece grande e diminua também pode ajudá-lo a ser consistente sobre quanto espaço é necessário.

Modelos grandes

Ao definir grandes modelos indexados, você sempre enfrentará problemas relacionados à sincronização do modelo em seus vários nós do cluster. Sempre observe que o modelo terá que ser redefinido sempre que ocorrer uma mudança no modelo de dados. É uma ideia muito melhor mantenha os modelos tão dinâmicos. Os modelos dinâmicos atualizam automaticamente os mapeamentos de campo com base nos mapeamentos que definimos anteriormente e nos novos campos. Observe que não há substituto para manter os modelos tão pequenos quanto possível.

2Usando mlockall em servidores Ubuntu

O Linux faz uso do processo de troca quando precisa de memória para novas páginas. A troca torna as coisas mais lentas, pois os discos são mais lentos que a memória. O mlockall propriedade na configuração do ES informa ao ES para não trocar suas páginas da memória, mesmo que elas não sejam necessárias por enquanto. Esta propriedade pode ser definida no arquivo YAML:

bootstrap.mlockall: true

No ES v5.x + versões, esta propriedade foi alterada para:

bootstrap.memory_lock: true

Se você estiver usando esta propriedade, apenas certifique-se de fornecer ao ES com memória heap grande o suficiente usando o -DXmx opção ou ES_HEAP_SIZE.

Minimize as atualizações de mapeamento

O desempenho de um cluster é ligeiramente afetado sempre que você faz solicitações de atualização de mapeamento em seu cluster ES. Se você não pode controlar isso e ainda deseja fazer atualizações nos mapeamentos, você pode usar uma propriedade no arquivo de configuração ES YAML:

índices.grupo.send_refresh_mapping: false

Quando a solicitação de atualização do modelo está na fila pendente para o nó mestre e envia dados com o mapeamento antigo para os nós, ele também deve enviar uma solicitação de atualização posteriormente para todos os nós. Isso pode tornar as coisas lentas. Quando definimos a propriedade acima como false, isso faz sentido que uma atualização tenha sido feita no mapeamento e não enviará a solicitação de atualização para os nós. Observe que isso só é útil se você fizer muitas alterações em seus mapeamentos regularmente.

Thread-pool otimizado

Os nós ES têm muitos pools de encadeamentos para melhorar a forma como os encadeamentos são gerenciados dentro de um nó. Mas existem limitações sobre a quantidade de dados que cada thread pode cuidar. Para rastrear esse valor, podemos usar uma propriedade ES:

Grupo de discussão.volume.tamanho_da_fila: 2000

Isso informa ao ES o número de solicitações em um fragmento que podem ser enfileiradas para execução no nó quando não há thread disponível para processar a solicitação. Se o número de tarefas for maior do que este valor, você obterá um RemoteTransportException. Quanto maior for esse valor, maior será a quantidade de espaço de heap será necessária em sua máquina de nó e o heap de JVM será consumido também. Além disso, você deve manter seu código pronto, caso essa exceção seja lançada.

Conclusão

Nesta lição, vimos como podemos melhorar o desempenho do Elasticsearch evitando erros comuns e não tão comuns que as pessoas cometem. Leia mais artigos do Elasticsearch no LinuxHint.

Como mostrar o contador de FPS em jogos Linux
Os jogos Linux tiveram um grande impulso quando a Valve anunciou o suporte Linux para o cliente Steam e seus jogos em 2012. Desde então, muitos jogos ...
Como baixar e jogar Sid Meier's Civilization VI no Linux
Introdução ao jogo Civilization 6 é uma versão moderna do conceito clássico introduzido na série de jogos Age of Empires. A ideia era bastante simples...
Como instalar e jogar Doom no Linux
Introdução ao Doom A série Doom teve origem nos anos 90 após o lançamento do Doom original. Foi um sucesso instantâneo e, a partir desse momento, a sé...