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.
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. 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.
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. Í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. 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. 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. 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. 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. 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. 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. 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" })
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.
22. Teste da instalação
$ grep dbpath /etc/mongod.conf
dbpath=/var/lib/mongo
$ sudo /etc/init.d/mongod start
$ sudo /etc/init.d/mongod status
mongod (pid 4745) is running...
$ mongo
MongoDB shell version: 1.6.5
connecting to: test
> show dbs
admin
local
test
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. 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++'})
{u'position': 3.0, u'_id': ObjectId('4d63c3d1bbd24861417f9a1a'),
u'year': 2011.0, u'language': u'C++', u'delta': 1.0}
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. 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".