ElasticSearch para todos – Parte 1

Vamos começar este artigo imaginando uma tarefa bem comum, entrar em um site de e-commerce bem famoso, como o alibaba. Este site possui 60% do mercado de e-commerce da china, consegue imaginar o volume do tráfego de dados ?

Vamos visualizar um cenário. No topo do site, temos uma barra de busca em destaque para você pesquisar sobre o seu produto, categoria e tudo que você quiser buscar dentro deste universo de informações. Você então vai buscar por minons! aqueles bonequinhos amarelos.

Para obter o resultado, seguindo um fluxo básico, o frontend iria fazer uma chamada ao backend, que iria em um banco de dados, fazer uma consulta SQL e retornar os registros, que devem ter brinquedos, roupas, jogos, relógios, bicicletas, action figures e milhares de outros produtos sobre minions.

Só que temos um problema, se essa base de dados tiver milhões de produtos ? e se eu não for a unica pessoa pesquisando e junto comigo, outras 2.000 pessoas também estiverem pesquisando ? e se eu não quiser retornar somente produto, quiser pesquisar sobre categorias, marcas e modelos ? posso também querer que o resultado da busca transforme os dados e me retorne os itens mais comprados nas ultimas semanas.

Outro item importante é se o usuário pesquisar “todos os produtos sobre minion”, o like do SQL vai retornar o resultado que ele espera ?

O cenário acima numa base SQL tradicional seria um grande problema, pois os bancos de dados são excelentes para armazenar dados (meio obvio não?), mas não são bons em buscas como a mencionada acima, onde utilizamos texto e precisamos estruturar os dados retornados.

Exemplo postgreSQL

Para termos um exemplo como base, vamos utilizar uma tabela de um sistema que contem em torno de 3 milhões de registros. Esta tabela foi criada em um sistema em produção em um database postgreSQL, para registrar logs de um trigger bem complexa. Consiste numa tabela com ID, chave estrangeira para o item relacionado e um campo texto descrevendo a ação que a trigger estava executando no momento.

query na chave primária

[cc lang=”sql”]
select * from help_debug where id = 2994228
[/cc]

tempo de resposta: 41 milesegundos

query utilizando a chave estrangeira

[cc lang=”sql”]
select * from help_debug where fk_localizacao = 967980
[/cc]

tempo de resposta: 2.2 segundos

query buscando o texto “ativa” utilizando like

[cc lang=”sql”]
select * from help_debug where descricao like ‘%ativa%’
[/cc]

tempo de resposta: 31.7 segundos

Como podem ver, o tempo de execução para uma busca simples de texto, numa base com 3 milhões de registros, é muito longo e inviabiliza qualquer cenário de busca online, sem contar que nem estamos falando de transformação de dados, machine learning e critérios de relevância.

O que é o elasticsearch ?

O elasticsearch é um motor de busca para textos e também um analytics de código aberto.

Ele é frequentemente utilizado para construir o sistema de busca em sites e aplicativos. Como por exemplo, a própria barra de busca do google.

Estamos falando não somente de otimização de busca e performance, mas também de preenchimento automático, correção de erros de digitação, sinônimos, correspondências e ajustes de relevância.

O elasticsearch não é um ferramenta de BI, mas você também pode realizar consultas agregando dados pra gerar gráficos e obter alguns insights importantes para o seu negocio.

ELK Stack

O elasticsearch é um produto da elastic, ele funciona como o coração de um ecossistema de produtos de analytics, busca e processamento de dados. Quando usamos o termo ELK Stack, estamos nos referindo aos produtos ElasticSearch, LogStash e Kibana, que normalmente são utilizados em conjunto, mas o termo hoje também incorpora o beats e o elastic stack features. Abaixo temos uma resumo de cada um dos produtos desta stack.

ElasticSearch

Acabamos de falar sobre ele, é o coração do stack, todas os outros produtos interagem, mesmo que de forma opcional, com o elasticsearch. Todos os outros produtos que fazem parte da stack, interagem de alguma forma com o elasticsearch e possuem uma forte sinergia com ele.

Kibana

É uma ferramenta de analise e visualização dos dados do elasticsearch, funciona como um dashboard para apresentação dos dados. Ele fornece opções para construção das consultas e como os resultados serão apresentados. O kibana tambem fornece algumas opções para gerenciar o elasticsearch, como autenticação e segurança.

LogStash

Originalmente foi criado para processar registros de log e enviar ao elasticsearch, por isso o nome, mas hoje ele evoluiu para uma ferramenta mais completa e é utilizado para sincronizar os dados de diversas origens com o elasticsearch, como por exemplo uma base em MySQL. O logstash também faz enriquecimento de dados, como por exemplo obter dados geograficos a partir de um IP.

Elastic Stack Features (antigo X-Pack)

É um pacote de recursos que adiciona funcionalidades ao elasticsearch e ao kibana. Com ele você pode adicionar autenticação e autorização utilizando LDAP e Active Directory por exemplo, você pode adicionar usuários e roles permitindo controlar o que cada usuário pode visualizar. Ele oferece também recursos de monitoramento e alerta do funcionamento do elasticsearch, tudo integrado por email, sms, slack e etc …

O X-Pack hoje já não é mais um produto com N funcionalidades, cada funcionalidade agora é um produto único dentro do elastic stack features

Dentre as funcionalidades acima, outro ponto muito importante é o recurso de machine learning, que originalmente não faz parte dos recursos do elastic search. Usando aprendizado de maquina, voce poder identificar anormalidades e ser alertado sobre elas ou fazer analises preditivas sobre comportamento e tendências.

Ainda falando sobre machine learning, existe um recurso chamado graph, que trata de relacionamento sobre os seus dados. Como por exemplo indicar uma próxima musica baseado em sua playlist ou um produto para você comprar que esteja relacionado ao seu carrinho de compras.

Outro recurso interessante é o elasticsearch SQL, que permite que você faça consultas ao elasticsearch utilizando esse tipo de sintaxe, ja conhecida pela maioria dos devs, ao contrario do DSL, que é o formato de consulta utilizado pelo elasticsearch

Beats

Beats é uma coleção de agents que podem ser instalados em locais específicos para enviar informação ao elasticsearch. Por exemplo, você pode ter um agent do windows que envia dados referente ao sistema operacional como consumo de memoria, processamento, logs e varias outras informações, o mesmo para linux e outras plataformas como um jboss ou nginx.

Instalação

A instalação descrita neste artigo utiliza o windows como sistema operacional, mas pode ser instalado também em um ambiente linux ou mac.

java 8

Um item importante antes de iniciar a instalação é que você precisa ter instalada a JVM do java 8, pois o elasticsearch roda em cima do java (ele foi construído a partir do apache lucene).

Se você não está familiarizado com o java, você precisa instalar a JRE que é o runtime pra executar uma aplicação java e talvez você já tenha ela instalada em sua maquina.

Utilize o comando java -version na linha de comando

caso o resultado mostre a versão 1.8.*, você pode pular esta etapa e seguir para o próximo passo. Caso contrario, será necessário instalar a JRE (pode instalar a JDK também, mas não é necessário).

baixe a JRE no endereço: https://www.oracle.com/technetwork/pt/java/javase/downloads/index.html

A instalação é bem simples e basta seguir os passos padrões, no final, repita o comando java -version na linha de comando para ter certeza que o java foi instalado corretamente

Vamos instalar a versão 6.5.4 do elasticsearch, esta versão funciona somente com o java 8, para versões futuras, é importante você verificar as instruções no site de download do elasticsearch.

elastic search

Faça o download do arquivo de instalação no link
https://www.elastic.co/downloads/elasticsearch. A instalação é um arquivo zip e pode ser descompactado para o local de sua preferência.

Após a instalação, abra a linha de comando e execute o arquivo elasticsearch.bat localizado na pasta elastic-search\elasticsearch-6.5.4\bin.

Existe um download beta no site no elastic pra instalar o elasticsearch como serviço do windows, como eu já tinha ele instalado aqui, não cheguei a experimentar, mas se funcionar bem, seria uma melhor opção.

Vai demorar um pouco para subir o elasticsearch a primeira vez. Quando ele finalizar, abra o seu navegador e informe na url localhost:9200, você deverá ver um json com o resultado abaixo indicando o sucesso da instalação

kibana

A instalação do kibana é bem parecida. Baixe o arquivo .zip no endereço https://www.elastic.co/downloads/kibana e descompacte na pasta desejada.

Após a instalação, execute o arquivo kibana.bat localizado na pasta kibana-6.5.4-windows-x86_64\bin e assim como o elasticsearch, vai demorar um pouco para subir a primeira vez. Apos finalizar, acesse a url localhost:5601 e será apresentada a seguinte tela

Neste momento você pode escolher duas opções, a opção padrão para utilizar dados de exemplo, ou seus próprios dados, que no momento, estão vazios. Escolha a opção try our sample data e siga em frente.

Existem 3 opções de dados para testar o kibana, vamos trabalhar em nosso tutorial com os dados de voos, clique no botão Add no bloco Sample Flight Data. Não se preocupe que nos passos seguintes vamos importar nossos próprios dados.

Após a instalação clique em view data


Neste ponto, você pode explorar o kibana, mas todos os seus recursos serão abordados em um outro artigo exclusivo para ele.

Configuração

Para uma instalação padrão não é necessário mexer nos arquivos abaixo, mas é importante conhecer esses recursos para que você possa compreender melhor como funciona o elasticsearch.

elasticsearch

O principal arquivo de configuração do elasticsearch é elasticsearch.yml que fica na pasta elastic-search\elasticsearch-6.5.4\config.

Repare que todas as propriedades estão comentadas, pois de fato elas não são necessárias nesse momento. Você não precisa mexer em nada neste arquivo para este tutorial, mas caso precise no futuro, segue abaixo os principais itens:

cluster.name

Caso você crie um cluster do elasticsearch, que execute em mais de um node, em cada uma das instalações teremos aqui o nome do cluster que deve ser o mesmo. Neste tutorial não abordaremos este conceito, mas ele é importante para uma grande base de dados com muitas requisições.

Resumindo rapidamente, temos N instalações de elastic search distribuídas em N maquinas virtuais (nodes), todas elas juntas formam um único cluster e dependendo das requisições cada node pode ser responsável pela execução da tarefa distribuindo a carga operacional.

node.name

Caso a instalação faça parte de um cluster, aqui deve ser informando o nome do node, que deve ser único dentro de um cluster.

discovery.zen.ping.unicast.hosts

Quando subir uma instalação do elastic search é necessario informar o ip de um node que ja faça parte do cluster para que ele encontre o node e seja sincronizado com o cluster

não é necessário informar todos os IPs de todos os nodes do cluster. Um único Ip já é o suficiente, senão a manutenção seria extremamente difícil cada vez que um node fosse adicionado.

network.host e http.port

Informa o nome e porta que o node vai executar, é importante aqui setar o ip de rede e deixar a porta padrão (9200), a menos que esta porta esteja bloqueada por algum motivo.

Kibana

A configuração do kibana é similar a do elasticsearch, ela também utiliza um arquivo yml (kibana.yml) localizado na pasta config

Assim como o elasticsearch, todas as propriedades estão comentadas, caso você precise mexer em alguma propriedade, segue abaixo um resumo das principais

server.host e server.port

Informa o host e porta que o kibana vai executar, é importante aqui setar o ip de rede e deixar a porta padrão (5601), mas é um case comum disponibilizar o kibana na porta 80 em um subdomínio, neste caso, é aqui que você deve trocar a porta.

elasticsearch.url

Se você modificou a url ou porta do elasticsearch, aqui você deve apontar para o host e porta correto. O kibana se comunica com o elasticsearch para apresentar as informações.

elasticsearch.username e elasticsearch.password

Caso tenha instalado a feature de autenticação para o elasticsearch (basic authentication), você deve informar aqui o usuário e senha para acesso.

Existem diversas propriedades que podem ser customizadas, para mais detalhes segue o link da documentação oficial com todas as opções disponíveis:

https://www.elastic.co/guide/en/kibana/current/settings.html

Agora vamos entender como funciona o elasticsearch

Como Funciona

Esta etapa não é essencial para que você utilize o elasticsearch, mas entender o que ocorre em background, é importante pois quando tiver algum problema no futuro, precisar corrigir algum bug, esse conhecimento vai facilitar para encontrar sua solução.

Clusters e Nodes

Cada node dentro do cluster acima é um servidor com uma instalação do elasticsearch. um node pode ser uma maquina física, uma maquina virtual ou um container docker.

Cada node, possui um conjunto de dados que somado aos dados de todos os outros nodes do cluster, resulta no seu universo de informação. Por exemplo, uma consulta pode resultar em dados que estão no node A e no node C.

Cada um dos nodes também responde as requisições http REST do elasticsearch, o node que recebe a requisição é o node responsável por orquestrar a consulta (master node).

Todos os nodes conhecem os outros nodes do cluster e todos possuem a capacidade de trocar informações entre si através de uma camada de transporte (não é http, este é utilizado somente pra comunicação externa).

Todos os nodes por padrão se juntam em um cluster chamado elasticsearch, mas você pode configurar quantos cluster quiser, lembrando que o nome do cluster deve ser único, assim como o do node.

é uma boa pratica trocar o nome padrão do cluster para evitar que você cometa algum erro conectando um node de homologação em produção.

Documentos

Supondo que seu elasticsearch armazene produtos de um e-commerce. o Produto “TV SAMSUNG 4K 49 Polegadas” é um documento que estará registrado em um dos nodes do seu cluster.

Um documento é um dado no formato JSON, é como se fosse uma linha num banco de dados relacional.

Os documentos são armazenados em indexes que são um conjunto de documentos com dados semelhantes. Uma vez atribuído um índice ao documento, este documento ganha um ID dentro do index. É como se o index fosse uma tabela no banco de dados relacional.

Fragmentação de Índice (Sharding)

Suponha que a sua lista de produtos tenha um total de 2 terabytes de dados e voce tenha dois nodes no cluster, cada um deles com 1 terabyte. O seu index é maior que o espaço de armazenamento de ambos os nodes, como vamos armazenar essa informação ?

O sharding é utilizado para este caso, o index é fragmentada, dividido em pedaços, entre os dois nodes. Veja o exemplo abaixo.

O index chamado produtos, possui um total de 2.4 terabytes de dados, como cada node possui um espaço físico de 1 terabyte, foi necessário fragmenta-lo entre os 3 nodes para armazenar as informações do index.

Na criação de um index, se você não especificar o numero de shards, será adotado o valor padrão de 5 e você consegue redimensionar conforme você achar melhor, permitindo escalar o index facilmente.

a partir da versão 7.0.0 do elasticsearch, o numero de shards default será 1, caso queira continuar utilizando 5, será necessário modificar o arquivo de template ou informar na criação do index.

Outro ponto importante do sharding é que com a fragmentação em nodes, é possível paralelizar a leitura de dados, melhorando a performance das consultas. Isso é feito de forma transparante para o desenvolvedor.

Replicação

Agora vamos a nossa realidade. Você pode ter feito tudo certinho, subiu seu ambiente elastic redondo, perfeito, estado da arte! sexta-feira as 17:45, pouco antes de sair pro happy hour, queimaram duas maquinas no datacenter! você descobre que a origem do problema veio do estagiário de infra que ligou 50 servidores em uma única tomada.

Como resolver esse problema sem perder o seu happy hour e toda sua sexta-feira ?

Para proteger seus dados do estagiário de infra, você pode replicar seus dados entre os nodes, ou seja, se algo der errado com um node, seus dados estarão salvos e prontos para serem utilizados em outro node que está funcionando corretamente.

A replicação no elasticsearch é feita no nível de shards. Como a imagem abaixo

neste ponto você deve estar se perguntando se pode ter um cluster com um único node. Sim, você pode e não tem problema algum, caso precise escalar quando seus dados crescem, você precisara utilizar novos nodes, shards e trabalhar com replication.


por enquanto é só pessoal!

Na parte 2 desta serie vamos por a mão e começar a inserir e extrair informações do elasticsearch. 

Parte 2

Related Posts

ElasticSearch para todos – Parte 3
ElasticSearch para todos – Parte 2
× Como posso te ajudar?