45
Introdução ao Elasticsearch Luiz Henrique Zambom Santana 24 de Fevereiro de 2015

Treinamento Elasticsearch - Parte 1

Embed Size (px)

Citation preview

Page 1: Treinamento Elasticsearch - Parte 1

Introdução ao ElasticsearchLuiz Henrique Zambom Santana

24 de Fevereiro de 2015

Page 2: Treinamento Elasticsearch - Parte 1

Agenda

•Visão e Histórico•Conceitos

•Instalação•Sense

•Desenvolvimento•Buscas•Clientes•Cliente Java•Bulkload

•Monitoramento•Problemas•Plugins

•Arquitetura•Conclusões e próximos passos

Page 3: Treinamento Elasticsearch - Parte 1

Apresentação

•Consultor AdHoc•Freelancer

•Autor DevMedia•Doutorando UFSC

Page 4: Treinamento Elasticsearch - Parte 1

Visão

•“flexible and powerful open source,distributed real-time search andanalytics engine for the cloudcool. bonsaicool”

Page 5: Treinamento Elasticsearch - Parte 1

Histórico

•Primeira versão lançada em 2010•Pelo Israelense Shay Banon (https://twitter.com/kimchy)•Código aberto em:

•https://github.com/elasticsearch/elasticsearch•Suportado pela empresa Elasticsearch, com sede em Amsterdam•A Elasticsearch também suporta o Kibana e o Logstash

Page 6: Treinamento Elasticsearch - Parte 1

Conceitos básicos

•Um mecanismo de busca textual•Não é um banco de dados tradicional, pois:

•Não usa SQL•Não suporta transações•Não possui mecanismos de autenticação•...

•É baseado no Apache Lucene, um framework Java que facilita busca em textos

Page 7: Treinamento Elasticsearch - Parte 1

Conceitos básicos

•Alguns dos conceitos do ES são derivados do Lucene•Índice (como um banco de dados)•Documento, um texto formatado em JSON•Campo•Mapeamento

Page 8: Treinamento Elasticsearch - Parte 1

Conceitos básicos – comparação com BDR

Lucene Banco de dados relacional (BDR)

Índice (Index) Esquema

Type Tabela

Documento (JSON) Linha

Campo (Field) Coluna

Mapeamento (Mapping) Estrutura da tabela

Query DSL SQL

Page 9: Treinamento Elasticsearch - Parte 1

Instalação

•A instalação do ES é bastante simples:•Baixar o zip do site:

•http://www.elasticsearch.org/overview/elkdownloads/

•Deszipar e executar:•bin/elasticsearch

•Como serviço no Linux:•apt-get –install elasticsearch•yum install elasticsearch

•Para verificar se está executando:•sudo /etc/init.d/elasticsearch start•curl http://127.0.0.1:9200•sudo /etc/init.d/elasticsearch stop

Page 10: Treinamento Elasticsearch - Parte 1

Instalação

•/etc/elasticsearch/bin: contém os scripts binários para iniciar e parar cada nó, usando o comando /bin/elasticsearch start;•/etc/elasticsearch/conf: contém arquivos de configuração, como o elasticsearch.yml e o logging.yml;•/etc/default/elasticseach: que contém as variáveis de ambiente como tamanho de heap, e quantidade de descritores de arquivos; •/var/lib/elasticsearch/data: onde se localiza os arquivos de dados para cada índice, shard alocado para cada nó;•/var/log/elasticsearch: onde fica os arquivos de log, incluindo o log de uso e o slowlog;•/usr/share/elasticsearch/plugins: onde localiza-se os arquivos de plug-n, sendo que cada plug-in fica contido em um subdiretório

Page 11: Treinamento Elasticsearch - Parte 1

Comandos básicos

•O que podemos fazer com o ES?•Criar índice•Criar mapeamento•Inserir documento•Recuperar documento•Alterar documento•Excluir documento

Page 12: Treinamento Elasticsearch - Parte 1

Vamos usar o Sense

•Ótimo plugin para testar comandos:

Page 13: Treinamento Elasticsearch - Parte 1

Criar um índice

•Forma mais simples:•PUT /goodname

•Podemos também adicionar configurações na criação desse índice:PUT / goodname/{

"number_of_shards": 5,

"number_of_replicas": 1,

"analysis": {

"analyzer": {

"sinonimo": {

"tokenizer": "whitespace",

"filter": [ "lowercase", "filtro_sinonimo"]

},

...

Page 14: Treinamento Elasticsearch - Parte 1

Criar mapeamento

•Exemplo de criação de índice e de mapeamento:

POST /goodname/processo/_mapping

{

"processo": {

...(mostrar arquivo)

}

}

Page 15: Treinamento Elasticsearch - Parte 1

Indexar documentos

POST /goodname/processo/1

{

“numero" : “49484/2010",

“interessado" : “CAMARA MUNICIPAL DE NOVA OLIMPIA",

“descricao" : “REPRESENTACAO REF IRREGULARIDADES DA ATUAL

GESTAO, NO QUE SE REFERE AO USO INDEVIDO DE CARRO PARA ATENDER

INTERESSES PESSOAIS/MULTAS DE TRANSITO RECOLHIDAS COM RECURSOS

PUBLICOS, ETC"

}

POST /goodname/processo/2

{

“numero" : “154440/2002",

“relator" : “ANTONIO JOAQUIM",

“descricao" : “CONTRATO Nº 023/C/2002, A PRESTACAO DE

SERVICOS DE MAO DE OBRA NOS CARROS OFICIAIS DA SEDUC NO VALOR DE R$

79827,50"

Page 16: Treinamento Elasticsearch - Parte 1

Processo de busca

•Lista invertida

Page 17: Treinamento Elasticsearch - Parte 1

Processo de busca

•Analisadores

Page 18: Treinamento Elasticsearch - Parte 1

Buscas

•Tipos mais simples•Match

•Multi match•Prefix•Phrase

•Term•Bool•Dismax

Page 19: Treinamento Elasticsearch - Parte 1

Buscas – Match All

POST /goodname/processo/_search

{

"query": {

"match_all": {}

}

}

Page 20: Treinamento Elasticsearch - Parte 1

Buscas – Match

POST /goodname/processo/_search

{

"query": {

"match": {

"descricao": "carro"

}

}

}

Page 21: Treinamento Elasticsearch - Parte 1

Buscas - Multi match

POST /goodname/processo/_search

{

"query": {

"multi_match": {

"query": "carro",

"fields": [

"descricao",

"palavrachave"

]

}

}

}

Page 22: Treinamento Elasticsearch - Parte 1

Buscas - Prefix

POST /goodname/processo/_search

{

"query": {

"prefix" : { "relator" : "ANTONIO" }

}

}

Page 23: Treinamento Elasticsearch - Parte 1

Buscas - Phrase

POST /goodname/processo/_search

{

"query": {

"match_phrase": {

"title": "REPRESENTACAO"

}

}

}

Page 24: Treinamento Elasticsearch - Parte 1

Buscas - Term

POST /goodname/processo/_search

{

"query": {

"term" : { "numero" : "100587/2003" }

}

}

Page 25: Treinamento Elasticsearch - Parte 1

Buscas - Bool

POST /goodname/processo/_search

{

"query": {

"bool": {

"must": [

{}

],

"should": [

{}

],

"must_not": [

{}

Page 26: Treinamento Elasticsearch - Parte 1

Buscas – Dismax (mudança na forma de calcular o score)

POST /goodname/processo/_search

{

"query": {

"dis_max": {

"tie_breaker": 0.7,

"boost": 1.2,

"queries": [

{

"term": {

"status": "fechado"

}

Page 27: Treinamento Elasticsearch - Parte 1

Buscas•Resultado{

"took": 2,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

Page 28: Treinamento Elasticsearch - Parte 1

Arquitetura

Page 29: Treinamento Elasticsearch - Parte 1

Clientes

•Java, Javascript, PHP, Python...•Em Java

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>1.3.2</version></dependency>

Page 30: Treinamento Elasticsearch - Parte 1

Clientes

•O cliente Java permite, por exemplo:•Realizar buscas•Criar índice•Criar mapeamentos•Verificar estado dos nós•Realizar atividades de manutenção

Page 31: Treinamento Elasticsearch - Parte 1

Criar um cliente•Definir

•Nome do cluster•Endereços de rede•IMPORTANTE:

•Todos nós do cluster devem ser adicionados ao cliente, isto garante:•Round-Robin•O cliente irá procurar os nós disponíveis

Page 32: Treinamento Elasticsearch - Parte 1

Adicionar um documento

public void create(String id, String produto, String descricao, double preco) throws IOException {

XContentBuilder builder = jsonBuilder().startObject()

.field(" produto ", produto)

.field(" descricao ", descricao)

.field(" preco ", preco).endObject();

client.prepareIndex(index, type, id).setSource(builder).execute()

Page 33: Treinamento Elasticsearch - Parte 1

Buscas

•Tipos de busca•Item coberto•Endereço•Auto complete•Geográfico

•Importante:•Também utiliza o XContentBuilder•Retorno em hits•Ordenado por score

Page 34: Treinamento Elasticsearch - Parte 1

Bulkload

•Controlar o tamanho do bulk•Lista de falhas•Possível enviar indexação, alteração ou exclusão em uma mesma chamada

Page 35: Treinamento Elasticsearch - Parte 1

Plugins

•Site plugins•HEAD

•http://localhost:9200/_plugin/head/•plugin -install mobz/elasticsearch-head

•BigDesk•http://localhost:9200/_plugin/bigdesk/•plugin -install lukas-vlcek/bigdesk

•Inquisitor•https://github.com/polyfractal/elasticsearch-inquisitor•plugin -install polyfractal/elasticsearch-inquisitor•plugin --url file:///c:/tmp/elasticsearch-inquisitor-master.zip --install inquisitor

•Synonyms•Na inicialização de cada nó:

•[2015-01-14 08:54:33,515][INFO ][plugins ] [Seth] loaded [analysis-phonetic], sites [bigdesk, head, inquisitor]

Page 36: Treinamento Elasticsearch - Parte 1

Curator

•É um script escrito em python, que permite gerenciar os índices do ES•https://github.com/elasticsearch/curator•Instalação:

•Instalar pip, gerenciador de pacotes do python, se a máquina tem Python 2.7.9 ou mais novo, o pip já está instalador

•# yum -y install python-pip

•Executar•pip install elasticsearch-curator

•Configurar o comando de exclusão abaixo para ser executado diariamente•curator delete --older-than 7 --prefix .marvel-•

Page 37: Treinamento Elasticsearch - Parte 1

Instalação

•cluster.name: agoodname•node.name: "anothergoodname"•discovery.zen.ping.multicast.enabled: false•discovery.zen.ping.unicast.hosts: ["10.0.0.201", "10.0.0.202", "10.0.0.203"]•bootstrap.mlockall: true•script.disable_dynamic: false

Page 38: Treinamento Elasticsearch - Parte 1

Exemplo de Arquitetura Bulkload

Batch/ Scheduler

ES

1. Extração de arquivos

2. Executa comando

3. Chamadasbulk

Page 39: Treinamento Elasticsearch - Parte 1

Exemplo de Arquitetura com Java e BD

NavegadorNavegador

NavegadorJava

ES

1. HTTP2. HTTP

3. Broadcast para o cluster:A.Repassa a consulta para todos os nósB.Recebe resultados e ordena de acordo com scoreC.Retorna para o cliente

4. IDs

5. Consulta por IDs

6. Retornavalorescompletos

7. HTTP

Page 40: Treinamento Elasticsearch - Parte 1

Considerações sobre arquitetura

•Número de threads•# nó: 3x4 (processadores): 12•# cluster: 12x4: 48•For count/search operations. Defaults to fixed with a size of 3x # of available processors, queue_size of 1000.

•Thread pool•http://10.2.0.242:9200/_cat/thread_pool•http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat-thread-pool.html

•Para recuperar as configurações•http://10.2.0.242:9200/_cluster/settings

•Modificar apenas o tamanho da filaPUT _cluster/settings{

"persistent": {},"transient": {

Page 41: Treinamento Elasticsearch - Parte 1

Considerações sobre arquitetura

•Balanceamento de shards:•Com os valores padrão o cluster pode entrar em um estado no qual alguns nós possuem mais shards primários que outros, como ilustrado pelo HEAD. Nesse caso, os nós 1 e 4 vão receber muito menos chamados que os nós 2 e 3, pois não possuem nós primários.

•Para alterar isso, devemos modificar os padrões de alocação da seguinte forma:

PUT _cluster/settings{

"persistent": {},"transient": {

"threadpool.search.queue_size":2000,“cluster.routing.allocation.balance.shard”:0.8,“cluster.routing.allocation.balance.index”:0.2“cluster.routing.allocation.balance.primary”:0.8,“cluster.routing.allocation.balance.threshold”:0.2

}

Page 42: Treinamento Elasticsearch - Parte 1

Considerações sobre arquitetura

•Gargalos possíveis:•Aumentar paralelismo e concorrência:

•Número de shards•Número de réplicas

•Aumentar o intervalo de refresh•Criar índices diários•Warmers•Routing ou índice por cliente•Slowlog•Curator e Marvel

Page 43: Treinamento Elasticsearch - Parte 1

Considerações sobre arquitetura

•Index alias•Manualmente

•PUT /nome_index_v1/_alias/nome_index/

•Java•client.admin().indices().prepareAliases().addAlias("nome_index_v1", "nome_index").execute().get();

Page 44: Treinamento Elasticsearch - Parte 1

Conclusões

•Rápida evolução•Setembro/2014: 1.3.1•Janeiro/2015: 1.4.2

•Instalar Inquisitor e BigDesk em produção•Analisar desempenho de forma contínua•Ferramentas como o Marvel•Outras ferramentas interessantes do Elasticsearch

•Agregação•Percolation

•Gargalo:•Bulkload•Uso do banco de dados•Uso de Redis•Uso de memória

Page 45: Treinamento Elasticsearch - Parte 1

Referências

•https://gist.github.com/reyjrar/4364063•http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-problem-in-elasticsearch/•http://www.elasticsearch.org/blog/performance-considerations-elasticsearch-indexing/•https://www.found.no/foundation/optimizing-elasticsearch-searches/•https://blog.codecentric.de/en/2014/05/elasticsearch-indexing-performance-cheatsheet/•https://www.youtube.com/watch?v=LDyxijDEqj4