palestra nosql

Post on 11-Nov-2014

1.061 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

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