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

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: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?



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 julio 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

Scripts


Replicar el sistema de forma automática


También todo en repo!


Para más sofisticación: Ansible

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)

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