Tipos de escalamiento: vertical y horizontal

3/17
Recursos

Aportes 16

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

AUTOSCALING ANIDADO

Es un poco complejo implementar el escalado, ya que en mi caso requerí de mucha información y parametrización para poder implementar lo que le llamamos escalado horizontal anidado.

Teníamos una aplicación corriendo en Kubernetes y que tenía mínimo 1 pod y máximo 3 corriendo. Todo bien, después con el tiempo nos dimos cuenta de que la usabilidad de la aplicación iba creciendo exponencialmente y al no estar preparados la aplicación comenzó a experimentar fallos (a pesar de usar kubernetes en AWS).

Que decidimos hacer?

  • medimos las horas pico de usabilidad
  • medimos la cantidad de recursos que se utilizan en esas horas
  • con base a ello se parametrizó de manera más eficiente la cantidad de pods que se utilizarán y los disparadores que crearán estos pods.

Pero la legión del mal atacó nuevamente. Sin embargo esta vez el servidor que servía como worker node estaba saturado por lo que teníamos que tomar una decisión:
¿Le incrementamos en recursos?
Sabíamos que incrementar en recursos no era muy eficiente, puesto que solo se utilizaría en cierta cantidad de tiempo. Por otro lado el hecho de incrementarle recursos implicaba apagar la máquina virtual así como tratar de parametrizar la hora más eficiente para subir los recursos

¿Qué decidimos hacer??

  • volver a medir, medir y medir.
  • separamos el plano de datos (media) que vivían en el servidor (worker node) y lo implementamos via EFS con el fin de evitar inconsistencias de datos.
  • implementamos crecimiento horizontal de los worker nodes con el uso de autoscaling groups.
  • voila (como dicen en España ese servicio no lo tumba ni Dios)

Escalamiento vertical: Aumentar la potencia de servidor
Escalamiento horizontal: Aumenta el numero de servidores

Un ejemplo de DB:

  • MySQL (escalamiento vertical)
  • MongoDB (escalamiento horizontal)

Escala verticalmente cuando las tareas que se realizaran sean pesdas y horizontalmente cuando las tereas sean muy concurrentes.
ahora si la tarea es pesda y muy concurrente, reviza tu app y sino se puede hacer mas, escala de ambas formas, pero para no gastar demaciodos recursos, escala solamente en las hroas pico cuando tu app este mas saturada.

Algo que manejamos en el equipo al que pertenezco:

  1. Comprender el objetivo de los servicios que manejamos en nuestros servidores.
  2. Tener una medición de la cantidad de solicitudes que se atienden, asi como el consumo de los recursos

En base a la información debemos definir una metrica con respecto al performance (por lo general entiendo es tipo de respuesta del servicio, para casos sincronos), definiendo el margen aceptable para el redimiento de nuestros servicios por ejemplo que el tiempo de respuesta sea de (.5 a 1 segundo).

Con este Margen:

  1. Si no llegamos a los tiempos de los servicios debido a que no tenemos recursos, se debe pensar en escalar verticalmente. Generalmente existen parametros dependiendo de la tecnología, por ejemplo hasta cuanta memoria se puede asignar a una JVM, etc.
  2. Si notamos que en base a la cantidad de requerimientos procesados el performance se ve impactado, se debe pensar en escalar horizontalmente.

Un Caso de Escalamiento es vertical puede ser para servidores de monitoreo, por lo cual se enfocan siempre en el procesamiento para realizar sus operaciones.

¿Cómo se sabe que una aplicación o microservicio necesita escalamiento vertical u horizontal?

  • El escalamiento vertical es simplemente agrandar el tamaño de las instancias.
  • El escalamiento horizontal se da cuando en vez de agrandar los servidores, se crean más servidores.

Un tipo de escalamiento no es mejor que otro, se debe implementar uno u otro dependiendo de las necesidades.

¿Existe algún caso de uso donde se prefiera un escalamiento vertical a horizontal al momento de atender problemas de alta concurrencia?
En el caso de que tengamos muchas peticiones cortas, no necesitamos un escalamiento vertical, sino uno horizontal. Esto nos permitirá recibir más peticiones y escalar independientemente; las diferentes partes de nuestra aplicación pueden crecer sin necesidad de estar involucradas en otras.

Continuando con el ejemplo de la clase anterior, podríamos escalar verticalmente los recursos encargados del procesamiento de videos y escalar horizontalmente los recursos encargados de la autenticación de usuarios (se pueden implementar los dos tipos de escalamientos en una misma infraestructura a diferentes recursos). De esta forma seremos más eficientes a la hora de usar recursos. Y esto no solamente nos permitirá ahorrar dinero, sino que podemos elegir recursos que sean mejores en unas cosas que en otras; por ejemplo, en algunos proveedores de nube hay algunas instancias de servidores que especiales para GPU (tienen un procesador de gráficas mucho mejor que el de los servidores comunes), otras especiales en CPU (tienen más procesamiento) u otras con más memoria RAM (pueden ser usadas por ejemplo para caché).

Debemos siempre tener en cuenta que tenemos diferentes tipos de recursos y diferentes formas de escalar que pueden ser aplicadas de diferentes maneras dependiendo del uso de nuestra aplicación.

Escalamiento vertical: el servidor de base de datos
Escalamiento horizontal: microservicio de notifications

en las bases de datos, por ejemplo, si tu aplicacion o modulo esta manejando datos sensiibles como transacciones de dinero, yo usaria una base de datos relacional, las cuales normalmente se escalan solo de forma vertical, pero me dan la ventaja de la integridad de data, si encambio la integridad no es lo mas omportante, podria usar una base de datos nosql y escalarla horizontalmente

Escalamiento Vertical: Crecimiento de los recursos del servidor. Comerte el pudin de un solo bocado.
Escalamiento Horizontal: Aumentar el numero de servidores. Comerte el pudin en muchos mas bocados al tiempo.

un ejemplo de Escalamiento vertical podría ser alguna aplicación que por su desarrollo, no soportaría el escalamiento horizontal y nos limitamos al vertical.

Ejemplos de tipos de escalamiento:

Para escalamiento vertical: Compresión de archivos, o incluso procesos automátizados de estadísticas que requieran mucho cálculo y se realicen x cantidad de veces durante un periodo de tiempo definido

Para escalamiento horizontal: Saturación de requests sobre un API, necesitaríamos crear más servidores para suplir esa demanda de tráfico

Escalamiento vertical: Un repositorio de almacenamiento, base de datos, imágenes, fotos o videos

Escalamiento horizontal: Para dividir la aplicación en varios servicios, o levantar mas servidores para atender las solicitudes.

Grande Pelado muchas gracias

Para el caso de una aplicación de compras de ticketes, podemos usar el servicio de scale set de k8s para que en caso de altas concurrencias cree, las instancias necesarias a nivel horizontal. En tema vertical puede ser un servicio alojado en un contenedor el cual al momento de llegar al límite definido se le asigne más memoria o CPU con el fin de suplir la demanda temporal.

Totalmente de acuerdo.