Introducción a esta base de datos NoSQL que permite desarrollar aplicaciones altamente escalables gracias a su velocidad (100k operaciones por segundo en un ordenador corriente) y su capacidad de trabajar en varios nodos.
4. ¿RDBMS suficiente?
• 640K - of memory - ought to be
enough for anybody - Bill Gates?
• Who the hell knew how much address
space we needed? - Vint Cerf
5. ¿Hasta cuánto
necesitaré escalar?
• ¿Cuántos usuarios tienes? ¿Cuál es tu
máximo de usuarios? Tu país, todos
los smartphones del mundo, el mundo
entero,...?
• ¿Cuántas peticiones/s hace cada
usuario de media?
• Elasticidad: ¿tienes picos?
6. Ejemplos de apps que
necesitan escalar
• Juegos. Especialmente multijugador
• Aplicaciones sociales. Ej: Facebook
apps
• Web services. Ej: pasarelas de pago.
• ¿Tú? Depende, claro
7. Escalar es...
• Escalar es poder atender más
peticiones/s
• Se consigue
• Con software más óptimo. ¡Ahorro
de costes! Ej: http://bit.ly/ibdi20
• Con hardware verticalmente u
horizontalmente
13. Join, join, join, join
SELECT link_id AS id, link_author AS author, link_blog AS blog, /* muc
! FROM links
! INNER JOIN users ON (user_id = link_author)
! LEFT JOIN (categories AS cat, categories AS meta) ON (cat.category_i
! LEFT JOIN votes ON (link_date > @enabled_votes AND vote_type='links'
! LEFT JOIN favorites ON (@user_id > 0 AND favorite_user_id = @user_i
! LEFT JOIN link_clicks AS clicks ON (clicks.id = links.link_id)
! INNER JOIN (SELECT link_id FROM links $from WHERE $where $order_by L
Fuente: http://bit.ly/fLf0MK
14. Meneame.net
Creo que sería muy complicado encontrar una
consulta más eficiente que la anterior para la
base de datos del Menéame. Pero no ha sido
una idea que se me ocurrió de un día para
otro, ni siquiera en semanas. Fue la evolución
y el resultado de 5 años de experiencia
directa, a veces dolorosa, y de aprender
muchas cosas en el proceso.
- Ricardo Galli
21. Particionamiento
• Los datos están en varios nodos
• A partir de la clave sabemos el nodo
donde está el dato
• Particionamiento manual. Ej: claves
con fechas
• Ejemplo particionamiento
“autoámtico”:
• nodo = hash(clave) % nodos
22. Particionamiento
• nodo = hash(clave) % nodos
• Problema: resharding. Al añadir o
quitar nodos ¡hay que mover casi
todos los datos!
• Solución: consistent hashing
23. Para no hacerlo
nosotros...
• redis-cluster (en desarrollo)
• redis-sharding. Sustituto temporal
hasta que redis-cluster esté listo.
31. Modelado de datos
• Objetos ➔ hashes
• Consultas ➔ listas, sets y sets
ordenados
• Guardar sólo el id
• Son índices manuales
32. Consultas
• Consultamos el índice y hacemos JOIN
en la aplicación
• Consultas complejas con UNIONES e
INTERSECCIONES
• Paginaciones con LIMIT y OFFSET
• Borrado en cascada? Lecturas
destructivas
33. Transacciones
• MULTI. Inicia transacción
• EXEC. Ejecuta transacción
• DISCARD. Cancela transacción
• WATCH / UNWATCH. Bloquea /
desbloquea valores de ser modificados
durante la transacción.
36. Próximamente en Redis
• Scripting con LUA en la 2.6. Algo así
como procedimientos almacenados
• Redis-cluster en la 3.0
• Y más: http://antirez.com/post/short-
term-redis-plans.html
37. Cuándo usar Redis
• Como caché. Un memcache con datos
estructurados y ¡persistente!. También
soporta expiración.
• Como base de datos auxiliar cuando se
necesite mucha velocidad.
• Como base de datos principal.
38. ¿Algún inconveniente?
• Funciona con los datos en memoria
• ¡Pero es persistente!
• Snapshots o Append-only-file
• Y soporta replicación
• VM y diskstore fueron “deprecated”