Professional Documents
Culture Documents
A V0
N2
B V0
Un nodo actualiza el valor
N1
A V1
N2
B V0
El valor se traslada al otro
nodo
N1
A V1
N2
B V1
Nodo 2 lee el valor
N1
A V1
N2
B V1
El problema de tener Partition
Tolerance
N1
A V1
N2
B V0
La transacción
A1: Write
Sync
A2: Read
Entonces:
A rch ivo
S e cto r 1
S e cto r 2
S e cto r 3
Implementaciones
• Distribuidas
– Toman la responsabilidad de:
• Partition, para escalabilidad
• Replication, para disponibilidad
– Amazon Dynamo, Voldemort,
CouchDB (via Lounge), Riak,
MongoDB (en desarrollo), BigTable,
Cassandra, HyperTable, Hbase
• No Distribuidas
– Responsabilidad en el cliente
Modelos de Datos
• Key-Value store
– Ej: Amazon Dynamic, Voldemort,
Tokyo Cabinet
• Column store
– Ej: Google BigTable, Cassandra,
HBase
• Document store
– Ej: Apache CouchDB, MongoDB
• Graph databases
– Ej: Neo4j
Disco o Memoria
• En Memoria
– Redis (async write to disk), Scalaris
• En Disco
– CouchDB, MongoDB, Riak (archivos)
– Voldemort (BDB o MySQL)
• Configurable
– BigTable, Cassandra, Hbase,
HyperTable
Dynamo
• Producto interno de Amazon
• Orientado a AP (Availability, Partition
Tolerance)
• Sacrifica Consistency
• Adopta Eventual Consistency
• Muchos servicios internos de Amazon
necesitan acceder por Clave a un
Valor
• Los Datos son Particionados
• Los Datos son Replicados
Cientos de
Servicios
en Amazon
Operaciones
• Cada clave tiene un nodo coordinador asignado
• La clave-valor se replica en otros servidores
• Put(key, value, context)
– Clave y valor
– Siempre toma el “write”
– Contexto tiene información como la versión
– Puede pedir que se escriba en W nodos
• Get(key)
– Dado la clave, recupera el valor Y el contexto
– Puede dar un valor, o una lista de valores en
conflicto
– La aplicación decide qué hacer con los conflictos
– Puede pedir valores de R nodo
Anillo de Nodos
• Si el
nodo B
se cae,
pasa a
usar
otro
para
manej
ar la
clave
K
Manejo de Modificaciones
• Maneja
versiones,
marcando
[Sx, T]:
qué
servidor,
qué
“tiempo”
BigTable
• Nace en Google
• Orientado a CA:
– Strong Consistency
– High Availability
– Pero no resuelve Network Partitions
• No tiene replicación a nivel de una base de
datos:
– La replicación la hace el Google File System
• Usado en Web indexing, Google Earth,
Google Finance, Google Analytics, etc.
• Estas aplicaciones manejan datos desde
simples URLs a fotos satelitales, desde
batch hasta datos para usuarios finales en
el momento
Modelo de Datos
• Pros
– Fácil de distribuir en un cluster
–
• Cons
– No hay queries complejas (sólo simples)
– Todos los joins deben hacerse en código
– No hay control de “clave foránea”
SimpleDB
• Acceso por servicios web
• Ofrecido por Amazon con cargo
• Replicación en data centers
• Eventual consistency en read
• Consistency en read
SimpleDB
Conceptos
• Cuenta del cliente: la planilla
completa
• Dominio: cada hoja
– Particionar dominio: en vez de
Products: Books, DVDs, CDs
• Items: cada fila
• Atributo: cada columna
• Valores: en la celda, pueden ser
multivaluadas
Consistent vs Eventually
Consistent Read
W 1 R1
co lo r: re d C o n siste n t: W 2
C lie n te 1 E ve n tu a l: W 1 , W 2 , o n a d a
Tim e lin e
C lie n te 2 W 2 R2
co lo r: ruby C o n siste n t: W 2
E ve n tu a l: W 1 , W 2 , o n a d a
Consistent vs Eventually
Consistent Read
W 1 R1
co lo r: re d C o n siste n t: W 1 o W 2
E ve n tu a l: W 1 , W 2 , o n a d a
C lie n te 1
Tim e lin e
C lie n te 2 W 2 R2
co lo r: rubyC o n siste n t: W 1 o W 2
E ve n tu a l: W 1 , W 2 , o n a d a
Consistent vs Eventually
Consistent Read
W 1 R1
co lo r: re d C o n siste n t: W 1 o W 2
C lie n te 1 E ve n tu a l: W 1 , W 2 , o n a d a
Tim e lin e
C lie n te 2 R2
W 2
C o n siste n t: W 1 o W 2
co lo r: ruby
E ve n tu a l: W 1 , W 2 , o n a d a
Apache Cassandra
• Proyecto Apache de código abierto, escrito en
Java
• Originalmente desarrollado en Facebook
• Rackspace, Digg, SimpleGeo, Twitter, etc..
• Alta disponibilidad: desde “write nunca falla”
hasta “esperar a que todas las réplicas se
puedan leer”
• Eventualmente consistente
• Decentralizado: todos los nodos en el cluster
son iguales
• Tolerante a fallas: los datos son replicados
automáticamente en múltiples nodos
• Flexible: agregado de nuevos nodos sin bajar el
servicio
• Es base de datos distribuida, usando el modelo
Modelo de Datos: Columna
• Unidad básica
• Nombre, valor,
timestamp
Modelo de Datos:
SuperColumna
• Tiene nombre
• Y un map de Key-
Column
ColumnFamily
• Lo más parecido a Table de base de
datos
• Tiene Nombre
S e le a g re g a n m a p a s d e co lu m n a s
Modelo de Datos
• SuperColumnFamily
– Como ColumnFamily pero contiene
SuperColumns
• KeySpace
– Contiene varias familias (tablas)
– Generalmente uno por aplicación
Un caso: Twitter
Un Tweet
B u sca r p o r Id : 1 4 4 9 1 8 4 7 8 8 0
B u sca r p o r Id d e U su a rio : in t
Implementación original
• Relacional
• Una sola tabla, escalada
• Replicación Master-Slave
• Memcached para reads
Implementación Original
E scrib ir B a se
M e m ca ch e d
Le e r
M e m ca ch e d
R a ils
M a ste r
M e m ca ch e d
S la ve S la ve
Problema
• Los disk arrays no pasan de 800GB
• Con 2,954,291,678 tweets, el 90%
del espacio está utilizado
• Solución: Partition
Posible: Partition por
primary key
Q u e ry co n o p e ra d o re s
Ejemplo en C#
Otro modelo: Graph Neo4j
Nodos y Relaciones
N o d e n e o = g ra p h d b . cre a te N o d e ();
n o d e . se tPro p e rty (" n a m e " , " N e o " );
N o d e m o rp h e u s =
g ra p h d b . cre a te N o d e ();
m o rp h e u s. se tPro p e rty (" n a m e " ,
" Morpheus " );
n e o . cre a te R e la tio n sh ip To ( morpheus ,
K N O W S );
De vuelta: Modelo de Datos
Key-Value
Column
Tamaño
Document
Graph
Complejidad
El tema a seguir
• Ir más allá de escalabilidad o
disponibilidad
¿Podrá NoSQL ofrecer un
mejor soporte para
modelar modelos de
dominio ricos?