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

      .NET Architects Days 2012
Quem?

        Juan Lopes
        twitter.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/dia
20 bilhões de mensagens/dia
         36MB/segundo
   250.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

                            Armazenar


  mensagens   Interpretar


                             Indexar
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'
message
           failed for lonvick on /dev/pts/8
text       su, root, failed, for, lonvick, on, /dev/pts/8

facility   AUTH
severity   CRITICAL
date       20121011
time       221415

host       mymachine
process    su
Indexação
1 documento / mensagem


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

"index size roughly 20-30% the size of
             text indexed"
1 documento / mensagem


       30% de 3TB
           =
        ~900GB
1 documento / mensagem


       30% de 3TB
           =
        ~900GB
Logs têm baixíssima entropia
MessageBag

<10% de         menor overhead
termos únicos    por mensagem
Visão geral

                            Armazenar


 Interpretar   Bufferizar


                             Indexar
Í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);
~1% dos dados originais
Buscar no futuro
Árvore de Prefixos

Binary Match em O(1)
Árvore de Prefixos

Binary Match em O(1)

TermQuery
PrefixQuery
WildcardQuery
FuzzyQuery
RangeQuery
BooleanQuery
Interface
Interface
● Jersey (REST API)
● Backbone.js
● CometD
Interface
● Jersey (REST API)
● Backbone.js
● CometD
               "app:apache http 404"?




         engine                    browser



        "OK. listen:
        /comet/1234568790abcdef"
Interface
É preciso escalar
Recapitulando


      Taxa de leitura: moderada
 Taxa de escrita: altíssima
   Dependência entre os dados: baixa
Sharding

                          engine



                Load
 UDP/TCP 514              engine
               Balancer



                          engine
Cluster


                   Cluster
          engine



          engine   engine
Cluster


                   Cluster
          engine



          engine             engine
Requisições via Broker

          Cluster
 engine
                     Web     HTTP
                    Server
 engine   engine                    usuário




                    Broker
Requisições via Broker

          Cluster
 engine
                     Web     HTTP
                    Server
 engine   engine                    usuário
Buscas no cluster - Multicast

            Cluster
   engine
            Multicast   engine   HTTP


   engine                               usuário
Multicast confiável
Multicast confiável
JChannel 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

 engine
           10

                    mergesort, take 10

          10    last 10 "http_status:    10
 engine
                        404"
                                              usuário
          10


 engine
Busca

 engine
           10
                     mergesort, take 10

                last 10 "http_status:     10
          10
 engine                  404"
                before {id:84324814}           usuário
          10


 engine
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


            Cluster
   engine



   engine             engine   POST /user/123abcdef
One last thing
One last thing
Obrigado




      Obrigado

dnad12