Sistemas Distribuidos


Curso de escalabilidad v3, día 1

Vuestro Anfitrión


Alex Fernández (pinchito)



 

Backend Engineer at Tinybird

Programa


¿Qué es escalabilidad?

Escalado horizontal y vertical

Estrategias de escalado

Sistemas distribuidos

Replicación de servidores

Qué es escalabilidad


Fuente

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.

Lexico (Oxford Dictionary)

Escalar arriba ¡y abajo!

Uso en literatura

Ejemplo: Linux

De embedded
a supercomputers

¿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/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-south-2, Europe (Spain)
Tipo t2-small (o superior)
Imagen service.pinchito.es-2023-10-16
(ami-03155b59b9152b7d7)

Accede por SSH y ejecuta el comando anterior:
# ssh ubuntu@[direcciónIP]
$ loadtest http://service.pinchito.es/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/a -n 2000 -c 100 --rps 300 -k
$ loadtest http://service.pinchito.es/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/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/d -n 2000 -c 100 -k

¿En qué se diferencian?

¿Cómo se portan la latencia y la respuesta de rps?



Success!


¿qué recurso se ha agotado?


Gráfica de CPU de AWS:

300 rps
400 rps
1000 rps

rps vs throughput



Perfiles de Escalabilidad


Brendan Gregg: Systems Performance

Latencia vs rps



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.


Wikipedia

Si incrementamos la concurrencia L,
el tiempo medio por petición W crece en igual medida.

Escalado v⇕ y h ⇔

Comienzos difíciles


IBM mainframe

Servidores especializados


Las típicas cabinas

Y entonces llegó Google

Cabina de almacenamiento, 1996

Escalado vertical ⇕


Comprar una máquina más gorda


Y otra más gorda


Así hasta que se acaban las máquinas


Es difícil volver a una máquina más pequeña 😅

Escalado vertical ⇕


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

Escalado horizontal ⇔


Ejercicio: Almacenamiento


Diseña un almacenamiento corporativo de 15 TB


Opción 1 ⇕: storage area network (SAN)

Mejor opción de diciembre 2008


Opción 2 ⇔: discos en bruto

Mejor opción de enero 2009


Ejercicio +


Añade controladores


Opciones RAID (Redundant Array of Inexpensive Disks)


Mide la diferencia económica entre opción 1 y opción 2

¿Precio final?


Ejercicio +


Considera estrategias de redundancia

Tolerancia a fallos

Opciones de redundancia: 2x, 3x, ?


Considera estrategias de escalado


¿Cómo afectan al precio?



Success!



Estrategias h ⇔


Balanceo (servidor)

Balanceo (cliente)

Afinidad

Independencia

Sharding

Clustering

Replicación

Colas

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

Usa discos de la época


Ejercicio +


10 KB por página

50 millones de páginas

4 millones de búsquedas al día

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é



Well done!



Sistemas Distribuidos


Teorema CAP


Eric Brewer, 1999 (demostrado por Gilbert&Lynch, 2002).


C: consistency, consistencia


A: availability, disponibilidad


P: network partition, partición de red


Elige dos.

¿Cómo afecta a las bases de datos?

Clasificación según el teorema CAP (mal)

CAP 2012


Eric Brewer, 2012

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



¡A tope!



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: control de costes


Amazon ofrece ElastiCache for Redis


Un Redis "completamente gestionado"


En realidad cobra por instancia


¿Cuál es el sobrecoste asociado?


Ejercicio +


Precio de ElastiCache for Redis comparado con instancias

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




Good job!



Replicación de servidores

Repositorios


Todo debe estar "repositado"


Incluyendo la configuración


Múltiples soluciones:
Terraform, Pulumi, propietarias

Scripts


Replicar el sistema de forma automática


También todo en repo!


Para más sofisticación: Ansible, Kubernetes

Imágenes


AMIs: lock-in de Amazon AWS
GCP: images

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)

You want efficient application scaling? Go serverless!

Lenguajes en AWS Lambda


Fuente

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?


You did it!



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


Ejercicio +


Configurar para que corra cada tres minutos



Awesome!



Bibliografía


Eric Brewer: CAP Twelve Years Later: How the "Rules" Have Changed


Brendan Gregg: Systems Performance: Enterprise and the Cloud


John Allspaw: Web Operations: Keeping the Data On Time


HighScalability.com: Favorite posts on HighScalability