Transcript
the real time web
NoSQL para soluções inteligentes
Christiano Andersondiretor de desenvolvimento
anderson@nodeware.com.brTwitter: @dump / @nodewareBlog: http://christiano.me
Sobre o palestrante
● Trabalha com software livre desde 1995;
● Sócio fundador da Nodeware;
● Ex-desenvolvedor do Projeto GNU;
● Trabalha com Python desde 2000;
● Evangelista NoSQL, Django e Node.JS
● Colabora com equipe de tradução do MongoDB;
● Fundador do MUG-SP
Twitter: @dump
Sobre a Nodeware
● Empresa nova, mas com corpo técnico atuante desde o início da internet comercial no Brasil;
● Foco em soluções emergentes, nuvem, NoSQL, Node.JS, georreferenciamento e CMS;
● Parceira 10gen, Amazon AWS;● Conheça mais em http://www.nodeware.com.br
Twitter: @dump
NoSQL???? WTF?
● Termo criado por Carlo Strozzie Eric Evans, como referência a umtipo de armazenamento de dados;
● O uso recomendado é Not Only SQLe nunca deve ser usado como Não-SQL ou Never SQL;
● O movimento NoSQL é distinto do modelo relacional, o termo NonREL também é bastante apropriado nessa definição;
Twitter: @dump
NoSQL?
Twitter: @dump
"Non-relational next generation operational datastores anda databases"
Dwight MerrimanCEO - 10gen
NoSQL?
“NoSQL is a movement promoting a loosely defined class of non-relational data stores that
break with a long history of relational databases. These data stores may not require fixed table schemas, usually avoid join operations and
typically scale horizontally. Academics and papers typically refer to these databases as structured
storage.”Wikipedia
Twitter: @dump
Por que usar NoSQL?
● É uma questão de escolhas e novos paradigmas
(na verdade, nem tão novos assim);
● É uma questão de funcionalidades;
● É uma questão de performance e escalabilidade;
● Não tem nada relacionado ao ódio ao modelo
SQL;
Twitter: @dump
Para que usar NoSQL?
● Para trabalhar com quantidade enorme de dados que...○ ... crescem exponencialmente;○ ... agregam muitos outros valores dinamicamente;○ ... não necessitam de modelagem de dados;○ ... não possuem dependência a bancos relacionais, mas
podem trabalhar em conjunto com um;
Twitter: @dump
sim, enorme émuito relativo
Tipos de Bancos Não Relacionais
Twitter: @dump
Orientação a documentos
● Os dados são estruturados de forma encadeada, podendo ser coleções, tags, metadados, hierarquias de informações, etc;
● Bom para aplicações de conteúdo, gerenciar logs, análise estatísticas, etc;
● Exemplo de documento:
Twitter: @dump
{'nome':'Christiano','evento':'Campus Party'}
Bancos orientados a documento
Twitter: @dump
Entre outros....
Grafos
Twitter: @dump
Grafos
● Estrutura de nós, bordas e propriedades para representar e associar hierarquia de dados;
● Todo elemento possui um apontamento direto para outro elemento adjacente;
● Excelente para mídias sociais, determinar relacionamento entre dados, BI, etc;
Twitter: @dump
Exemplos de bancos orientados a Grafos
Twitter: @dump
Chave/Valor
Twitter: @dump
Chave/Valor (K/V)
● Quase todos os bancos não relacionais possuem um pouco de conceito chave/valor;
● Conceito é utilizado para armazenar dados que não necessitam de uma modelagem prévia;
● Os dados podem também estar em colunas;● A persistência dos dados pode estar em disco ou
memória RAM;● A Escalabilidade de bancos orientados a K/V
costuma ser bem simples e eficiente;
Twitter: @dump
Exemplos de bancos Chave/Valor
Twitter: @dump
MemcacheDB
Amazon SimpleDB
São muitas opções, qual deles é melhor?
Twitter: @dump
Qual das ferramenta abaixo é a melhor?
Twitter: @dump
Resposta
Depende do que você vai fazer. As vezes pode ser necessário usar mais de uma ferramenta!
Twitter: @dump
Motivos para considerar o uso de NoSQL
● Se possui enorme quantidade de dados;● Se precisa de performance na escrita;● Se precisa escalar com facilidade;● Se não precisa trabalhar com modelo SQL;● Se a modelagem pode ser flexível;● Para migrar dados facilmente;● Se deseja facilidade de administrar;● Pode ser usado na nuvem;● Se deseja não ter um ponto único de falha;● Se busca agilidade no desenvolvimento...
Twitter: @dump
E por onde eu começo?
● O primeiro passo é avaliar uma solução e suas necessidades e dependências;
● O MongoDB pode ser um ótimo começo, sua curva de aprendizado é baixa e o banco é muito flexível;
● Conheça todas as features do MongoDB antes de fazer o plano de projeto;
● Escolha uma boa linguagem de programação. Python, Java, Node.JS, Ruby e PHP são ótimas escolhas para qualquer projeto.
Twitter: @dump
Do que você deve fugir
● Nunca, mas nunca pense em modelagem relacional enquanto estiver trabalhando com NoSQL, você poderá engessar sua aplicação!
● O código não pode ficar amarrado a uma modelagem, deve ser o mais flexível possível;
● Basicamente fugindo dessas duas ciladas, a chance de sucesso é grande.
Twitter: @dump
Falando de MongoDB, considere se...
● Você está usando muito cache em sua aplicação;● Muitos arquivos estáticos estão sendo
armazenados na sua aplicação;● Se necessita de processamento em tempo real;● Se você gosta de desenvolvimento ágil
(SCRUM);● Se tem dificuldade para modelar sua aplicação
no modelo convencional relacional;● Se faz muita leitura/gravação de dados;
Twitter: @dump
O MongoDB substitui o banco relacional?
● Pode substituir, mas como já foi explicado, é
uma questão de escolha;
● Uma aplicação pode usar MongoDB em
conjunto com um banco relacional sem
nenhum problema. Tudo vai depender da sua
aplicação;
Twitter: @dump
Novidades do MongoDB
● A próxima versão (2.3.4) terá suporte a busca
textual;
● Suporte a stemming, negação, aproximação,
busca por frases, suporte a prefixos e sufixos;
● É uma novidade muito esperada e reforça o
MongoDB como uma solução completa de
NoSQL;
Twitter: @dump
Full Text Search: Stopwords
"Eu sou seu pai, Luke"
Palavras que importam na busca: "pai, Luke"
eu, sou, seu = stopwords
Twitter: @dump
Full Text Search: Stemming
O Stemming identifica e considera a raiz de uma
palavra na busca para torna-la mais precisa;
"fazendo, feito, fazer, faz"
Twitter: @dump
Full Text Search - Mais exemplos e como fazer
Bons exemplos de como fazer busca textual no
MongoDB, por enquanto, disponível apenas na
versão em desenvolvimento:
bit.ly/12cABWs
Twitter: @dump
Plataformas de desenvolvimento
● O MongoDB e outros bancos NoSQL suportam praticamente todas as linguagens de programação;
● Oficialmente, o MongoDB suporta linguagens como:○ C, C++, Erlang, Haskell, Java, JavaScript, Python, PHP,
Perl, .NET, Ruby, Scala, Go Language, Node.JS, LISP, Lua, SmallTalk...
● Mais em http://www.mongodb.org/display/DOCS/Drivers
Twitter: @dump
Modelo de documento
A base de um documento MongoDB consiste em:
Twitter: @dump
{'nome':'Christiano','sobrenome':'Anderson','email':'anderson@nodeware.com.br','nota': 10}
Sim, é praticamente um json!
Comparando com SQL
Twitter: @dump
SQL MongoDB
INSERT INTO USERS VALUES(1,1) db.users.insert({a:1, b:1})
SELECT a,b FROM users db.users.find({}, {a: 1, b: 1})
SELECT * FROM users db.users.find()
SELECT * FROM users WHERE age=33 db.users.find({age: 33})
SELECT * FROm users WHERE name = “pedro”
db.users.find({name:”pedro”})
Comparando com SQL 2
Twitter: @dump
SQL MongoDBSELECT * FROM users WHERE age=33
ORDER BY namedb.users.find({‘age’:33}).sort
({name:1})
SELECT * FROM users WHERE age < 33 db.users.find({‘age’:{$lt:33}})})
CREATE INDEX myindexname ON user(name)
db.users.ensureIndex({name:1})
SELECT * FROM users WHERE a = 1 AND b = ‘q’
db.users.find({a:1, b:’q’})
SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)
Replica sets
● Facilidade em espelhar o banco em vários servidores;
● Possibilita crescer o ambiente de forma orgânica;
● Replica sets consiste em dois ou mais nós que replicam dados entre si, semelhante ao MySQL cluster (conceito de master, slaves);
Twitter: @dump
Sharding
● Sharding é um conceito usado para "fatiar" dados entre vários servidores, exemplo:○ Servidor 1 possui usuários da letra A até a letra F;○ Servidor 2 possui usuários da letra G até a letra L;○ Servidor 3 possui usuáriso da letra M até a letra Z;
● É possível adicionar novos nodes facilmente sem parar o sistema;
● Possível escalar centenas de servidores nesse layout;
● Não possui ponto único de falha e faz failover automático;
Twitter: @dump
Desenvolvendo com MongoDB
● Como já foi explicado, o MongoDB possui suporte para quase todas as linguagens de programação;
● Desenvolver utilizando um modelo NoSQL é um novo paradigma e atribui mais poder ao programador;
● Os exemplos a seguir serão demonstrados em Python;
Twitter: @dump
Pymongo
● Módulo responsável pela conexão ao MongoDB;
● Pode ser instalado facilmente:
○ pip install pymongo
● Possui uma ótima documentação e é muito
estável.
Twitter: @dump
Estabelecendo uma conexão
>>> from pymongo import Connection
>>> con = Connection("localhost")
>>> db = con['blog']
Twitter: @dump
Inserindo um documento
>>> post = {'title':'Meu primeiro post', 'author':'Christiano Anderson', 'contents':'Aqui vem o corpo do post', 'tags':['mongodb','blog','examples']}
>>> posts = db['posts']>>> posts.insert(post)ObjectId('4cb662f508bf532b1b000000')
Twitter: @dump
Inserindo vários documentos
>>> other_posts = [{'title':'Second Post', 'author': 'Christiano Anderson','tags':['test'], 'content': 'Hey, my second Post'},
{'title':'Third Post', 'author':'Luke Skywalker','tags':['naboo'],'content':'Hey princess Leya'}]
>>> posts.insert(other_posts) [ObjectId('4cb6651b08bf532b97000000'), ObjectId('4cb6651b08bf532b97000001')]
Twitter: @dump
Realizando pesquisas
>>> my_post = db.posts.find_one({})
{u'content': u'This is my first post at MongoDB', u'title': u'My first post', u'_id': ObjectId('4cb662f508bf532b1b000000'), u'tags': [u'mongodb', u'blog', u'example'], u'author': u'Christiano Anderson'}
>>> my_post = db.posts.find_one({ 'author': 'Christiano Anderson'})
Twitter: @dump
Listando todos os documentos
>>> all_posts = db.posts.find({})
>>> for p in all_posts: ... print p['title'] My first post Second Post Third Post
Twitter: @dump
Filtros como parâmetros
>>> p = db.posts.find_one({'tags':'naboo'})
{u'content': u'Hey princess Leya', u'title': u'Third Post', u'_id': ObjectId('4cb6651b08bf532b97000001'), u'tags': [u'naboo'], u'author': u'Luke Skywalker'}
Twitter: @dump
Operadores
● Também é possível utilizar operadores como filtro de busca, exemplo:○ $ne○ $lte, $gte○ $and○ $in, $nin○ $size○ $or, $nor, etc
● Lista completa em http://www.mongodb.org/display/DOCS/Advanced+Queries
Twitter: @dump
Map/Reduce
● O MongoDB suporta nativamente Map Reduce;
● Utiliza JavaScript como linguagem;
● Serve para buscar, processar e extrair
resultados em um conjunto grande de dados;
Twitter: @dump
Exemplo de map reduce no MongoDB
function() {this.tags.forEach(function(z)) {
emit(z, 1);});}
function(key, value) {var total = 0;for(var i = 0; i < values.length; i++) {
total += values[i]; }return total;
}
Twitter: @dump
Falando um pouco de Riak
Twitter: @dump
Introdução
● Implementado pela Basho, seguindo os papers
do Amazon DynamoDB;
● Escrito em Erlang;
● Altamente escalável;
● Modelo baseado em Chave/Valor (K/V);
● É possível plugar busca textual no estilo
Sorl/Lucene;
Twitter: @dump
Buckets
● Riak utiliza conceito de "buckets" para
armazenar dados;
● Podem ser comparados a pastas ou tabelas;
Twitter: @dump
Exemplo Python e Riakimport riak
client = riak.RiakClient()
bucket = client.bucket('pessoas')
p = bucket.new('anderson', data = { 'nome': 'Christiano Anderson', 'empresa': 'Nodeware', 'email': ‘anderson@nodeware.com.br’, })p.store()
Twitter: @dump
Riak - Consulta ao banco
import riak
client = riak.RiakClient()bucket = client.bucket('pessoas')u = bucket.get('anderson')print u.get_data()
{u'idade': 33, u'empresa': u'Nodeware 3', u'nome': u'Christiano Anderson'}
Twitter: @dump
Outros bancos
Eu gostaria de falar de outros bancos, mas o tempo acabou! :-(
Twitter: @dump
Boas fontes de informação
● http://nosql.mypopescu.com/
● http://nosql-database.org/
● http://christiano.me
● @dump @al3xandru
Twitter: @dump
Perguntas?
Twitter: @dump
Obrigado!!!!
Christiano Anderson
anderson@nodeware.com.br
http://christiano.me
@dump
Twitter: @dump
Se não deu tempo de responder sua dúvida durante a palestra, me pare no corredor ou entre em contato:
top related