Introducción al mundo NoSQL

46
Introduccin al mundo NoSQL CØsar D. Rodas [email protected] http://crodas.org/ Free Software Asuncin Asuncin, Paraguay 1

description

Introducción al Mundo NoSQL, conceptos, porque utilizarlos, donde utilizarlo. Ejemplos practicos en MonoDB, CouchDB y redis

Transcript of Introducción al mundo NoSQL

Page 1: Introducción al mundo NoSQL

Introducción al mundo NoSQL

César D. [email protected]

http://crodas.org/

Free Software AsunciónAsunción, Paraguay

1

Page 2: Introducción al mundo NoSQL

acerca de ...

� Desarrollador

� Estudiante

� Zelote de• Open Source

• PHP

• MongoDB

� PECL Developer

� ... y algunas cosas mas

@crodas - http://crodas.org/ - LATEX 2

Page 3: Introducción al mundo NoSQL

Agenda

� NoSQL

� Redis

� CouchDB

� MongoDB

@crodas - http://crodas.org/ - LATEX 3

Page 4: Introducción al mundo NoSQL

NoSQL, ¿Qué es?

NoSQL es un término usado en informática para agrupar unaserie de almacenes de datos no relacionales que noproporcionan garantías ACID. Normalmente no tienen

esquemas fijos de tablas ni sentencias “join”.

Wikipedia

@crodas - http://crodas.org/ - LATEX 4

Page 5: Introducción al mundo NoSQL

NoSQL, ¿Qué es?

� Como término nació a principios del 2009

� Como concepto, es algo viejo

� Conjunto de bases de datos que:• No provee SQL

• Los datos no tienen relación

• Generalmente escalan horizontalmente

@crodas - http://crodas.org/ - LATEX 5

Page 6: Introducción al mundo NoSQL

“Problemas”de las bases de datosrelacionales

� SQL• Lenguaje interpretado

• Mucha funcionalidad

� ACID ofrece demasiado

� La manera más fácil de escalar es verticalmente

@crodas - http://crodas.org/ - LATEX 6

Page 7: Introducción al mundo NoSQL

“CAP”y “BASE”

� Teorema de CAP, puedes tener dos cosas:• Consistency

• Availability

• Partition tolerance

� BASE, el reemplazo de ACID• Basically Available

• Soft state

• Eventually consistent

@crodas - http://crodas.org/ - LATEX 7

Page 8: Introducción al mundo NoSQL

Algunas bases de datos NoSQL

@crodas - http://crodas.org/ - LATEX 8

Page 9: Introducción al mundo NoSQL

REDIS

@crodas - http://crodas.org/ - LATEX 9

Page 10: Introducción al mundo NoSQL

Redis� In-memory Key-value store

� Muy rápido, en mi notebook:• 20K inserts en 0.6 segundos

• 20K selects en 1 segundo

� Soporta operaciones con las claves

� Los valores pueden ser:• bytes

• Sets

• Tuplas

� Operaciones atómicas (Push, Pop, ranges, etc)

� Clientes para varios lenguajes

� Replicación a disco

@crodas - http://crodas.org/ - LATEX 10

Page 11: Introducción al mundo NoSQL

¿Documentos?

@crodas - http://crodas.org/ - LATEX 11

Page 12: Introducción al mundo NoSQL

http://www.flickr.com/photos/beglen/152027605/

@crodas - http://crodas.org/ - LATEX 12

Page 13: Introducción al mundo NoSQL

¿Documentos?

� “Objetos sin funciones”

� Arrays (en PHP)

� Tuples (en Python)

� Hashes (en Ruby y Perl)

� Sin esquema

@crodas - http://crodas.org/ - LATEX 13

Page 14: Introducción al mundo NoSQL

Documentos!

$collection[$id] = array("title" => "PHP rules","tags" => array("php", "web"),"body" => "... PHP rules ...","comments" => array(

array("author" => "crodas", "comment" => "Yes it does"),),"visits" => array("200.10.228.34", "200.10.228.2"),

);

@crodas - http://crodas.org/ - LATEX 14

Page 15: Introducción al mundo NoSQL

@crodas - http://crodas.org/ - LATEX 15

Page 16: Introducción al mundo NoSQL

CouchDB

� Proyecto Apache

� JSON (no XML :-)

� Interfaz RESTful (+/-)• Estándar (++)

• Http es lento (--)

� MVCC

� Safe IO (append only b-tree)

� Multi-master

� Excelente Interfaz de administración

@crodas - http://crodas.org/ - LATEX 16

Page 17: Introducción al mundo NoSQL

CouchDB

� Javascript incrustado

� No soporta indexes (--)

� Map/Reduce para realizar queries (+/-)

� Soporta guardar archivos

� Fácil de escalar (con proxies convencionales)

� Distribuido y concurrente por naturaleza (Erlang)

@crodas - http://crodas.org/ - LATEX 17

Page 18: Introducción al mundo NoSQL

@crodas - http://crodas.org/ - LATEX 18

Page 19: Introducción al mundo NoSQL

@crodas - http://crodas.org/ - LATEX 19

Page 20: Introducción al mundo NoSQL

MongoDB

� <EN>Mongo</EN> != <ES>Mongo</ES>

� Orientada a documento

� Rápida, escalable, fácil de usar

� Soporta índices• Simples

• Compuestos

• Geo-spatial

� Auto-sharding

� Cliente PECL

� El “MySQL”del NoSQL

@crodas - http://crodas.org/ - LATEX 20

Page 21: Introducción al mundo NoSQL

MongoDB

� Soporta sub-documentos

� Updates in-places

� Javascript incrustrado

� Map/Reduce para procesamiento off-line

� Todo es un “documento”

@crodas - http://crodas.org/ - LATEX 21

Page 22: Introducción al mundo NoSQL

http://bit.ly/mongodb-php

@crodas - http://crodas.org/ - LATEX 22

Page 23: Introducción al mundo NoSQL

La diversión

@crodas - http://crodas.org/ - LATEX 23

Page 24: Introducción al mundo NoSQL

MongoDB - Operaciones

� Select• $gt, $lt, $gte, $lte, $eq, $neq: >, <, >=, <=, ==, !=

• $in, $nin

• $size, $exists

• $where: Any javascript expression

• group()

• limit()

• skip()

� Updates• $set

• $unset

• $push

• $pull

• $inc

@crodas - http://crodas.org/ - LATEX 24

Page 25: Introducción al mundo NoSQL

pecl install mongo

@crodas - http://crodas.org/ - LATEX 25

Page 26: Introducción al mundo NoSQL

MongoDB - Connección

/* connects to localhost:27017 */$connection = new Mongo();

/* connect to a remote host (default port) */$connection = new Mongo( "example.com" );

/* connect to a remote host at a given port */$connection = new Mongo( "example.com:65432" );

/* select some DB (and create if it doesn’t exits yet) */$db = $connection->selectDB("db name");

/* select a "table" (collection) */$table = $db->getCollection("table");

@crodas - http://crodas.org/ - LATEX 26

Page 27: Introducción al mundo NoSQL

FROM SQL to MongoDB

@crodas - http://crodas.org/ - LATEX 27

Page 28: Introducción al mundo NoSQL

MongoDB - Count

/* SELECT count(*) FROM table */$collection->count();

/* SELECT count(*) FROM table WHERE foo = 1 */$collection->find(array("foo" => 1))->count();

@crodas - http://crodas.org/ - LATEX 28

Page 29: Introducción al mundo NoSQL

MongoDB - Consultas

/** SELECT * FROM table WHERE field IN (5,6,7) and enable=1* and worth < 5* ORDER BY timestamp DESC*/

$collection->ensureIndex(array(’field’=>1, ’enable’=>1, ’worth’=>1, ’timestamp’=>-1)

);

$filter = array(’field’ => array(’$in’ => array(5,6,7)),’enable’ => 1,’worth’ => array(’$lt’ => 5)

);$results = $collection->find($filter)->sort(array(’timestamp’ => -1));

@crodas - http://crodas.org/ - LATEX 29

Page 30: Introducción al mundo NoSQL

MongoDB - Paginaciones

/** SELECT * FROM table WHERE field IN (5,6,7) and enable=1* and worth < 5* ORDER BY timestamp DESC LIMIT $offset, 20*/$filter = array(

’field’ => array(’$in’ => array(5,6,7)),’enable’ => 1,’worth’ => array(’$lt’ => 5)

);

$cursor = $collection->find($filter);$cursor->sort(array(’timestamp’ => -1))->skip($offset)->limit(20);

foreach ($cursor as $result) {var dump($result);

}

@crodas - http://crodas.org/ - LATEX 30

Page 31: Introducción al mundo NoSQL

Diseñando documentosSimple multi-blog system

@crodas - http://crodas.org/ - LATEX 31

Page 32: Introducción al mundo NoSQL

MongoDB - Collections

� Blog

� Post

� User

� Comment

@crodas - http://crodas.org/ - LATEX 32

Page 33: Introducción al mundo NoSQL

Documentos "blog"

$blog = array("user" => <userref>,"title" => "Foo bar blog""url" => array(

"foobar.foobar.com","anotherfoo.foobar.com",

),"permissions" => array(

"edit" => array(<userref>, <userref>));"post" => 1,...

);

@crodas - http://crodas.org/ - LATEX 33

Page 34: Introducción al mundo NoSQL

Documentos "post"

$post = array("blog" => <blogref>,"author" => <userref>,"uri" => "/another-post","title" => "Another post","excerpt" => "bla, bla, bla","body" => "bar, foo bar, foo, bar","tags" => array("list", "of tags"),"published" => true,"date" => <mongodate>,

);

@crodas - http://crodas.org/ - LATEX 34

Page 35: Introducción al mundo NoSQL

otros documentos

$comment = array("post" => <postref>,"name" => "foobar","email" => "[email protected]","comment" => "Hello world","date" => <mongodate>,

);

$user = array("user" => "crodas","email" => "[email protected]","password" => "a1bad96dc68f891ca887d50eb3fb65ec82123d05","name" => "Cesar Rodas",

);

@crodas - http://crodas.org/ - LATEX 35

Page 36: Introducción al mundo NoSQL

Índices

$blog col->ensureIndex(array("url" => 1));

$post col->ensureIndex(array("blog" => 1, "date" => -1));$post col->ensureIndex(array("blog" => 1, "uri" => 1), array("unique" => 1));

$comment col->ensureIndex(array("post" => 1, "date" => -1));

$user col->ensureIndex(array("user" => 1), array("unique" => 1));$user col->ensureIndex(array("email" => 1), array("unique" => 1));

@crodas - http://crodas.org/ - LATEX 36

Page 37: Introducción al mundo NoSQL

Eso es todo :-)

@crodas - http://crodas.org/ - LATEX 37

Page 38: Introducción al mundo NoSQL

Agreguemos emociones :-)

@crodas - http://crodas.org/ - LATEX 38

Page 39: Introducción al mundo NoSQL

Let’s shard it!

@crodas - http://crodas.org/ - LATEX 39

Page 40: Introducción al mundo NoSQL

Estrategia

� Shard la coleción "blog"

� Shard la coleción "user"

� Las otras coleciones estan aisladas• Crear “namespaces”para post and comments (foo.post, foo.comments)

• Modificar "blog" para agregar referencia hace el “namespaces”

� MongoDB hará el trabajo por nosotros

@crodas - http://crodas.org/ - LATEX 40

Page 41: Introducción al mundo NoSQL

Configurando MongoDB

/* Asumiendo que tienes MongoDB ejecutandose* en un entorno distribuido (sharded), esto* se hace una sola vez.** $admin es una coneccion a la DB "admin"*/$admin->command(array(

"shardcollection" => "blog","key" => array("uri" => 1),

));

$admin->command(array("shardcollection" => "user","key" => array("user" => 1),"unique" => true,

));

@crodas - http://crodas.org/ - LATEX 41

Page 42: Introducción al mundo NoSQL

Nueva colección "blog"

$blog = array("user" => <userref>,"title" => "Foo bar blog""url" => array(

"foobar.foobar.com","anotherfoo.foobar.com",

),"permissions" => array(

"edit" => array(<userref>, <userref>));"post" => 1,"namespace" => "3h3g3k3","database" => "34fs321",

);

@crodas - http://crodas.org/ - LATEX 42

Page 43: Introducción al mundo NoSQL

Selecionar el namespacecorrecto, y consultar :-)

@crodas - http://crodas.org/ - LATEX 43

Page 44: Introducción al mundo NoSQL

Preguntas?

@crodas - http://crodas.org/ - LATEX 44

Page 45: Introducción al mundo NoSQL

Gracias hackers!

@crodas - http://crodas.org/ - LATEX 45

Page 46: Introducción al mundo NoSQL

@crodas

crodas.org

@crodas - http://crodas.org/ - LATEX 46