palestra nosql

55
the real time web NoSQL para soluções inteligentes Christiano Anderson diretor de desenvolvimento [email protected] Twitter: @dump / @nodeware Blog: http://christiano.me

Upload: christiano-anderson

Post on 11-Nov-2014

1.061 views

Category:

Documents


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Palestra nosql

the real time web

NoSQL para soluções inteligentes

Christiano Andersondiretor de desenvolvimento

[email protected]: @dump / @nodewareBlog: http://christiano.me

Page 2: Palestra nosql

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

Page 3: Palestra nosql

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

Page 4: Palestra nosql

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

Page 5: Palestra nosql

NoSQL?

Twitter: @dump

"Non-relational next generation operational datastores anda databases"

Dwight MerrimanCEO - 10gen

Page 6: Palestra nosql

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

Page 7: Palestra nosql

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

Page 8: Palestra nosql

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

Page 9: Palestra nosql

Tipos de Bancos Não Relacionais

Twitter: @dump

Page 10: Palestra nosql

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'}

Page 11: Palestra nosql

Bancos orientados a documento

Twitter: @dump

Entre outros....

Page 12: Palestra nosql

Grafos

Twitter: @dump

Page 13: Palestra nosql

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

Page 14: Palestra nosql

Exemplos de bancos orientados a Grafos

Twitter: @dump

Page 15: Palestra nosql

Chave/Valor

Twitter: @dump

Page 16: Palestra nosql

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

Page 17: Palestra nosql

Exemplos de bancos Chave/Valor

Twitter: @dump

MemcacheDB

Amazon SimpleDB

Page 18: Palestra nosql

São muitas opções, qual deles é melhor?

Twitter: @dump

Page 19: Palestra nosql

Qual das ferramenta abaixo é a melhor?

Twitter: @dump

Page 20: Palestra nosql

Resposta

Depende do que você vai fazer. As vezes pode ser necessário usar mais de uma ferramenta!

Twitter: @dump

Page 21: Palestra nosql

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

Page 22: Palestra nosql

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

Page 23: Palestra nosql

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

Page 24: Palestra nosql

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

Page 25: Palestra nosql

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

Page 26: Palestra nosql

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

Page 27: Palestra nosql

Full Text Search: Stopwords

"Eu sou seu pai, Luke"

Palavras que importam na busca: "pai, Luke"

eu, sou, seu = stopwords

Twitter: @dump

Page 28: Palestra nosql

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

Page 29: Palestra nosql

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

Page 30: Palestra nosql

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

Page 31: Palestra nosql

Modelo de documento

A base de um documento MongoDB consiste em:

Twitter: @dump

{'nome':'Christiano','sobrenome':'Anderson','email':'[email protected]','nota': 10}

Sim, é praticamente um json!

Page 32: Palestra nosql

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

Page 33: Palestra nosql

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)

Page 34: Palestra nosql

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

Page 35: Palestra nosql

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

Page 36: Palestra nosql

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

Page 37: Palestra nosql

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

Page 38: Palestra nosql

Estabelecendo uma conexão

>>> from pymongo import Connection

>>> con = Connection("localhost")

>>> db = con['blog']

Twitter: @dump

Page 39: Palestra nosql

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

Page 40: Palestra nosql

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

Page 41: Palestra nosql

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

Page 42: Palestra nosql

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

Page 43: Palestra nosql

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

Page 44: Palestra nosql

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

Page 45: Palestra nosql

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

Page 46: Palestra nosql

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

Page 47: Palestra nosql

Falando um pouco de Riak

Twitter: @dump

Page 48: Palestra nosql

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

Page 49: Palestra nosql

Buckets

● Riak utiliza conceito de "buckets" para

armazenar dados;

● Podem ser comparados a pastas ou tabelas;

Twitter: @dump

Page 50: Palestra nosql

Exemplo Python e Riakimport riak

client = riak.RiakClient()

bucket = client.bucket('pessoas')

p = bucket.new('anderson', data = { 'nome': 'Christiano Anderson', 'empresa': 'Nodeware', 'email': ‘[email protected]’, })p.store()

Twitter: @dump

Page 51: Palestra nosql

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

Page 52: Palestra nosql

Outros bancos

Eu gostaria de falar de outros bancos, mas o tempo acabou! :-(

Twitter: @dump

Page 53: Palestra nosql

Boas fontes de informação

● http://nosql.mypopescu.com/

● http://nosql-database.org/

● http://christiano.me

● @dump @al3xandru

Twitter: @dump

Page 54: Palestra nosql

Perguntas?

Twitter: @dump

Page 55: Palestra nosql

Obrigado!!!!

Christiano Anderson

[email protected]

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: