MongoDB - Apresentação

2.266 visualizações

Publicada em

Publicada em: Tecnologia
  • Seja o primeiro a comentar

MongoDB - Apresentação

  1. 1. ApresentandoNeo@Corp.Terra.com.brRodrigo Nossal @nossalRudá Moura @__ruda__
  2. 2. MongoDB não siginifica o que vocês estão pensando! Momento politicamente correto
  3. 3. 3
  4. 4. MongoDB vem de humongous humongous = grande, enorme
  5. 5. NoSQL? É Só Hype Ou É pra Valer?• NoSQL (Not Only SQL) é o termo genérico de BD que não segue o modelo relacional de dados;• A idéia não é nova, o CDS/ISIS de 1985 já era utilizado para guardar documentos em biblioteca de forma não relacional e não normalizada;• Ganhou notoriedade no meio dos anos 00 para soluções que “web scales” e com o BigTable do Google;• O objetivo é armazenar informação na forma de elementos chave/valor, não-normalizado e não relacional;• Hype? Pode ser, mas "está ai no mercado" e muitos produtos estão sendo feitos com essa tecnologia;• MongoDB não é o único NoSQL de sucesso: CouchDB, Cassandra, BigTable, Riak, MemBase, Redis, Hbase.
  6. 6. Terminologia SQL (RDBMS) MongoDB • Database • Database • Table • Collection • Row(s) • (JSON) Documents • Query • Query • Index • Index • Partition • Shard
  7. 7. Principais Características• Banco de dados orientados à documentos;• Escalável e de alto-desempenho;• Código aberto - desenvolvido e mantido pela 10gen;• Utiliza documentos JSON para o modelo de dados;• Consultas são baseadas em documentos;• Sharding = particionamento em múltiplos servidores;• Suporta internamente MapReduce;• Suporta operações atômicas em documentos simples;• Desenvolvido em C++;• Possui drivers para várias linguagens: Python, Java, PHP, Erlang, etc.;• Última versão estável: 1.8.1 (06 de Abril de 2011).
  8. 8. Por Que JSON?• JSON (JavaScript Object Notation) é um formato leve de troca de dados, é um subconjunto pequeno de Javascript;• É independente de linguagem de programção, composto por pares de chave e valor;• As consultas são feitas por JSON e o retorno é sempre um documento JSON, ou uma lista de documentos JSON;• JSON é muito utilizado para o intercâmbio de informações na web (adios XML!);• A linguagem de comandos e funções internas do MongoDB é JavaScript.
  9. 9. Documento JSON{ "_id" : ObjectId("4d3f3574c405441a31000000"), "config" : { "max_range" : 10, "min_range" : 0, "type" : "range" }, "name" : "Linguagens", "description" : "Ranking de linguagens de programação"}
  10. 10. Armazenamento• Os documentos JSON são internamente guardados como BJSON (formato binário) (< 16MB);• A espeficação GridFS permite guardar documentos grandes (> 16MB) de forma transparente;• O MongoDB usa um mecanismo de armazenamento em memória mapeada (Memory Mapped Storage Engine);• O gerenciador de memória virtual do S.O. fica responsável pelo cache de dados do MongoDB.
  11. 11. Índices• Todo documento de uma collection contém uma chave padrão "_id" indexada;• O valor da chave “_id”: ObjectId("4d3727c33612f747d7000000");• Qualquer chave do documento pode ser indexada (exceto em capped collections). > db.votes.ensureIndex({obj.name: 1})
  12. 12. Segurança• Recomenda-se o uso do MongoDB em ambientes confiáveis (rede privada e firewall);• Pode-se configurar autenticação por usuário e senha;• Para adicionar um usuário à uma database: > db.addUser("theadmin", "anadminpassword", true)• Para autenticar: > db.auth("theadmin", "anadminpassword")
  13. 13. MapReduce• MongoDB suporta MapReduce;• A operação Map pode servir para modificar ou filtrar valores;• A operação Reduce para consolidar um conjunto de valores;• As operações de Map e Reduce são executadas de maneira distribuídas entre os shards do cluster. Map f(x) = {x*2} [1, 2, 3] [2, 4, 6] Reduce f(x, y) = {x+y} [12]
  14. 14. Durabilidade• Operações que alteram os documentos são realizadas de maneira direta no BD, portanto não existem transações;• Não existem logs de transação, que garantam a durabilidade dos dados como fazem os RDBMS;• A durabilidade deve ser garantida pela replicação dos dados em diferentes servidores;• Desde a versão 1.7.5 é possível contar com um journaling de dados, o que deixa o banco mais robusto.
  15. 15. GridFS• Armazenamento de arquivos;• Divide os arquivos em chunks de 256kb;• Armazena os metadados na collection fs.files, e as partes do arquivo na collection fs.chunks;• O MongoDB faz streaming do arquivo para a aplicação;• Facilidade para fazer seek em arquivos.
  16. 16. Capped Collections• Collections com tamanho fixo;• Funciona como uma fila FIFO: primeiro a entrar, primeiro a sair;> db.createCollection("last_comments", {capped:true, size:100000})> db.last_votes.validate()OBS.: size em bytes
  17. 17. Tailable Cursors• Igual a um “tail -f” do Unix, numa Capped collection. >>> finder = db.last_comments.find(tailable=True) >>> while True: >>> time.sleep(1) >>> for doc in finder: >>> print doc
  18. 18. Sharding• Particionamento horizontal;• Database sharding: Distribui as collections entre os shards;• Collection sharding: Distribui os documentos de mesma chave entre os Shards;Collection cep: {uf: RS, local:Posto Alegre, logr:Rua General Câmara, cep: 90010-230}>db.runCommand({ shardcollection : "cep", key : "uf" })
  19. 19. Sharding
  20. 20. Limitações• Sistemas de 32 bits existe a limitação de 2GB no tamanho do BD (limite de memória por processo, 64 bits é maior);• 4mb por documento JSON, mas pode ser extendido com uso de GridFS;• O número máximo de conexões que o MongoDB aceita, depende do limite de arquivos abertos do sistema operacional (ulimit -n);• Não é muito performático quando se necessita fazer "joins" entre documentos;• Não existe um esquema de locking tradicional e transações complexas.
  21. 21. InstalaçãoCentOS5• http://www.mongodb.org/display/DOCS/CentOS+and+Fedora +Packages• Adicionar os repositórios da 10gen para o MongoDB o Estão no link acima• Com a ajuda do yum: $ yum install mongo-stable mongo-stable-server
  22. 22. Teste da instalação$ grep dbpath /etc/mongod.confdbpath=/var/lib/mongo$ sudo /etc/init.d/mongod start$ sudo /etc/init.d/mongod statusmongod (pid 4745) is running...$ mongoMongoDB shell version: 1.6.5connecting to: test> show dbsadminlocaltest
  23. 23. Utilizando o MongoDB> use tiobe;switched to db tiobe> var py = { language: "Python", position: 1, delta: +3 };> printjson(py);{ "language" : "Python", "position" : 1, "delta" : 3 }> db.tiobe.save(py);> db.tiobe.find();{ "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" :"Python", "position" : 1, "delta" : 3 }
  24. 24. Utilizando o MongoDB> db.tiobe.save({language: "C++", position: 3, delta: 1});> db.tiobe.save({language: "C", position: 2, delta: 0});> db.tiobe.save({language: "Java", position: 1, delta: 0});> db.tiobe.find();{ "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" :"Python", "position" : 1, "delta" : 3 }{ "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "language" :"C++", "position" : 3, "delta" : 1 }{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :"C", "position" : 2, "delta" : 0 }{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :"Java", "position" : 1, "delta" : 0 }
  25. 25. Utilizando o MongoDB> db.tiobe.find()[0];{ "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" : "Python", "position" : 1, "delta" : 3}> var cursor = db.tiobe.find();> printjson(cursor[3]);{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" : "Java", "position" : 1, "delta" : 0 }
  26. 26. Utilizando o MongoDB> var cursor = db.tiobe.find().limit(2);> cursor.forEach(printjson);{ "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "delta" : 1, "language" : "C++", "position" : 3, "year" : 2011 }{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "delta" : 0, "language" : "C", "position" : 2, "year" : 2011 }
  27. 27. Utilizando o MongoDB> db.tiobe.update({language: "Python"}, {position: 4});> db.tiobe.find({delta:0});{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :"C", "position" : 2, "delta" : 0 }{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :"Java", "position" : 1, "delta" : 0 }> db.tiobe.find({delta:0}, {language:true});{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :"C" }{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :"Java" }
  28. 28. Utilizando o MongoDB> db.tiobe.find({position: {$lt: 4}});{ "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "language" :"C++", "position" : 3, "delta" : 1 }{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :"C", "position" : 2, "delta" : 0 }{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :"Java", "position" : 1, "delta" : 0 }> db.tiobe.update({}, {$set: {year: 2011}}, false, true);{ ... }> db.tiobe.remove({_id:ObjectId(4d63c372bbd24861417f9a19)});> db.tiobe.remove({}); TUDO!
  29. 29. MongoDB Drivers• Drivers são extensões para uso emlinguagens de programação;• Suporte as linguagens de programação: o C/C++ o Python o Javascript o PHP o + Erlang, Java, Perl, Scala• Python: PyMongo.
  30. 30. PyMongo • É o driver recomendado para uso do MongoDB com Python; • Instalação: o sudo pip install pymongo • Uso:>>> import pymongo>>> conn = pymongo.Conection() # localhost>>> db = conn.tiobe>>> print db.tiobe.find_one({language: C++}){uposition: 3.0, u_id: ObjectId(4d63c3d1bbd24861417f9a1a),uyear: 2011.0, ulanguage: uC++, udelta: 1.0}
  31. 31. >>> cursor = db.tiobe.find()>>> for elem in cursor: print elem• {u_id: ObjectId(4d63c372bbd24861417f9a19), uyear: 2011.0}• {uposition: 3.0, u_id: ObjectId(4d63c3d1bbd24861417f9a1a), uyear: 2011.0, ulanguage: uC++, udelta: 1.0}• {uposition: 2.0, u_id: ObjectId(4d63c3e2bbd24861417f9a1b), uyear: 2011.0, ulanguage: uC, udelta: 0.0}• {uposition: 1.0, u_id: ObjectId(4d63c3fbbbd24861417f9a1c), uyear: 2011.0, ulanguage: uJava, udelta: 0.0}• {uposition: 5.0, u_id: ObjectId(4d63cba91d00876348d47b1e), uyear: 2011.0, ulanguage: uPHP, udelta: -2.0}>>> cursor = db.tiobe.find({delta: 0})>>> print cursor.count()2Em resumo, total suporte do MongoDB com Python!
  32. 32. Persistência de Objetos• ORM ou Object-Relational Mapping (Mapeamento Objeto- relacional) é o mecanismo para mapear modelos de objetos/ classes em armazenamento de banco;• É a maneira de construir persistência de objetos em termos de armazenamento em banco de dados;• Podemos usar o MongoDB para mapear objetos de linguagem de programação em BD;• Naturalmente não faz muito sentido chamar de ORM, porque bem... MongoDB não é relacional!
  33. 33. MongoEngine• Mapeamento de objetos no modelo de documentos do MongoDB;• Muito parecido com a modelagem de objetos do Django.• Requer pymongo;• Instalação: $ sudo pip install mongoengine• Uso: o Ver a apresentação do demo "microblog".
  34. 34. Referências• http://www.mongodb.org/• http://api.mongodb.org/python/• http://mongoengine.org/

×