Coisas que aprendemos usandoMongoid com grande quantidade de             dados         @fabioperrella
Créditos também para:   Claudio Bruno Martins     @marciotrindade
Objetivos●   Mostrar coisas que descobrimos●   Mostrar técnicas que usamos●   Ver se alguem fala "NAO FAÇAM ISSO!"●   Faze...
Email Marketing - Locaweb●   SaaS●   Multi Tenant●   Grande quantidade de dados●   Grande histórico de dados●   Sistema an...
MongoDB●   Simplicidade●   Sharding: grande quantidade de dados●   Schema-free: campos customizados contatos, filtros●   R...
Mongoid●   Simplicidade●   Boa documentação●   Mongo Mapper tinha bug com muitos    documentos embedados (faz tempo)●   .....
Implementação de Campos Customizáveis
Implementação de Campos Customizáveis ●   1a ideia - Mongoid dynamic fields (allow_dynamic_fields)
Implementação de Campos Customizáveis ●   1a ideia - Mongoid dynamic fields (allow_dynamic_fields) ●   Problemas     ○   P...
Implementação de Campos Customizáveis ●   2a ideia - field custom_fields, type: hash
Implementação de Campos Customizáveis ●   2a ideia - field custom_fields, type: hash ●   Vantagens     ○   Proteção dos ca...
Implementação de Campos Customizáveis ●   Indice nas chaves de um hash! (inclusive em     chaves que não existem)
Implementação de Campos Customizáveis ●   Cuidado com indices!     ●   Geração de indice faz lock do DB inteiro!         ○...
Implementação de Campos Customizáveis ●   Se o cliente quiser trocar o nome dos     campos?     ○   Toma essa!! operador $...
Implementação de Campos Customizáveis ●   Buscas tipadas (string, date, int)     Contact.where("custom_fields.date" =>    ...
Implementação de Campos Customizáveis ●   Bug no MongoDB, ordenação de indices ●   Case Sensitive (http://jira.mongodb.   ...
Belongs To Many
Belongs To Many●   Opções de modelagem:    ○   1) Embed Documents    ○   Vantagens:        ■   Consulta rápida dos dados  ...
Belongs To Many
Belongs To Many●   Problemas!    ○   Tamanho máximo de um documento 4MB, 8, 16..        ■   melhor não passar de 100KB    ...
Belongs To Many●   Opções de modelagem:    ○   2) Has And Belongs to Many    ○   Vantagens:        ■   Tamanho dos documen...
Belongs To Many
Belongs To Many●   Opções de modelagem:    ○   2) Has And Belongs to Many        ■   Tamanho do documento com 201mil Objec...
Belongs To Many●   Problemas!    ○   Complexidade no codigo para usar only(:fields)
Belongs To Many●   Opções de modelagem:    ○   3) Has And Belongs to Many!!
Belongs To Many●    Opções de modelagem:       ○   3) Has And Belongs to Many!!    http://agendaculturalpiracicabana.blogs...
Belongs To Many●   Opções de modelagem:    ○   3) Has And Belongs to Many    ○   Vantagens:        ■   Tamanho dos documen...
Belongs To Many
Belongs To Many
Belongs To ManyGEM (wip):https://github.com/fabioperrella/mongoid_belongs_to_many
Belongs To Many●   Opções de modelagem:    ○   3) Has And Belongs to Many    ○   Indice em campos tipo array!        index...
Mongoimport●   Feature: Importação de contatos em massa●   Problema    ○   Listas com mais de 100mill contatos    ○   Conc...
Mongoimporthttp://www.mongodb.org/display/DOCS/Import+Export+Tools#ImportExportTools-mongoimport●   Ponto positivo:    ○  ...
Mongoimport●   Validação dos dados
Mongoimport●   to_mongo_json    ○     carregar objeto com dados do CSV e validar!    ○     conversão de ObjectIds    ○    ...
Mongoimport●   Merge de dados nao existe!    ○   opção "upsert" atualiza documento inteiro, não é        possivel fazer me...
Mongoimport●   Merge de dados não existe!    ○   collection.update apenas nos campos que        precisam ser atualizados
Mongoimport●   Tratamento de erros
Updating - Atomic Operators● http://en.wikipedia.   org/wiki/Linearizability#Example_atomic_operation● http://en.wikipedia...
Updating - Atomic Operators● http://www.mongodb.org/display/DOCS/Updating● inc● set / unset● push● pushAll● addToSet e eac...
Updating - Atomic Operators● inc: incrementa um número  ○ pode ser usado com campo nil
Updating - Atomic Operators● inc  ○ pode ser usado em hashes (mesmo vazios!)
Updating - Atomic Operators● inc com multi:true (em N documentos)  ○ somente com o collection.update no mongoid
Updating - Atomic Operators● set: seta valor de um campo  ○ no mongoid só é possível atualizar 1 campo com     o .set
Updating - Atomic Operators● addToSet  ○ insere 1 elemento em um array se já não existir nele  ○ pode fazer mais de uma op...
Updating - Atomic Operators● addToSet com each  ○ insere N elementos em um array se não existirem nele
Updating - Atomic Operators● pull / pullAll   ○ remove 1 / N elementos de um array
Updating - Atomic Operators● rename  ○ renomeia nome de campos, inclusive de hashes!
Sharding● Não deixe pra depois se já sabe que vai precisar!   ○ tempo para implementação, testes...   ○ shard balancing po...
Sharding● não deixe pra depois se ja sabe que vai precisar!   ○ mongoid shard_key (se nao tiver, dá erro em update,      i...
Sharding● não deixe pra depois se ja sabe que vai precisar!   ○ Safe mode: ligar no test / development, desligar em prod!
Sharding● mongoS, configServer, replicaSet, mongoDB
Sharding● Chunks, splitting e balancing   ○ Chunk: pedaço de uma collection   ○ Splitting: quebra de chunk quando fica gra...
Sharding● Chunks, splitting e balancing   ○ Exemplo: Collection Users com campo mês de aniversário   ○ Sharding key: mês d...
Sharding● Chunks, splitting e balancing   ○ após splitting  Começo              Fim          Shard  fevereiro           ju...
Sharding● Escolha da shard key  ○ "It is important to choose the right shard key for a     collection. If the collection i...
Sharding● Escolha da shard key  ○ pensar na escrita e leitura dos dados:     ■ load balancing: na escrita deve dividir dad...
Sharding● Escolha da shard key  ○ como não deve ser:     ■ low-cardinality: por exemplo continentes (africa,        americ...
Sharding● Escolha da shard key  ○ recomendado: objectid + search keyExemplo:  Inicio          Fim             Shard  -infi...
Replicaset● Prefira escalar usando shards e não replicasets com leitura  nos secundário (slave_ok = true no Mongoid)● Leit...
Monitoração● mongostat --discover
Monitoração● db.stats()● db.collecionName.stats()● rs.serverStatus()● rs.status()● db.currentOp()● MongoDB Monitoring Serv...
Testes de carga● velocidade de escrita (ex: importação de contatos)● ambiente de homologação rodando com base carregada● a...
Referências●   http://www.mongodb.org●   Scaling MongoDB (Kristina Chodorow)●   50 Tips and Tricks for MongoDB Developers ...
Próximos SlideShares
Carregando em…5
×

Coisas que aprendemos usando Mongoid com grande quantidade de dados

1.535 visualizações

Publicada em

0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.535
No SlideShare
0
A partir de incorporações
0
Número de incorporações
27
Ações
Compartilhamentos
0
Downloads
19
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Coisas que aprendemos usando Mongoid com grande quantidade de dados

  1. 1. Coisas que aprendemos usandoMongoid com grande quantidade de dados @fabioperrella
  2. 2. Créditos também para: Claudio Bruno Martins @marciotrindade
  3. 3. Objetivos● Mostrar coisas que descobrimos● Mostrar técnicas que usamos● Ver se alguem fala "NAO FAÇAM ISSO!"● Fazer alguem pensar ou falar "NOSSA, DA PRA FAZER ISSO!"
  4. 4. Email Marketing - Locaweb● SaaS● Multi Tenant● Grande quantidade de dados● Grande histórico de dados● Sistema antigo, baseado no php-list● ==> Nova plataforma em Rails + MongoDB!● Lançamento na próxima semana
  5. 5. MongoDB● Simplicidade● Sharding: grande quantidade de dados● Schema-free: campos customizados contatos, filtros● Replica Set: Alta disponibilidade● Operações Atomicas: inc, addToSet, pull, push...● Boa performance● Maturidade: mongosp 2011!● Atualizações constantes! (estamos na v2.0.5)
  6. 6. Mongoid● Simplicidade● Boa documentação● Mongo Mapper tinha bug com muitos documentos embedados (faz tempo)● .. e está chegando a versão 3 muito melhor!
  7. 7. Implementação de Campos Customizáveis
  8. 8. Implementação de Campos Customizáveis ● 1a ideia - Mongoid dynamic fields (allow_dynamic_fields)
  9. 9. Implementação de Campos Customizáveis ● 1a ideia - Mongoid dynamic fields (allow_dynamic_fields) ● Problemas ○ Proteção de campos internos (status, id, etc..) ○ Restrição no nome dos campos customizáveis ○ allow_dynamic_fields no Mongoid é global! ● Vantagens? ○ Indice nos campos
  10. 10. Implementação de Campos Customizáveis ● 2a ideia - field custom_fields, type: hash
  11. 11. Implementação de Campos Customizáveis ● 2a ideia - field custom_fields, type: hash ● Vantagens ○ Proteção dos campos internos ○ Liberdade no nome dos campos ● Problemas? ○ Índice nos campos
  12. 12. Implementação de Campos Customizáveis ● Indice nas chaves de um hash! (inclusive em chaves que não existem)
  13. 13. Implementação de Campos Customizáveis ● Cuidado com indices! ● Geração de indice faz lock do DB inteiro! ○ 10min collection com 50milhoes de documentos ● Custo alto (memoria, espaço em disco, escrita)
  14. 14. Implementação de Campos Customizáveis ● Se o cliente quiser trocar o nome dos campos? ○ Toma essa!! operador $rename =~ Alter table
  15. 15. Implementação de Campos Customizáveis ● Buscas tipadas (string, date, int) Contact.where("custom_fields.date" => {"$lt" => Time.parse("1982-01-1")}) ● Operadores de condição: http://www.mongodb.org/display/DOCS/Advanced+Queries
  16. 16. Implementação de Campos Customizáveis ● Bug no MongoDB, ordenação de indices ● Case Sensitive (http://jira.mongodb. org/browse/SERVER-90) ● Fix: criar campo em lowercase { "_id": ObjectId("4fdfd0ada53bd0206a000003"), "email": "bb@bb.com", "name": "PopoLala", "name_lc": "popolala" }
  17. 17. Belongs To Many
  18. 18. Belongs To Many● Opções de modelagem: ○ 1) Embed Documents ○ Vantagens: ■ Consulta rápida dos dados ○ Desvantagens: ■ Tamanho do documento
  19. 19. Belongs To Many
  20. 20. Belongs To Many● Problemas! ○ Tamanho máximo de um documento 4MB, 8, 16.. ■ melhor não passar de 100KB ○ Alternativa quebrar em chunks -> complexidade! ○ Gridfs? não
  21. 21. Belongs To Many● Opções de modelagem: ○ 2) Has And Belongs to Many ○ Vantagens: ■ Tamanho dos documentos menor? ■ Consistência ○ Desvantagens: ■ Busca ■ Tamanho dos documentos!!!
  22. 22. Belongs To Many
  23. 23. Belongs To Many● Opções de modelagem: ○ 2) Has And Belongs to Many ■ Tamanho do documento com 201mil ObjectIds!
  24. 24. Belongs To Many● Problemas! ○ Complexidade no codigo para usar only(:fields)
  25. 25. Belongs To Many● Opções de modelagem: ○ 3) Has And Belongs to Many!!
  26. 26. Belongs To Many● Opções de modelagem: ○ 3) Has And Belongs to Many!! http://agendaculturalpiracicabana.blogspot.com.br/2012/01/dia-13-sexta-feira-vamos-cacar-o-saci.html
  27. 27. Belongs To Many● Opções de modelagem: ○ 3) Has And Belongs to Many ○ Vantagens: ■ Tamanho dos documentos menor! ■ Consistência ○ Desvantagens: ■ Busca? ■ Implementação fora do padrão
  28. 28. Belongs To Many
  29. 29. Belongs To Many
  30. 30. Belongs To ManyGEM (wip):https://github.com/fabioperrella/mongoid_belongs_to_many
  31. 31. Belongs To Many● Opções de modelagem: ○ 3) Has And Belongs to Many ○ Indice em campos tipo array! index :message_ids
  32. 32. Mongoimport● Feature: Importação de contatos em massa● Problema ○ Listas com mais de 100mill contatos ○ Concorrência entre clientes ○ Precisa ser rápido!● Solução ○ mongoimport
  33. 33. Mongoimporthttp://www.mongodb.org/display/DOCS/Import+Export+Tools#ImportExportTools-mongoimport● Ponto positivo: ○ Velocidade (mais de 8mil documentos/segundo)● Pontos Negativos ○ Validação dos dadosNão há como fazer "Merge" de dados ○ Dificil tratar de erros pois roda com system
  34. 34. Mongoimport● Validação dos dados
  35. 35. Mongoimport● to_mongo_json ○ carregar objeto com dados do CSV e validar! ○ conversão de ObjectIds ○ conversão de datas (timestamp em miliseconds) ○ conversão de Array de ObjectIds (relacionamentos) ○ conversão de Hashes ○ gerar JSON no formato do mongoimport● Bug data < epoch (https://jira.mongodb.org/browse/SERVER- 961 )
  36. 36. Mongoimport● Merge de dados nao existe! ○ opção "upsert" atualiza documento inteiro, não é possivel fazer merge https://jira.mongodb. org/browse/SERVER-1674 ○ PERIGO com dados que podem ser atualizados por outro lugar (counts, etc..) ○ Solução: Mongoid collection.update!
  37. 37. Mongoimport● Merge de dados não existe! ○ collection.update apenas nos campos que precisam ser atualizados
  38. 38. Mongoimport● Tratamento de erros
  39. 39. Updating - Atomic Operators● http://en.wikipedia. org/wiki/Linearizability#Example_atomic_operation● http://en.wikipedia.org/wiki/Compare-and-swap
  40. 40. Updating - Atomic Operators● http://www.mongodb.org/display/DOCS/Updating● inc● set / unset● push● pushAll● addToSet e each● pop / pull● pullAll● rename
  41. 41. Updating - Atomic Operators● inc: incrementa um número ○ pode ser usado com campo nil
  42. 42. Updating - Atomic Operators● inc ○ pode ser usado em hashes (mesmo vazios!)
  43. 43. Updating - Atomic Operators● inc com multi:true (em N documentos) ○ somente com o collection.update no mongoid
  44. 44. Updating - Atomic Operators● set: seta valor de um campo ○ no mongoid só é possível atualizar 1 campo com o .set
  45. 45. Updating - Atomic Operators● addToSet ○ insere 1 elemento em um array se já não existir nele ○ pode fazer mais de uma operação por vez, por exemplo com INC
  46. 46. Updating - Atomic Operators● addToSet com each ○ insere N elementos em um array se não existirem nele
  47. 47. Updating - Atomic Operators● pull / pullAll ○ remove 1 / N elementos de um array
  48. 48. Updating - Atomic Operators● rename ○ renomeia nome de campos, inclusive de hashes!
  49. 49. Sharding● Não deixe pra depois se já sabe que vai precisar! ○ tempo para implementação, testes... ○ shard balancing pode sobrecarregar máquina se já estiver no limite ○ algumas coisas não funcionam (ou não funcionam direito) com shard, exemplo: ■ counts ■ mongodb unique index
  50. 50. Sharding● não deixe pra depois se ja sabe que vai precisar! ○ mongoid shard_key (se nao tiver, dá erro em update, inserts..)
  51. 51. Sharding● não deixe pra depois se ja sabe que vai precisar! ○ Safe mode: ligar no test / development, desligar em prod!
  52. 52. Sharding● mongoS, configServer, replicaSet, mongoDB
  53. 53. Sharding● Chunks, splitting e balancing ○ Chunk: pedaço de uma collection ○ Splitting: quebra de chunk quando fica grande (64M) ○ Balancing: mover chunk para outro shard quando o atual está mais cheio
  54. 54. Sharding● Chunks, splitting e balancing ○ Exemplo: Collection Users com campo mês de aniversário ○ Sharding key: mês de aniversário Começo Fim Shard fevereiro março A setembro +infinito A Começo Fim Shard -infinito fevereiro B março setembro B
  55. 55. Sharding● Chunks, splitting e balancing ○ após splitting Começo Fim Shard fevereiro junho A junho março A setembro +infinito A Começo Fim Shard -infinito fevereiro B março setembro B
  56. 56. Sharding● Escolha da shard key ○ "It is important to choose the right shard key for a collection. If the collection is gigantic it is difficult to change the key later. When in doubt please ask for suggestions in the support forums or IRC". (1a linha no site do mongodb) ○ http://www.mongodb. org/download/attachments/2097354/how+queries+w ork+with+sharding.pdf
  57. 57. Sharding● Escolha da shard key ○ pensar na escrita e leitura dos dados: ■ load balancing: na escrita deve dividir dados entre os shards ■ na leitura tentar não varrer vários shards para ter a resposta
  58. 58. Sharding● Escolha da shard key ○ como não deve ser: ■ low-cardinality: por exemplo continentes (africa, america, europa) ■ ascending shard key: por exemplo objectid, vai concentrar todas leituras e escritas em um shard ■ random shard key: por exemplo md5, quase sempre vai precisar juntar os dados de varios chunks, nao vai conseguir deixar dados parecidos juntos
  59. 59. Sharding● Escolha da shard key ○ recomendado: objectid + search keyExemplo: Inicio Fim Shard -infinito Africa,000111 A Africa,000111 Africa,999999 B Africa,999999 Europa,22233 A Europa,22233 Europa,87652 B Europa,87652 +infinito B
  60. 60. Replicaset● Prefira escalar usando shards e não replicasets com leitura nos secundário (slave_ok = true no Mongoid)● Leitura insegura. Nos secundários podem haver dados antigos● Ainda em estudo por nós.. ○ estratégia de backup em secundários ○ compactação de dados nos secundários ○ journaling habilitado apenas no secundário de backup
  61. 61. Monitoração● mongostat --discover
  62. 62. Monitoração● db.stats()● db.collecionName.stats()● rs.serverStatus()● rs.status()● db.currentOp()● MongoDB Monitoring Service (MMS) ○ SaaS ○ Free!
  63. 63. Testes de carga● velocidade de escrita (ex: importação de contatos)● ambiente de homologação rodando com base carregada● analisar queries lentas com explain() no console do mongo● simular casos extremos (ex: cliente grande com muitos contatos)● definir limites de segurança
  64. 64. Referências● http://www.mongodb.org● Scaling MongoDB (Kristina Chodorow)● 50 Tips and Tricks for MongoDB Developers (Kristina Chodorow)● MongoDB in Action (Kyle Banker)

×