Treinamento Elasticsearch - Parte 1

Post on 18-Jul-2015

215 views 13 download

Transcript of Treinamento Elasticsearch - Parte 1

Introdução ao ElasticsearchLuiz Henrique Zambom Santana

24 de Fevereiro de 2015

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

Apresentação

•Consultor AdHoc•Freelancer

•Autor DevMedia•Doutorando UFSC

Visão

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

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

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

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

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

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

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

Comandos básicos

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

Vamos usar o Sense

•Ótimo plugin para testar comandos:

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"]

},

...

Criar mapeamento

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

POST /goodname/processo/_mapping

{

"processo": {

...(mostrar arquivo)

}

}

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"

Processo de busca

•Lista invertida

Processo de busca

•Analisadores

Buscas

•Tipos mais simples•Match

•Multi match•Prefix•Phrase

•Term•Bool•Dismax

Buscas – Match All

POST /goodname/processo/_search

{

"query": {

"match_all": {}

}

}

Buscas – Match

POST /goodname/processo/_search

{

"query": {

"match": {

"descricao": "carro"

}

}

}

Buscas - Multi match

POST /goodname/processo/_search

{

"query": {

"multi_match": {

"query": "carro",

"fields": [

"descricao",

"palavrachave"

]

}

}

}

Buscas - Prefix

POST /goodname/processo/_search

{

"query": {

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

}

}

Buscas - Phrase

POST /goodname/processo/_search

{

"query": {

"match_phrase": {

"title": "REPRESENTACAO"

}

}

}

Buscas - Term

POST /goodname/processo/_search

{

"query": {

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

}

}

Buscas - Bool

POST /goodname/processo/_search

{

"query": {

"bool": {

"must": [

{}

],

"should": [

{}

],

"must_not": [

{}

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"

}

Buscas•Resultado{

"took": 2,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

Arquitetura

Clientes

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

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

Clientes

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

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

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()

Buscas

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

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

Bulkload

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

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]

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-•

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

Exemplo de Arquitetura Bulkload

Batch/ Scheduler

ES

1. Extração de arquivos

2. Executa comando

3. Chamadasbulk

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

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": {

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

}

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

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();

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

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