em produção
        dá pra confiar?



Antonio Marques - @acmarques
  André Ferraz - @deferraz
Em produção há quase 2 anos
       em diversas aplicações
Mas por que MongoDB?

Laggard
• Reescrita incremental de sistema legado
• Alterações de modelo frequentes
• Muitas migrations...
Mas Rails com MySQL
               é tão legal!
Laggard
Novidades interessantes surgindo




              +
Novidades interessantes surgindo




http://railscasts.com/episodes/194-mongodb-and-
                    mongomapper
E então começou a saga do early adopter
Primeira semana em produção
Primeira semana em produção
NoMemoryError (failed to allocate memory):
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `recv'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `receive_full'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 206:in `object_from_stream'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 191:in `next_object_on_wire'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 157:in `read_objects_off_wire'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 153:in `read_all'
Primeira semana em produção
NoMemoryError (failed to allocate memory):
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `recv'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `receive_full'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 206:in `object_from_stream'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 191:in `next_object_on_wire'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 157:in `read_objects_off_wire'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 153:in `read_all'




                            Mas o servidor tem memória livre!
Primeira semana em produção
NoMemoryError (failed to allocate memory):
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `recv'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `receive_full'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 206:in `object_from_stream'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 191:in `next_object_on_wire'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 157:in `read_objects_off_wire'
 /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 153:in `read_all'




  mongo driver atualizado para versão 0.11 e adicionada configuração
  específica para Passenger em config/initializers/mongo.rb
Ferrando a vida dos sysadmins
Backporting
Backporting
Segurança / Autorização

• RW User / RO User
• No Roles
• Plain String Key Exchange (Replica Set / Sharding)
Conhecimento

• Evite ser o unico ponto focal
• Aprendeu algo novo? Repasse ao time
Troubleshooting / Debugging

• Cluster Offline


• Repair Database
Alta Disponibilidade




 com Replica Sets
Replica Sets

            Server A
              slave     sync




Server B      sync     Server C
  slave                  master




            Web App
Replica Sets

            Server A
              slave     sync




Server B      sync     Server C
  slave                  master




            Web App
Replica Sets

            Server A
   voting     slave




Server B               Server C
  slave                  master




            Web App
Replica Sets

             Server A
               slave
     sync




Server B                Server C
  master




             Web App
Replica Sets

             Server A
               slave
     sync




Server B                Server C
  master




             Web App
Replica Sets

             Server A
               slave
     sync




Server B                Server C
  master




             Web App
Replica Sets

             Server A
               slave
     sync                 sync




Server B                Server C
  master                  slave




             Web App
Mas não tão simples...
Necessário atualizar aplicação para o
       driver mais recente
Necessário atualizar aplicação para o
       driver mais recente
Configurar a aplicação para usar o
             Replica Set
Alterar classe de conexão



Tratar tipos específicos de exceção
Atualizar o MongoDB para versões a
            partir da 1.8.x

 As primeiras versões a suportar Replica Sets (1.6.x)
apresentam falhas no sistema de votação em algumas
                      situações

  http://groups.google.com/group/mongodb-user/
    browse_thread/thread/6bee27d40a269eab
Próximos passos
Sharding
Sharding


 Server A




Web App
Sharding


Server A




           Web App
Sharding


Server A   Server B




                      Web App
Sharding


Server A   Server B    Server C




                      Web App
Sharding


Server A   Server B    Server C   Server D




                      Web App
Sharding


Server A   Server B    Server C   Server D   Server N




                      Web App
Sharding


Server A   Server B      Server C   Server D   Server N




                      mongos               Web App
Sharding


  Server A   Server B      Server C   Server D   Server N




Config


Config
                        mongos               Web App
Config
Sharding


  Server A   Server B      Server C   Server D   Server N




Config


Config
                        mongos               Web App
Config
Sharding


  Server A   Server B      Server C   Server D   Server N




Config


Config
                        mongos               Web App
Config
Sharding + Replica Set




      mongos        Web App
Sharding + Replica Set




      mongos        Web App
Sharding + Replica Set




      mongos        Web App
2.0
2.0




• Journaling habilitado por padrão
• Sharding Authentication
• Prioridade em nós de Replica Sets
• Data center awareness
• Modo manutenção
• Novas funções de Query
• Shell customizável
2.0




      Muito barulho
2.0
2.0
2.0




      Muito boato
2.0
E não é só a Locaweb que utiliza MongoDB...
E não é só a Locaweb que utiliza MongoDB...
PERGUNTAS ?

http://twitter.com/acmarques
 http://blog.acmarques.com

 http://twitter.com/deferraz
    http://blog.ferraz.info
OBRIGADO!

MongoDB em producao

  • 1.
    em produção dá pra confiar? Antonio Marques - @acmarques André Ferraz - @deferraz
  • 3.
    Em produção háquase 2 anos em diversas aplicações
  • 4.
    Mas por queMongoDB? Laggard
  • 5.
    • Reescrita incrementalde sistema legado • Alterações de modelo frequentes • Muitas migrations...
  • 6.
    Mas Rails comMySQL é tão legal! Laggard
  • 7.
  • 8.
  • 10.
    E então começoua saga do early adopter
  • 11.
  • 12.
    Primeira semana emprodução NoMemoryError (failed to allocate memory): /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `recv' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `receive_full' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 206:in `object_from_stream' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 191:in `next_object_on_wire' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 157:in `read_objects_off_wire' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 153:in `read_all'
  • 13.
    Primeira semana emprodução NoMemoryError (failed to allocate memory): /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `recv' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `receive_full' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 206:in `object_from_stream' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 191:in `next_object_on_wire' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 157:in `read_objects_off_wire' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 153:in `read_all' Mas o servidor tem memória livre!
  • 14.
    Primeira semana emprodução NoMemoryError (failed to allocate memory): /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `recv' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/db.rb: 326:in `receive_full' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 206:in `object_from_stream' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 191:in `next_object_on_wire' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 157:in `read_objects_off_wire' /usr/lib/ruby/gems/1.8/gems/mongodb-mongo-0.9/lib/mongo/cursor.rb: 153:in `read_all' mongo driver atualizado para versão 0.11 e adicionada configuração específica para Passenger em config/initializers/mongo.rb
  • 15.
    Ferrando a vidados sysadmins
  • 16.
  • 17.
  • 18.
    Segurança / Autorização •RW User / RO User • No Roles • Plain String Key Exchange (Replica Set / Sharding)
  • 19.
    Conhecimento • Evite sero unico ponto focal • Aprendeu algo novo? Repasse ao time
  • 22.
    Troubleshooting / Debugging •Cluster Offline • Repair Database
  • 23.
  • 24.
    Replica Sets Server A slave sync Server B sync Server C slave master Web App
  • 25.
    Replica Sets Server A slave sync Server B sync Server C slave master Web App
  • 26.
    Replica Sets Server A voting slave Server B Server C slave master Web App
  • 27.
    Replica Sets Server A slave sync Server B Server C master Web App
  • 28.
    Replica Sets Server A slave sync Server B Server C master Web App
  • 29.
    Replica Sets Server A slave sync Server B Server C master Web App
  • 30.
    Replica Sets Server A slave sync sync Server B Server C master slave Web App
  • 31.
    Mas não tãosimples...
  • 32.
    Necessário atualizar aplicaçãopara o driver mais recente
  • 33.
    Necessário atualizar aplicaçãopara o driver mais recente
  • 34.
    Configurar a aplicaçãopara usar o Replica Set Alterar classe de conexão Tratar tipos específicos de exceção
  • 35.
    Atualizar o MongoDBpara versões a partir da 1.8.x As primeiras versões a suportar Replica Sets (1.6.x) apresentam falhas no sistema de votação em algumas situações http://groups.google.com/group/mongodb-user/ browse_thread/thread/6bee27d40a269eab
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
    Sharding Server A Server B Web App
  • 41.
    Sharding Server A Server B Server C Web App
  • 42.
    Sharding Server A Server B Server C Server D Web App
  • 43.
    Sharding Server A Server B Server C Server D Server N Web App
  • 44.
    Sharding Server A Server B Server C Server D Server N mongos Web App
  • 45.
    Sharding ServerA Server B Server C Server D Server N Config Config mongos Web App Config
  • 46.
    Sharding ServerA Server B Server C Server D Server N Config Config mongos Web App Config
  • 47.
    Sharding ServerA Server B Server C Server D Server N Config Config mongos Web App Config
  • 48.
    Sharding + ReplicaSet mongos Web App
  • 49.
    Sharding + ReplicaSet mongos Web App
  • 50.
    Sharding + ReplicaSet mongos Web App
  • 51.
  • 52.
    2.0 • Journaling habilitadopor padrão • Sharding Authentication • Prioridade em nós de Replica Sets • Data center awareness • Modo manutenção • Novas funções de Query • Shell customizável
  • 53.
    2.0 Muito barulho
  • 54.
  • 55.
  • 56.
    2.0 Muito boato
  • 57.
  • 58.
    E não ésó a Locaweb que utiliza MongoDB...
  • 59.
    E não ésó a Locaweb que utiliza MongoDB...
  • 60.
    PERGUNTAS ? http://twitter.com/acmarques http://blog.acmarques.com http://twitter.com/deferraz http://blog.ferraz.info
  • 61.