Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data
No workshop, um ambiente MongoDB distribuído será configurado de maneira a possibilitar a escalabilidade de sua aplicação. Serão abordadas boas práticas para a utilização da infra-estrutura além dos seguintes temas:
- Replicas e sharding;
- Definição, utilização e manutenção de índices;
- Map Reduce vs Aggregate;
- Ferramentas úteis.
Pre-requisitos:
Computador pessoal com MongoDB 2.6 instalado (http://www.mongodb.org/downloads)
No Ubuntu, o pacote é o mongodb-org; repositório disponível em http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/.
Gabriel Campos
Co-fundador e CTO da Zahpee.
Bacharel em Ciência da Computação pela UFMG. Há mais de quatro anos atua no desenvolvimento de coleta, processamento e visualização de dados. MongoDB entusiasta e administrador do banco de dados da Zahpee.
5. NoSQL x SQL
Não relacional
Sem esquema
Escalabilidade
Relacional
Esquema bem definido
Transacional
Qual escolher?
6. Porque o mongoDB
Porque MongoDB?
Após alguns benchmarks, vimos uma boa
relação de custo benefício.
Além de uma boa documentação e
uma comunidade bastante ativa.
7. Inserindo alguns dados
Outras operações do mongoDB
use bdw
db.People.insert({ "nm" : "Gabriel Campos" , "pgt" : true })
db.People.insert({ "nm" : "Thiago Cardoso" , "pgt" : false, "city": "BH" })
db.People.update({ "nm" : "Thiago Cardoso" },{ $set :{ "pgt" : true }})
db.People.find({"nm": "Gabriel Campos"})
8. MongoDB explain
db.People.find({"nm":"Gabriel Campos"}).explain()
{
"cursor" : "BasicCursor", -> Não usou índice
"isMultiKey" : false, -> Utilizou multikey index
"n" : 1, -> Número de elementos que “casaram” com a query
"nscannedObjects" : 2, -> Número de objetos escaneados
"nscanned" : 2, -> Número de itens do índice que foram escaneados
"nscannedObjectsAllPlans" : 2, -> Número de objetos escaneados em todos os planos
"nscannedAllPlans" : 2, -> Número de itens escaneados em todos os planos
"scanAndOrder" : false, -> Ordenou os elementos
"indexOnly" : false, -> Objetos retornados estavam apenas no índice
"nYields" : 0, -> Número de vezes que a query deixou
de ser feita por algum motivo
"nChunkSkips" : 0, -> Número de chunks pulados devido
a “migração”
"millis" : 0, -> Tempo para completar a query
}
Mais informações do comando explain
9. Índices
Os índices devem ser escolhidos com base nas consultas.
O tamanho dos índices costuma ser um dos principais
fatores do custo da infraestrutura.
Evitar campos com grande cardinalidade.
db.People.ensureIndex({nm: 1 })
Um pouco mais sobre índices
10. for (var i=0;i<100000;i++){
var people = {};
people.nm = "Nome "+ i;
people.pgt = i%2 == 0;
db.People.save(people);
}
A Inserção de dados dummy a-dummy.js
12. db.People.find({"nm":"Gabriel Campos"}).explain()
{
"cursor" : "BtreeCursor nm_1", -> Indice utilizado
"isMultiKey" : false, -> Utilizou multikey index
"n" : 1, -> Número de elementos que “casaram” com a query
"nscannedObjects" : 1, -> Número de objetos escaneados
"nscanned" : 1, -> Número de itens do índice que foram escaneados
"nscannedObjectsAllPlans" : 1, -> Número de objetos escaneados em todos os planos
"nscannedAllPlans" : 1, -> Número de itens escaneados em todos os planos
"scanAndOrder" : false, -> Ordenou os elementos
"indexOnly" : false, -> Objetos retornados estavam apenas no índice
"nYields" : 0, -> Número de vezes que a query deixou
de ser feita por algum motivo
"nChunkSkips" : 0, -> Número de chunks pulados devido
a “migração”
"millis" : 0, -> Tempo para completar a query
}
MongoDB explain
Mais informações do comando explain
13. MapReduce
Modelo utilizado para processar e agregar um grande
volume de informação.
Funções de map e reduce são programadas em javascript.
Uma solução para contornar certos consultas que não são
possíveis de fazer com Mongo puro.
15. Framework que auxilia o agrupamento de operações no mongoDB.
Pipeline de comandos.
Internamente o mongo otimiza algumas fases do pipeline.
Aggregate
17. Qual escolher?
Com mongoDB, sempre use aggregate.
Aggregate é implementado em C++ dentro
do MongoDB e o MapReduce é um javascript
interpretado em tempo de execução.
MapReduces podem gerar lock no banco.
19. ReplicaSet
Redundância de informação.
Aumento da disponibilidade dos dados.
Distribuição de carga.
Em produção, a criação dos indices deve ser
feita nas máquinas secundárias. SecondarySecondary
Primary
20. cd ~
mkdir -p mongo-bdw
cd mongo-bdw
mkdir -p rs0-0 rs0-1 rs0-2
D ReplicaSet, 1
23. Shards
Distribuir os dados em diversas máquinas de
banco de dados.
Com o crescimento da quantidade de dados, os
índices ocupam a memória e o número de page
fault consequentemente também aumenta.
O processo de “shardeamento” deve acontecer
antes que a memória esteja completamente
ocupada.
24. cd ~
cd mongo-bdw
mkdir config
mongod --configsvr --dbpath ~/mongo-bdw/config --port 20001
mongos --configdb jarvis:20001 --port 27017 --chunkSize 1
E Shards, 1
28. Como escolher as shards keys?
A aplicação da shard key é um processo
irreversível.
Evitar shard keys que vão fazer com que os
dados mudem de chunks constantemente.
Evitar com que os dados fiquem acumulados no
mesmo chunk.
29. Já sei tudo! Estou pronto para criar minha
estrutura mongoDB?
32. Referências
Leeroy Jenkins - https://www.youtube.com/watch?v=LkCNJRfSZBU
Operações com MongoDB - http://goo.gl/xzFeCA
Documentação do explain - http://goo.gl/a81gKf
Documentação dos indices - http://goo.gl/ckoZrp
Documentação replicaSet - http://goo.gl/ZvCQSY
Documentação shards - http://goo.gl/JaPYmA
33. ÍCONES*
SLIDE 13
Redirect designed by Alexander Bickov from the Noun Project
SLIDE 17
Keys designed by Michael Rowe from the Noun Project
* Os ícones não mencionados são de domínio público.
SLIDE 2
Mortar Board designed by Monika Ciapala from the Noun
Project
Beaker designed by Shmidt Sergey from the Noun Project
SLIDE 8
Talking designed by Hadi Davodpour from the Noun Project
SLIDE 9
Tag designed by baabullah hasan from the Noun Project
SLIDE 12
Share designed by Stephanie Wauters from the Noun Project