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. ¿Quién necesita escalar
mucho? Ejemplos:
• 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
• Podemos escalar:
• Con software más óptimo. ¡Ahorro de costes!
Ejemplo: http://bit.ly/ibdi20
• Con hardware:
• Verticalmente: mejor hardware en 1 máquina
• Horizontalmente: más máquinas
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. Menéame.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
Fuente: http://bit.ly/fLf0MK
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 “automático”:
• nodo = hash(clave) % nodos
23. Para no hacerlo
nosotros...
• redis-cluster
• En desarrollo.Versión experimental en Marzo
• RC prevista para Junio
• http://bit.ly/c4XyyZ
• redis-sharding
• Sustituto temporal hasta que redis-cluster esté listo
• https://github.com/kni/redis-sharding
32. Modelado de datos
• Objetos → hashes
• Consultas → Listas, sets y sets ordenados
• Guardar sólo el id
• Son índices manuales
33. APIs bajo nivel
• Muchas en muchos lenguajes.
• En Java por ejemplo: Jedis
• Spring Data
34. APIs de alto nivel
• GORM Redis
• ¿Hacemos la nuestra?
35. Do it yourself
public static IntegerValue users = new IntegerValue("users");
public static ObjectValue<User> user
= new ObjectValue<User>(User.class, "user");
Integer n = users.incr();
User u = new User("Pepe");
user.withKey(n.toString()).set(u);
36. Do it yourself
• Clases que abstraen los valores soportados
en Redis:
• IntegerValue
• ObjectValue con generics
• ListValue
• SetValue
• SortedSetValue.
37. Do it yourself
• withKey(String...params)
• Construye una clave con un prefijo y los
params separados por “:”.
• Devuelve un objeto con métodos
apropiados para el tipo de dato
47. 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. Que sea persistente tiene
• una ventaja importante: si
Como base de datos principal. se cae la caché, al volver a
arrancarla no está vacía.
Así que no habrá un aluvión
de peticiones a la fuente de
datos principal.