dnad12

70

Transcript of dnad12

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

de Logs em Tempo RealJuan Lopes

.NET Architects Days 2012

Quem?

Juan Lopestwitter.com/github.com/

juanplopes

Monitoração

Complex Event Processing

Time series. Real-time.

Logs!

Case real

Case real

Centenas de servidores

Como acessar os logs?

marvin@goldenheart ~ $ ssh root@deepthought****WELCOME TO 1 OF YOUR 38,157,987 SERVERS. TRY THE VEAL. IT'S THE BEST IN THIS FARM.**** root@deepthought ~ $ tail -f /var/log.txt

Vai falhar? Já falhou? Onde?

Informações para BI

CEP ajuda, mas...

Log é texto. Muito texto.

Centralizar. Indexar.

Mas é muito texto mesmo!

Volumes desafiadores

3TB/dia

Volumes desafiadores

3TB/dia20 bilhões de mensagens/dia

36MB/segundo250.000 mensagens/segundo

Twitter

340 milhões tweets por dia

(março/2012)http://blog.twitter.com/2012/03/twitter-turns-six.html

Quem resolve?

Loggly● Amplamente utilizado● Primeira opção em cloud● Maior plano não-custom: 12GB/dia● Preço: $1,779/mês

Quem resolve?

Graylog● Open Source● Self-hosted● Arquitetura composta de partes móveis

○ MongoDB○ ElasticSearch○ AMQP

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

Ser simples

JVM

HotSpot: JIT+GC = s2

java.util.concurrent

Visão geral

Indexar

Armazenar

Interpretarmensagens

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>

Mensagem: chave -> valor

<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8message

facility AUTH

severity CRITICAL

host mymachine

process su

date 20121011

time 221415

text su, root, failed, for, lonvick, on, /dev/pts/8

Indexação

1 documento / mensagem

"index size roughly 20-30% the size of text indexed"

http://lucene.apache.org/core/

1 documento / mensagem

30% de 3TB=

~900GB

1 documento / mensagem

30% de 3TB=

~900GB

Logs têm baixíssima entropia

MessageBag

<10% de termos únicos

menor overhead por mensagem

Visão geral

Bufferizar

Indexar

Armazenar

Interpretar

Índice minimalista

Field field = new Field(key, value, Field.Store.NO, Field.Index.ANALYZED_NO_NORMS, Field.TermVector.NO); field.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);

No freqs, no positions, no norms, no term vectors.

~1% dos dados originais

Buscar no futuro

Árvore de Prefixos

Binary Match em O(1)

Árvore de Prefixos

Binary Match em O(1) TermQueryPrefixQueryWildcardQueryFuzzyQueryRangeQueryBooleanQuery

Interface

Interface

● Jersey (REST API)● Backbone.js● CometD

Interface

● Jersey (REST API)● Backbone.js● CometD

engine browser

"app:apache http 404"?

"OK. listen: /comet/1234568790abcdef"

Interface

É preciso escalar

Recapitulando

Taxa de leitura: moderada

Taxa de escrita: altíssimaDependência entre os dados: baixa

Sharding

LoadBalancer

engine

engine

engine

UDP/TCP 514

Cluster

Clusterengine

engineengine

Cluster

Clusterengine

engineengine

Cluster

Requisições via Broker

engine

engineengine

HTTP

usuário

WebServer

Broker

Cluster

Requisições via Broker

HTTP

usuário

WebServer

engine

engineengine

Cluster

Buscas no cluster - Multicast

HTTP

usuário

Multicast

engine

engine

engine

Multicast confiável

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

Multicast confiável, mas DIY

Stack configurável

Importante

Toda funcionalidade precisa levar em consideração os outros membros do cluster.

Busca

last 10 "http_status:404"

10

10

10

10

usuário

engine

engine

engine

mergesort, take 10

Busca

engine

engine

engine

last 10 "http_status:404"

before {id:84324814}

10

10

10

10

usuário

mergesort, take 10

Agregação

http 200 => count() by host

host count

foo 1234

bar 2345

baz 3456

Agregação

count() + count() + count()

engine engine engine

Agregação

http 200 => avg(time) by host

host avg_time

foo 0.888889

bar 0.224568

baz 5.623424

Agregação

avg(time) + avg(time) + avg(time)

?

engine engine engine

Agregação

sum(time) + sum(time) + sum(time)count(time) + count(time) + count(time)

engine engine engine

Invalidar 2nd level caches

Clusterengine

engineengine POST /user/123abcdef

One last thing

One last thing

Obrigado

Obrigado