Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

34
Gabriel Campos Como configurar e utilizar uma estrutura MongoDB para Big Data

description

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.

Transcript of Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Page 1: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Gabriel Campos

Como configurar e utilizar uma estrutura MongoDB para Big Data

Page 2: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Gabriel Campos

[email protected] | @gcouti

Page 3: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Como funcionará?Iremos fazer diversos ciclos que irão

compreender apresentações de conceitos e

como implementá-los

Page 4: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Ok! Let’s do itLeeroy Jenkins

Page 5: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

NoSQL x SQLNão relacional

Sem esquema

Escalabilidade

Relacional

Esquema bem definido

Transacional

Qual escolher?

Page 6: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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.

Page 7: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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"})

Page 8: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

MongoDB explaindb.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

Page 9: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Í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

Page 10: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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

Page 11: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

E agora? Como saber se ficou bom?

Page 12: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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

Page 13: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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.

Page 14: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

db.People.mapReduce(function(){ emit(this.nm,this.pgt);},function(key,values){ return Array.sum(values)},{ query:{pgt:true}, out:"numero_pgt"})

B MapReduce b-mapreduce.js

Page 15: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Framework que auxilia o agrupamento de operações no mongoDB.

Pipeline de comandos.

Internamente o mongo otimiza algumas fases do pipeline.

Aggregate

Page 16: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

db.People.aggregate({$match:{}

},{

$group:{_id:"$pgt","total":{

$sum:1}

}})

C Aggregate c-aggregate.js

Page 17: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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.

Page 18: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Configurando a estrutura MongoDB

Page 19: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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

Page 20: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

cd ~mkdir -p mongo-bdwcd mongo-bdwmkdir -p rs0-0 rs0-1 rs0-2

D ReplicaSet, 1

Page 21: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

# Iniciando replicas

mongod --port 27000 --dbpath ~/mongo-bdw/rs0-0 --replSet rs0 --smallfiles --nopreallocmongod --port 27001 --dbpath ~/mongo-bdw/rs0-1 --replSet rs0 --smallfiles --nopreallocmongod --port 27002 --dbpath ~/mongo-bdw/rs0-2 --replSet rs0 --smallfiles --noprealloc

D ReplicaSet, 2

Page 22: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

mongo --port 27000

rs.initiate()rs.add("jarvis:27001")rs.add("jarvis:27002")rs.status()

D ReplicaSet, 3

Page 23: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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.

Page 24: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

cd ~cd mongo-bdwmkdir configmongod --configsvr --dbpath ~/mongo-bdw/config --port 20001mongos --configdb jarvis:20001 --port 27017 --chunkSize 1

E Shards, 1

Page 25: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

mkdir -p rs1-0 rs1-1 rs1-2

mongod --port 27010 --dbpath ~/mongo-bdw/rs1-0 --replSet rs1 --smallfiles --nopreallocmongod --port 27011 --dbpath ~/mongo-bdw/rs1-1 --replSet rs1 --smallfiles --nopreallocmongod --port 27012 --dbpath ~/mongo-bdw/rs1-2 --replSet rs1 --smallfiles --noprealloc

E Shards, 2

Page 26: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

mongo --port 27010rs.initiate()rs.add("<hostname:27011>")rs.add("<hostname:27012>")rs.status()

E Shards, 3

Page 27: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

#Shardeandomongosh.addShard("rs0/jarvis:27000,jarvis:27001,jarvis:27002")sh.addShard("rs1/jarvis:27010,jarvis:27011,jarvis:27012")sh.enableSharding("bdw")

sh.shardCollection("bdw.People", { nm: 1} )

E Shards, 4

Page 28: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

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.

Page 29: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Já sei tudo! Estou pronto para criar minha

estrutura mongoDB?

Page 30: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data
Page 31: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Gabriel Campos

[email protected] | @gcouti

Obrigado!

Page 32: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

ReferênciasLeeroy Jenkins - https://www.youtube.com/watch?v=LkCNJRfSZBUOperações com MongoDB - http://goo.gl/xzFeCADocumentação do explain - http://goo.gl/a81gKfDocumentação dos indices - http://goo.gl/ckoZrpDocumentação replicaSet - http://goo.gl/ZvCQSYDocumentação shards - http://goo.gl/JaPYmA

Page 33: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

ÍCONES*

SLIDE 13Redirect designed by Alexander Bickov from the Noun Project

SLIDE 17Keys designed by Michael Rowe from the Noun Project

* Os ícones não mencionados são de domínio público.

SLIDE 2Mortar Board designed by Monika Ciapala from the Noun ProjectBeaker designed by Shmidt Sergey from the Noun Project

SLIDE 8Talking designed by Hadi Davodpour from the Noun Project

SLIDE 9Tag designed by baabullah hasan from the Noun Project

SLIDE 12Share designed by Stephanie Wauters from the Noun Project

Page 34: Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big Data

Árvore de indices