dnad12

1,853 views

Published on

Um Case de Arquitetura Distribuída para Indexação, Armazenamento e Análise de Logs em Tempo Real

Published in: Technology
2 Comments
5 Likes
Statistics
Notes
No Downloads
Views
Total views
1,853
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
12
Comments
2
Likes
5
Embeds 0
No embeds

No notes for slide

dnad12

  1. 1. Um Case de ArquiteturaDistribuída para Indexação, Armazenamento e Análise de Logs em Tempo Real Juan Lopes .NET Architects Days 2012
  2. 2. Quem? Juan Lopes twitter.com/ github.com/ juanplopes
  3. 3. Monitoração
  4. 4. Complex Event Processing
  5. 5. Time series. Real-time.
  6. 6. Logs!
  7. 7. Case real
  8. 8. Case real
  9. 9. Centenas de servidores
  10. 10. Como acessar os logs?marvin@goldenheart ~ $ ssh root@deepthought****WELCOME TO 1 OF YOUR 38,157,987 SERVERS.TRY THE VEAL. ITS THE BEST IN THIS FARM.****root@deepthought ~ $ tail -f /var/log.txt
  11. 11. Vai falhar? Já falhou? Onde?
  12. 12. Informações para BI
  13. 13. CEP ajuda, mas...
  14. 14. Log é texto. Muito texto.
  15. 15. Centralizar. Indexar.
  16. 16. Mas é muito texto mesmo!
  17. 17. Volumes desafiadores 3TB/dia
  18. 18. Volumes desafiadores 3TB/dia20 bilhões de mensagens/dia 36MB/segundo 250.000 mensagens/segundo
  19. 19. Twitter 340 milhões tweets por dia (março/2012) http://blog.twitter.com/2012/03/twitter-turns-six.html
  20. 20. Quem resolve?Loggly● Amplamente utilizado● Primeira opção em cloud● Maior plano não-custom: 12GB/dia● Preço: $1,779/mês
  21. 21. Quem resolve?Graylog● Open Source● Self-hosted● Arquitetura composta de partes móveis ○ MongoDB ○ ElasticSearch ○ AMQP
  22. 22. Quem resolve?Splunk● Famoso na área de BigData● Destinado ao mundo Enterprise● Muitos gráficos e relatórios● $6,000 one-time fee: 500MB/day● 500MB < 3TB :(
  23. 23. Ser simples
  24. 24. JVM
  25. 25. HotSpot: JIT+GC = s2
  26. 26. java.util.concurrent
  27. 27. Visão geral Armazenar mensagens Interpretar Indexar
  28. 28. RFC 3164: BSD syslog <34>Oct 11 22:14:15 mymachine su: su root failed for lonvick on /dev/pts/8 <priority = facility*8+severity> <date/time> <host> <process> <message>
  29. 29. Mensagem: chave -> valor <34>Oct 11 22:14:15 mymachine su: su rootmessage failed for lonvick on /dev/pts/8text su, root, failed, for, lonvick, on, /dev/pts/8facility AUTHseverity CRITICALdate 20121011time 221415host mymachineprocess su
  30. 30. Indexação
  31. 31. 1 documento / mensagem http://lucene.apache.org/core/"index size roughly 20-30% the size of text indexed"
  32. 32. 1 documento / mensagem 30% de 3TB = ~900GB
  33. 33. 1 documento / mensagem 30% de 3TB = ~900GB
  34. 34. Logs têm baixíssima entropia
  35. 35. MessageBag<10% de menor overheadtermos únicos por mensagem
  36. 36. Visão geral Armazenar Interpretar Bufferizar Indexar
  37. 37. Índice minimalista No freqs, no positions, no norms, no term vectors.Field field = new Field(key, value, Field.Store.NO, Field.Index.ANALYZED_NO_NORMS, Field.TermVector.NO);field.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);
  38. 38. ~1% dos dados originais
  39. 39. Buscar no futuro
  40. 40. Árvore de PrefixosBinary Match em O(1)
  41. 41. Árvore de PrefixosBinary Match em O(1)TermQueryPrefixQueryWildcardQueryFuzzyQueryRangeQueryBooleanQuery
  42. 42. Interface
  43. 43. Interface● Jersey (REST API)● Backbone.js● CometD
  44. 44. Interface● Jersey (REST API)● Backbone.js● CometD "app:apache http 404"? engine browser "OK. listen: /comet/1234568790abcdef"
  45. 45. Interface
  46. 46. É preciso escalar
  47. 47. Recapitulando Taxa de leitura: moderada Taxa de escrita: altíssima Dependência entre os dados: baixa
  48. 48. Sharding engine Load UDP/TCP 514 engine Balancer engine
  49. 49. Cluster Cluster engine engine engine
  50. 50. Cluster Cluster engine engine engine
  51. 51. Requisições via Broker Cluster engine Web HTTP Server engine engine usuário Broker
  52. 52. Requisições via Broker Cluster engine Web HTTP Server engine engine usuário
  53. 53. Buscas no cluster - Multicast Cluster engine Multicast engine HTTP engine usuário
  54. 54. Multicast confiável
  55. 55. Multicast confiávelJChannel channel = new JChannel();channel.setReceiver(new ReceiverAdapter() { public void receive(Message msg) { System.out.println( msg.getSrc() + ": " + msg.getObject()); }});channel.connect("meuCanalDeChat");BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));while(true) { String line = reader.readLine(); channel.send(null, line);}
  56. 56. Multicast confiável, mas DIY
  57. 57. Stack configurável
  58. 58. Importante Toda funcionalidade precisa levar em consideração os outros membros do cluster.
  59. 59. Busca engine 10 mergesort, take 10 10 last 10 "http_status: 10 engine 404" usuário 10 engine
  60. 60. Busca engine 10 mergesort, take 10 last 10 "http_status: 10 10 engine 404" before {id:84324814} usuário 10 engine
  61. 61. Agregação http 200 => count() by host host count foo 1234 bar 2345 baz 3456
  62. 62. Agregação count() + count() + count() engine engine engine
  63. 63. Agregação http 200 => avg(time) by host host avg_time foo 0.888889 bar 0.224568 baz 5.623424
  64. 64. Agregação avg(time) + avg(time) + avg(time) ? engine engine engine
  65. 65. Agregação sum(time) + sum(time) + sum(time) count(time) + count(time) + count(time) engine engine engine
  66. 66. Invalidar 2nd level caches Cluster engine engine engine POST /user/123abcdef
  67. 67. One last thing
  68. 68. One last thing
  69. 69. Obrigado Obrigado

×