DevCommerce Conference 2016 - Workshop: Desenvolvimento Integrado, Desacoplado e Automatizado

68 views

Published on

Alexandre Brandão e Matheus Moreira, Desenvolvedores da MundiPagg, ministraram o workshop "Desenvolvimento Integrado, Desacoplado e Automatizado", no DevCommerce Conference 2016.

O DevCommerce Conference 2016 aconteceu nos dias 06 e 07 de junho de 2016, no Hotel Tivoli em São Paulo-SP
http://devcommerce2016.imasters.com.br/

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
68
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 28
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • Lista vazia from + size
  • DevCommerce Conference 2016 - Workshop: Desenvolvimento Integrado, Desacoplado e Automatizado

    1. 1. Elasticsearch
    2. 2. Confidencial – Copyright © 2015 - MundiPagg O que é? • Distribuido, alta disponibilidade, armazenamento e recuperação de dados • Motor de busca, motor de agregação, analytics • Sugestões, highlighting, geo • Armazenamento de documentos • Distribuído horizontalmente • Open source • Apache License • Vários plugins
    3. 3. Confidencial – Copyright © 2015 - MundiPagg Pra que serve? • Recuperação rápida de documentos • Análise de logs • Busca full text • Analytics e agregações • Visualização de dados em dashboard com Kibana • Alerta e classificação com o Percolator • Motor de sugestões
    4. 4. Confidencial – Copyright © 2015 - MundiPagg Quem usa?
    5. 5. Conceitos
    6. 6. Confidencial – Copyright © 2015 - MundiPagg Scale • Vertical • “Scale up” • Mais RAM • Disco mais rápido • Mais banda • Limitada • Horizontal • “Scale out” • Mais máquinas • Aumenta os recursos de acordo com a demanda
    7. 7. Confidencial – Copyright © 2015 - MundiPagg Documents • Documentos são objetos JSON • Tipos de dados: • String • Númerico • Geopoint, Geoshape: "41.12,-71.34" • Bool • Date: “2016-05-11 23:59:59.999” • IPv4 address: “192.168.0.1” • Array • Objeto
    8. 8. Confidencial – Copyright © 2015 - MundiPagg Nodes • Um nó é uma instância do Elasticsearch • VM, container ou máquina física • Pode rodar múltiplos nós em uma mesma máquina • Um nó contém somente os dados que são atribuídos a ele • Qualquer nó é completamente capaz de servir qualquer request • Todo nó conhece a localização de qualquer documento no cluster assim ele pode direcionar a requisição diretamente para o nó que contém o dado
    9. 9. Confidencial – Copyright © 2015 - MundiPagg Index • Um índice é um container de dados • Cada nó pode hospedar vários índices
    10. 10. Confidencial – Copyright © 2015 - MundiPagg Shard • Um shard é um pedaço único de um índice do Elasticsearch • Índices são particionados em Shards, assim eles podem ser distribuídos em vários nós • Cada shard é um indice do Lucene • Cada índice pode ser “shardiado” • Quando criado você pode especificar a quantidade • Um shard ou é primário ou uma réplica • Primários aceitam escrita • Replicas replicam a escrita
    11. 11. Confidencial – Copyright © 2015 - MundiPagg Cluster • Um cluster é um conjunto de nós trabalhando junto • Todos os nós se comunicam • Os nós recebem as buscas e enviam para todos os nós do cluster para responder o request • Os nós recebem as requisições de index e direcionam para o nó que contém o shard onde o dado deve ser indexado
    12. 12. Confidencial – Copyright © 2015 - MundiPagg Apache Lucene • Biblioteca de motor de busca full-text de alta performance • “Indiscutivelmente a mais avançada” • Open source • Cross-plataform • Altamente complexa
    13. 13. Chega de historinha
    14. 14. Confidencial – Copyright © 2015 - MundiPagg Instalação • Amazon Web Services • Ubuntu • Java • Elasticsearch • Marvel • Configurações
    15. 15. Confidencial – Copyright © 2015 - MundiPagg Java • sudo add-apt-repository ppa:webupd8team/java • sudo apt-get update • sudo apt-get install oracle-java7-installer
    16. 16. Confidencial – Copyright © 2015 - MundiPagg Elasticsearch • wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.deb • sudo dpkg -i elasticsearch-1.7.1.deb • cd /usr/share/elasticsearch • sudo bin/plugin -i elasticsearch/marvel/latest
    17. 17. Confidencial – Copyright © 2015 - MundiPagg Configurações • node.name: “sharon” • node.name: “node1“ • bootstrap.mlockall: true (previne o swap lockando o espaço de memória) • discovery.zen.ping.multicast.enabled: false • discovery.zen.ping.unicast.hosts: [“192.168.0.1“, “192.168.0.2”] • ES_HEAP_SIZE
    18. 18. Mapping and Analysis
    19. 19. Confidencial – Copyright © 2015 - MundiPagg Valores exatos x Full text • Valores exatos são exatamente o que soam. Exemplos: userId, email, username. É trivial fazer busca por valores exatos. • Fazer busca Full text é muito mais sutil, não é binária. • Quão relevante é este documento para esta busca? • Uma busca por “BR” deve também retornar documentos que mencionem “Brasil” • Uma busca por “pulo” deve bater com “pulou”, “pulos”, “pular” e até talvez “salto” • “johnny walker” deve encontrar “Johnnie Walker” e “johnnie depp” deve encontrar “Johnny Depp”
    20. 20. Confidencial – Copyright © 2015 - MundiPagg Índice invertido • Projetado para permitir uma busca full-text extremamente rápida • Consiste em uma lista única com todas as palavras que aparecem nos documentos e para cada palavra uma lista de documentos que ela aparece
    21. 21. Confidencial – Copyright © 2015 - MundiPagg Índice invertido • Exemplo: • The quick brown fox jumped over the lazy dog • Quick brown foxes leap over lazy dogs in summer
    22. 22. Confidencial – Copyright © 2015 - MundiPagg Índice invertido Busca por “quick brown”
    23. 23. Confidencial – Copyright © 2015 - MundiPagg Índice invertido • Porem tem alguns problemas com esse indice invertido: • “Quick” e “quick” aparecem com duas entradas diferentes • “fox” e “foxes” também • “jumped” e “leap” são sinonimos • Resolve como? Normalizando tanto no indice quanto na query • “Quick” -> “quick” • “foxes” -> “fox” • “jumped”, “leap” -> “jump”
    24. 24. Confidencial – Copyright © 2015 - MundiPagg Índice invertido
    25. 25. Confidencial – Copyright © 2015 - MundiPagg Análise e Analisadores • Análise é um processo com os seguintes passos: 1. Tokenizar a string em termos únicos para usar no indice invertido 2. Normalizar os termos numa forma padrão para melhorar a “pesquisabilidade” • A análise é feita pelo analisador que nada mais é que a combinação de 3 funções: 1. Filtro de caracteres: remove html ou converte caracteres especiais em palavras 2. Tokenizador: faz o split da string por espaço ou pontuação 3. Filtro de token: altera, remove ou adiciona termos
    26. 26. Confidencial – Copyright © 2015 - MundiPagg Análise e Analisadores • Existem alguns analisadores nativos, você pode escolher qual usar ou se preferir pode criar o seu • Quando são utilizados? • Quando um documento é indexado os campos full-text são analisados • Quando é feita uma query full-text a string é analisada • Quando é feita uma query de valor exato a string NÃO é analisada • Como testar?
    27. 27. Confidencial – Copyright © 2016 - MundiPagg Mapeamento Processo que define a estrutura de um documento e seus campos, a forma como são armazenados e indexados. • Campos de texto tratados como full-text • Campos de números • Campos de datas e seus formatos • Campos de geolocalização • Regras para campos adicionados automaticamente
    28. 28. Confidencial – Copyright © 2015 - MundiPagg Mapeamento • Por default ao indexar um documento o Elasticsearch detecta e define o tipo automaticamente • Para consultar basta enviar um GET para /index_name/_mapping • Quando o tipo é uma string existem dois campos importantes no mapeamento: • “Index” • “analyzed”: O campo é analisado e indexado • “not_analyzed”: O campo não é analisado mas é indexado • “no”: O campo não é analisado nem indexado • “analyzer”: Define o analisador utilizado • É possível alterar o mapeamento para um campo novo • Infelizmente NÃO é possível alterar o mapeamento de um campo que já existe
    29. 29. Índices e documentos Criação, buscas e agregações
    30. 30. Confidencial – Copyright © 2016 - MundiPagg Analisadores Os analisadores modificam a forma como os índices são criados. Basicamente, pode-se informar para analisar (default), não analisar ou não indexar. Valor: “Thiago da Silva Barradas” Índice não analisável: “Thiago da Silva Barradas” Índice analisável: “thiago” “da” “silva” “barradas”
    31. 31. Confidencial – Copyright © 2016 - MundiPagg Mapping POST /meu-indice/meu-tipo/_mapping { "properties": { "meu-campo": { "type": "string", "index": "not_analyzed" } } }
    32. 32. Confidencial – Copyright © 2016 - MundiPagg Filter X Query Filter Query Deve ser usado para os tipos string (not analyzed), integer, long, date, etc Deve ser utilizado para os tipos string (analyzed) Usa valor recebido como índice Divide valor recebido em vários índices de acordo com o analisador Não gera relevância (score) Gera relevância (score)
    33. 33. Confidencial – Copyright © 2016 - MundiPagg Filters • And Filter • Bool Filter • Exists Filter • Geo Bounding Box Filter • Geo Distance Filter • Geo Distance Range Filter • Geo Polygon Filter • GeoShape Filter • Geohash Cell Filter • Has Child Filter • Has Parent Filter • Ids Filter • Indices Filter • Limit Filter • Match All Filter • Missing Filter • Nested Filter • Not Filter • Or Filter • Prefix Filter • Query Filter • Range Filter • Regexp Filter • Script Filter • Term Filter • Terms Filter • Type Filter
    34. 34. Confidencial – Copyright © 2016 - MundiPagg Filters GET /meu-indice/meu-tipo/_search { "filter": { "term": { "meu-campo": "valor" } } }
    35. 35. Confidencial – Copyright © 2016 - MundiPagg Querys • Match Query • Multi Match Query • Bool Query • Boosting Query • Common Terms Query • Constant Score Query • Dis Max Query • Filtered Query • Fuzzy Like This Query • Fuzzy Like This Field Query • Function Score Query • Fuzzy Query • GeoShape Query • Has Child Query • Has Parent Query • Ids Query • Indices Query • Match All Query • More Like This Query • Nested Query • Prefix Query • Query String Query • Simple Query String Query • Range Query • Regexp Query • Span First Query • Span Multi Term Query • Span Near Query • Span Not Query • Span Or Query • Span Term Query • Term Query • Terms Query • Top Children Query • Wildcard Query • Minimum Should Match • Multi Term Query Rewrite • Template Query
    36. 36. Confidencial – Copyright © 2016 - MundiPagg Querys GET /meu-indice/meu-tipo/_search { "query": { "match": { "meu-campo": "valor" } } }
    37. 37. Confidencial – Copyright © 2016 - MundiPagg Filters e Querys GET /meu-indice/meu-tipo/_search { "query": { "filtered": { "query": { … }, "filter": { … } } } } GET /meu-indice/meu-tipo/_search { "query": { ... }, "filter": { ... } }
    38. 38. Confidencial – Copyright © 2016 - MundiPagg Ordenação GET /meu-indice/meu-tipo/_search { "sort": [ { "meu-campo" : { "order" : "asc" } }, { "meu-campo2" : { "order" : "desc" } } ] }
    39. 39. Confidencial – Copyright © 2016 - MundiPagg Paginação GET /meu-indice/meu-tipo/_search { "from": 0, "size": 10 }
    40. 40. Confidencial – Copyright © 2016 - MundiPagg Scroll Para paginação profunda com muitos ou todos documentos • Similar a um cursor num banco relacional • Não usado para consulta em tempo real • Usado para grandes processamentos de dados (resincronização, grandes relatórios • Seus documentos refletem o estado do indice no momento que o scroll foi gerado. Modificações posteriores não serão aplicadas nos documentos do resultado do scroll • Ao solicitar um “lote” do scroll, ele “anda” automaticamente para os próximos registros • Para filtrar registros, se aplicam filters e querys normalmente
    41. 41. Confidencial – Copyright © 2016 - MundiPagg Scroll Criando um Scroll GET /meu-indice/meu-tipo/_search?scroll=1m { “query” : { … } } Navegando pelo Scroll GET /_search/scroll?scroll=1m&scroll_id={{scroll_id}}
    42. 42. Confidencial – Copyright © 2016 - MundiPagg Unidades y Ano M Mês w Semana d Dia h Hora m Minuto s Segundo ms Milissegundo b Byte kb Kilobyte mb Megabyte gb Gigabyte tb Terabyte mi Milhas yd Jardas ft Pés in Polegadas km Quilômetros m Metros cm Centímetros mm Milímetros nmi Milhas naúticas Tempo Armazenamento Distância
    43. 43. Confidencial – Copyright © 2016 - MundiPagg Autocomplete Autocomplete, sugestion, completion, são termos que define a técnica de atribuir possíveis tokens de sugestão em um documento para localiza-lo mais facilmente em buscas. Mapeando campo que armazenará sugestões para documento PUT /meu-indice/movies/_mapping { “properties” : { “suggest” : { “type” : “completion”, “payload” : true } } }
    44. 44. Confidencial – Copyright © 2016 - MundiPagg Autocomplete Inserindo documento com sugestões POST /meu-indice/movies/123 { "name" : "Star Wars V: The Empire Strikes Back", "details" : "The best movie of world", "suggest" : { "input": [ "Dart","Vader","Star","Wars","Luke","Skywalker","Empires","Strikes","Back"], "output": "Star Wars - The Empire Strikes Back", "payload" : { "someId" : 123 }, "weight" : 3 } }
    45. 45. Confidencial – Copyright © 2016 - MundiPagg Autocomplete Buscando sugestões GET /meu-indice/_suggest { "movies-suggest" : { "text" : "Empi", "completion" : { "field" : "suggest" } } }
    46. 46. Confidencial – Copyright © 2016 - MundiPagg Highlighting Highlighting basicamente é uma técnica usada para marcar as palavras encontradas. GET /meu-indice/meu-tipo/_search { "query": { … }, "highlight" : { "fields" : { "meu-campo" : { "pre_tags" : ["<b>"], "post_tags" : ["</b>"] } } } }
    47. 47. Confidencial – Copyright © 2016 - MundiPagg Agregações GET /meu-indice/meu-tipo/_search { "size" : 0, "query": { … }, "aggs" : { "perStatus": { "terms": { "field": "status" }, "aggs": { "total" : { "sum" : { "field" : "amount" } } } } } }
    48. 48. Confidencial – Copyright © 2015 - MundiPagg Execução da query • É feita em duas fases: 1. Query 2. Fetch
    49. 49. Backups
    50. 50. Confidencial – Copyright © 2015 - MundiPagg Backups • Cria repositório: PUT /_snapshot/meu_repositorio • Cria snapshot: POST /_snapshot/meu_repositorio/meu_snapshot • List snapshots: GET /_snapshot/meu_repositorio/_all • Restaura snapshot: POST /_snapshot/meu_repositorio/meu_snapshot/_restore
    51. 51. Logstash Kibana Watcher
    52. 52. Confidencial – Copyright © 2015 - MundiPagg Logstash • Collect, Enrich, and Transport
    53. 53. Confidencial – Copyright © 2015 - MundiPagg Kibana • Explore, Visualize, and Share
    54. 54. Confidencial – Copyright © 2015 - MundiPagg Watcher • Alerts
    55. 55. É nóis!
    56. 56. www.mundipagg.com Av. Brigadeiro Faria Lima, 1811, 12º andar Itaim Bibi – São Paulo, CEP: 01452-000 +55 11 3078-4228 Rua da Quitanda, 199, 10 andar Centro – Rio de Janeiro, CEP: 20091-005 +55 21 3733-9914 Email: contato@mundipagg.com Esta apresentação é para uso exclusivo do cliente. Nenhuma das partes desta apresentação pode ser veiculada, transcrita ou reproduzida sob qualquer forma ou por quaisquer meios para distribuição fora da organização do cliente sem prévio consentimento por escrito da MundiPagg. .

    ×