Sistemas Distribuidos
Curso de escalabilidad v2, día 1
Vuestros Anfitriones
Alex Fernández (pinchito)
Ingeniero senior freelancer
Ingeniero de software
Alfredo López Moltó
Programa
¿Qué es escalabilidad?
Escalado horizontal y vertical
Estrategias de escalado
Sistemas distribuidos
Replicación de servidores
Definición de escalabilidad
The capacity to be changed in size or scale.
The ability of a computing process to be used or produced in a range of capabilities.
Uso en literatura
¿Qué hace que algo sea escalable?
La pregunta correcta es: ¿por qué no escala algo?
- Escasez de algún recurso
- Tiempo de espera creciente
- Imposibilidad de responder
- Bloqueo de algún recurso
- ...
Ejercicio: Servicio poco escalable
Instala Node.js
Instala loadtest
$ npm install -g loadtest
Ejecuta el comando
$ loadtest http://service.pinchito.es:3000/a -n 2000 -c 100 --keepalive
Anota la media de peticiones por segundo (rps),
latencia media y número de errores
⮯
Ejercicio +
Crea una instancia en AWS EC2
Región eu-west-3, Europe (Paris)
Tipo t2-small (o superior)
Imagen pinchito-loadtest-2020-11-06
(ami-0f845d0a891816ce6)
Accede por SSH y ejecuta el comando anterior:
# ssh ubuntu@[direcciónIP]
$ loadtest http://service.pinchito.es:3000/a -n 2000 -c 100 --keepalive
Anota todo de nuevo: rps, latencia, errores
⮯
Ejercicio +
Ajusta las rps de loadtest de 100 a 1000 ±100
$ loadtest http://service.pinchito.es:3000/a -n 2000 -c 100 --rps 300 -k
$ loadtest http://service.pinchito.es:3000/a -n 2000 -c 100 --rps 400 -k
...
Anota rps, latencia y errores resultantes
Ve subiendo hasta 1000, luego haz 2000
$ loadtest http://service.pinchito.es:3000/a -n 2000 -c 100 --rps 2000 -k
⮯
Ejercicio +
Dibuja una gráfica con rps configuradas
y rps resultantes
Otra con rps vs latencia
⮯
Ejercicio +
Ahora prueba contra:
loadtest http://service.pinchito.es:3000/d -n 2000 -c 100 -k
¿En qué se diferencian?
¿Cómo se portan la latencia y la respuesta de rps?
⮯
¿qué recurso se ha agotado?
Gráfica de CPU de AWS:
300 rps
400 rps
1000 rps
Perfiles de Escalabilidad
Ley de Little
Little, 1952 - 1960
El número medio de peticiones en vuelo L es igual a:
la tasa de peticiones por segundo λ
por el tiempo medio por petición W.
Si incrementamos la concurrencia L,
el tiempo medio por petición W crece en igual medida.
Servidores especializados
Escalado vertical ⇕
Comprar una máquina más gorda
Así hasta que se acaban las máquinas
Es difícil volver a una máquina más pequeña 😅
Sshhh...
Hace muchas décadas que los superordenadores son...
clusters (racimos) de máquinas pequeñitas
IBM Blue Gene/P: 164k cores, 2007
Escalado Horizontal ⇔
Colocar muchas máquinas para hacer una función
("provisionamiento")
Añadir y quitar máquinas para escalar
Si falla una máquina se quita del servicio
Ejercicio: Almacenamiento
Diseña un almacenamiento corporativo de 15 TB
Opción 1 ⇕: storage area network (SAN)
Opción 2 ⇔: discos en bruto
Ejercicio +
Añade controladores
Opciones RAID (Redundant Array of Inexpensive Disks)
Mide la diferencia económica entre opción 1⇕ y opción 2⇔
Ejercicio +
Considera estrategias de redundancia
Opciones de redundancia: 2x, 3x, ?
Considera estrategias de escalado
¿Cómo afectan al precio?
⮯
Estrategias h ⇔
Balanceo (servidor)
Balanceo (cliente)
Afinidad
Balanceo en servidor
Ejemplo: ELB de AWS, Cloud Load Balancing de Google
Balanceo en cliente
Ejemplo: cliente de Facebook
Elige el endpoint para la API en el propio navegador
Ejemplo: balanceo por DNS
Afinidad ⇔
Por cookie o geográfica
Necesita un router sofisticado
En cliente o en servidor
Independencia ⇔
Balanceo neutro (o ciego)
Clustering ⇔
Término genérico (racimo):
hacer una máquina de muchas
En bases de datos suele significar:
se puede acceder a cualquier máquina del grupo
Sharding ⇔
Balanceo por clave
Necesita un algoritmo de reparto (hashing)
Replicación ⇔
Un servidor primario (escribir) y varias réplicas (leer)
Útil cuando lees > escribes
REPLICACIÓN activa ⇔
Activo-activo, múltiples primarios...
Necesita conciliación
Colas ⇔
Permite independizar la producción del consumo de tareas
Mecanismo de polling, poll = encuesta
(NO pooling, pool = piscina)
Ejercicio: almacenamiento Escalable
Trabajas para el buscador Fooble en enero de 2000
Tienes que almacenar el índice
Diseña una estrategia de escalado
Asume índice = tamaño de las páginas
⮯
Ejercicio +
10 KB por página
10 términos de búsqueda máximo
Tiempo objetivo de 0.1 segundos por búsqueda
⮯
Ejercicio +
50M páginas × 10 KB = 500 GB
Disco más barato: Seagate ST317242A, 17.2 GB, $152
32 discos × 16 GB = 512 GB, $4864
8 servidores × 4 discos = 32 discos
4M búsquedas × 100 ms = 400k segundos = 4.6 servidores
Contando hora punta: al menos 8 servidores
⮯
Ejercicio +
100 ms para ~5 términos de búsqueda
Tiempo medio de consulta al almacenamiento < 20 ms
⮯
Ejercicio +
Tiempo de consulta: seek time + 1/2 vuelta + formateo
Seek time: unos 8 ms
Disco de 7200 rpm: 8 ms por vuelta
Total consulta: >12 ms
Parece factible; mejor agregar una capa de caché
⮯
Teorema CAP
C: consistency, consistencia
A: availability, disponibilidad
P: network partition, partición de red
¿Cómo afecta a las bases de datos?
Ejercicio: Diseña un cajero automático
No hay conexión con el banco (hay partición de red)
¿Le damos el dinero al cliente?
⮯
Ejercicio +
Ante una P, hay que decidir entre A y C
Availability (disponibilidad): soltamos la pasta
El cliente puede no tener saldo
Consistency: no soltamos la pasta
Al fin y al cabo somos una entidad financiera seria
⮯
Ejercicio +
Solución: opción oculta A-
Para no sacrificar la disponibilidad, damos con un límite
Mantenemos un registro de dinero sacado en la tarjeta
Al volver la conexión, reintegramos la consistencia
⮯
Ejercicio +
Diseña un algoritmo de conciliación
Vale también para corregir transacciones duplicadas
y todo tipo de errores
Pista: los bancos llevan trabajando en ello siglos
Pista: prueba con operaciones atómicas
⮯
Punto único de fallo
SPoF, Single Point of Failure
Según algunos es malísimo
Es habitual y rutinario y útil y práctico
Efectividad en coste
Esperamos no sólo que el coste no suba al escalar
¡Esperamos que el coste por petición baje!
Ejercicio +
Instancias cache.r5.large, cache.r5.12xlarge
Bajo demanda, zona Europa (París)
¿Mejora con nodos reservados vs instancias reservadas?
¿Vale la pena el sobrecoste?
⮯
Ejercicio +
Incluye el coste de mantener Redis
Supón un coste fijo de 3h/mes + 1h/instancia
a €50/hora
El coste de mantener ElastiCache for Redis es la mitad
⮯
Replicación de servidores
Repositorios
Todo debe estar "repositado"
Incluyendo la configuración
Scripts
Replicar el sistema de forma automática
También todo en repo!
Imágenes
AMIs: lock-in de Amazon AWS
Docker: formato estándar
Imágenes portables
Usa el kernel local (en Linux)
Serverless
Una alternativa atractiva a los servidores alquilados
El paquete se sube a un servidor y se replica según haga falta
Escalado fácil (a veces trivial)
Ejercicio: Control de costes (II)
Un servicio tarda 100 ms por petición
El servicio, en Node.js, consume hasta 500 MB de memoria
Recibimos de media 100 req/s, con picos de hasta 300
Calcula el coste mensual de correrlo en AWS Lambda
⮯
Ejercicio +
Ahora calcula el coste en servidores EC2 equivalentes
Podemos crear varios procesos para servir peticiones
El consumo de CPU típico del proceso es del 25%
Asume un carga del 50% de CPU
⮯
Ejercicio +
Suma 3h/mes de mantenimiento por servidor a €50/h
Calcula el ahorro de costes en servidores de EC2
Calcula el ahorro si implementamos un balanceo
con la carga al 80%
¿A partir de qué nivel de carga sale rentable EC2?
¿Cómo nos aseguramos de ser rentables en el tiempo?
⮯
AWS Lambda: contras
Coste
Versiones anticuadas
Despliegue primitivo
Falta de control
Ejercicio: Dispositivo de presencia
Antiguamente: "dispositivo de hombre muerto"
Usar AWS Lambda para crear un servicio
Debe escribir un valor en Redis
El valor caduca a los cinco minutos
⮯
Ejercicio +
Provisionar un Redis (el más pequeño)
Provisionar un servicio en Lambda
Escribe un valor testigo
Duración: cinco minutos
⮯