Escalado basado en Amazon SQS - Amazon EC2 Auto Scaling

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Escalado basado en Amazon SQS

importante

La información y los pasos siguientes le muestran cómo calcular la acumulación de colas de Amazon SQS por instancia utilizando el atributo ApproximateNumberOfMessages queue antes de publicarlo como una métrica personalizada en. CloudWatch Sin embargo, ahora puede ahorrar el costo y el esfuerzo dedicados a publicar su propia métrica mediante la calculadora de métricas. Para obtener más información, consulte Creación de una política de escalado de seguimiento de destino para Amazon EC2 Auto Scaling con la calculadora de métricas.

En esta sección se muestra cómo escalar el grupo de escalado automático en respuesta a los cambios en la carga del sistema en una cola de Amazon Simple Queue Service (Amazon SQS). Para obtener más información acerca del uso de Amazon SQS, consulte la Guía del desarrollador de Amazon Simple Queue Service.

Hay algunas situaciones en las que es posible que tenga que pensar en la reducción horizontal en respuesta a la actividad en una cola de Amazon SQS. Por ejemplo, supongamos que tiene una aplicación web que permite a los usuarios cargar imágenes y utilizarlas en línea. En este escenario, cada imagen requiere cambiar el tamaño y la codificación antes de poder publicarla. La aplicación se ejecuta en instancias EC2 de un grupo de escalado automático y está configurada para gestionar las velocidades típicas de carga. Las instancias con error se terminan y se sustituyen para mantener los niveles de instancia actuales en todo momento. La aplicación coloca los datos de mapa de bits sin procesar de las imágenes en una cola de SQS para su procesamiento. Procesa las imágenes y, a continuación, publica las imágenes procesadas donde puedan verlas los usuarios. La arquitectura de este escenario funciona bien si el número de operaciones de carga de imágenes no varía con el tiempo. Sin embargo, si el número de operaciones de carga cambia con el tiempo, podría considerar la posibilidad de utilizar el escalado dinámico para escalar la capacidad del grupo de escalado automático.

Uso del seguimiento de destino con la métrica correcta

Si utiliza una política de escalado de seguimiento de destino basada en una métrica de cola de Amazon SQS personalizada, el escalado dinámico puede ajustarse a la curva de demanda de la aplicación de forma más eficaz. Para obtener más información sobre cómo elegir métricas para el seguimiento de destino, consulte Elección de métricas.

El problema de usar una métrica de CloudWatch Amazon SQS, como ApproximateNumberOfMessagesVisible para el seguimiento de destinos, es que es posible que el número de mensajes de la cola no cambie proporcionalmente al tamaño del grupo de Auto Scaling que procesa los mensajes de la cola. Eso se debe a que el número de mensajes de su cola de SQS no es el único factor que define el número de instancias necesarias. El número de instancias del grupo de escalado automático puede depender de varios factores, como el tiempo que se tarda en procesar un mensaje y la cantidad de latencia (retraso de la cola) aceptable.

La solución es utilizar una métrica de tareas pendientes por instancia con el valor de destino igual a las tareas pendientes aceptables por instancia que desea mantener. Puede calcular estos números como se indica a continuación:

  • Lista de tareas pendientes por instancia: para determinar su lista de tareas pendientes por instancia, comience con el atributo de cola ApproximateNumberOfMessages para determinar la longitud de la cola de SQS (número de mensajes disponibles para recuperación de la cola). Divida ese número por la capacidad de ejecución de la flota, que para un grupo de escalado automático es el número de instancias con el estado InService, para obtener las tareas pendientes por instancia.

  • Lista de tareas pendientes aceptables por instancia: para calcular su valor de destino, determine en primer lugar lo que la aplicación puede aceptar en términos de latencia. A continuación, deberá tomar el valor de latencia aceptable y dividirlo por el tiempo medio que una instancia EC2 tarda en procesar un mensaje.

Por ejemplo, supongamos que actualmente tiene un grupo de escalado automático con 10 instancias y el número de mensajes visibles en la cola (ApproximateNumberOfMessages) es 1500. Si el tiempo de procesamiento medio es de 0,1 segundos para cada mensaje y la mayor latencia aceptable es de 10 segundos, el número de tareas pendientes aceptables por instancia es de 10/0,1, que equivale a 100 mensajes. Esto significa que 100 es el valor de destino para su política de seguimiento de destino. Cuando la lista de tareas pendientes por instancia alcance el valor objetivo, se producirá un evento de escalado horizontal. Si la lista de tareas pendientes por instancia se encuentra actualmente en 150 (1500/10 instancias), su grupo se escala horizontalmente en 5 instancias para mantener la proporción con el valor de destino.

En los procedimientos siguientes se muestra cómo publicar la métrica personalizada y crear la política de escalado de seguimiento de destino que configura el grupo de escalado automático para que el escalado se realice en función de estos cálculos.

importante

Recuerde que, para reducir los costos, puede utilizar la calculadora de métricas. Para obtener más información, consulte Creación de una política de escalado de seguimiento de destino para Amazon EC2 Auto Scaling con la calculadora de métricas.

Existen tres puntos principales para esta configuración:

  • Un grupo de escalado automático para administrar las instancias EC2 para procesar mensajes de una cola de SQS.

  • Una métrica personalizada para enviar a Amazon CloudWatch que mide el número de mensajes en la cola por instancia EC2 del grupo Auto Scaling.

  • Una política de seguimiento de objetivos que configura su grupo de Auto Scaling para que escale en función de la métrica personalizada y un valor objetivo establecido. CloudWatch las alarmas invocan la política de escalado.

El siguiente diagrama ilustra la arquitectura de esta configuración.

Diagrama de arquitectura de Amazon EC2 Auto Scaling que utiliza colas

Limitaciones y requisitos previos

Para utilizar esta configuración, debe tener en cuenta las siguientes limitaciones:

  • Debe usar el SDK AWS CLI o un SDK para publicar su métrica personalizada. CloudWatch A continuación, puede supervisar su métrica con el AWS Management Console.

  • La consola de Amazon EC2 Auto Scaling no admite las políticas de escalado de seguimiento de destino que utilizan métricas personalizadas. Debe usar el AWS CLI o un SDK para especificar una métrica personalizada para su política de escalado.

Las siguientes secciones le indican cómo AWS CLI utilizarla para las tareas que necesita realizar. Por ejemplo, para obtener datos métricos que reflejen el uso actual de la cola, utilice el comando SQS. get-queue-attributes Asegúrese de que ha instalado y configurado la CLI.

Antes de comenzar, debe tener una cola de Amazon SQS que pueda usar. En las siguientes secciones se presupone que ya tiene una cola (estándar o FIFO), un grupo de escalado automático e instancias EC2 ejecutándose en la aplicación que utiliza la cola. Para obtener más información sobre Amazon SQS, consulte la Guía del desarrollador de Amazon Simple Queue Service.

Configuración del escalado basada en Amazon SQS

Paso 1: Crea una métrica personalizada CloudWatch

Una métrica personalizada se define mediante un nombre de métrica y un espacio de nombres de su elección. Los espacios de nombres para métricas personalizadas no pueden comenzar por AWS/. Para obtener más información sobre la publicación de métricas personalizadas, consulta el tema Publicar métricas personalizadas en la Guía del CloudWatch usuario de Amazon.

Siga este procedimiento para crear la métrica personalizada leyendo primero la información de su AWS cuenta. A continuación, calcule las tareas pendientes para cada métrica de instancia, tal como se recomienda en una sección anterior. Por último, publique este número con CloudWatch una precisión de 1 minuto. Siempre que sea posible, le recomendamos que cuando realizado el escalado basado en métricas, utilice una granularidad de un minuto para garantizar una respuesta más rápida a los cambios en la carga del sistema.

Para crear una métrica CloudWatch personalizada ()AWS CLI
  1. Utilice el get-queue-attributescomando SQS para obtener el número de mensajes en espera en la cola ()ApproximateNumberOfMessages.

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Use el describe-auto-scaling-groupscomando para obtener la capacidad de ejecución del grupo, que es el número de instancias en el estado del InService ciclo de vida. Este comando devuelve las instancias de un grupo de escalado automático junto con su estado de ciclo de vida.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Calcule las tareas pendientes por instancia dividiendo el número aproximado de mensajes disponibles para su recuperación de la cola por la capacidad de puesta en marcha del grupo.

  4. Crea un script que se ejecute cada minuto para recuperar el valor acumulado por instancia y publícalo en una métrica CloudWatch personalizada. Cuando publica una métrica personalizada, especifica el nombre de la métrica, el espacio de nombres, la unidad, el valor y cero o más dimensiones. Una dimensión consta de un nombre de dimensión y un valor de dimensión.

    Para publicar tu métrica personalizada, sustituye los valores de los marcadores de posición en cursiva por el nombre de la métrica que prefieras, el valor de la métrica, un espacio de nombres (siempre que no empiece por AWS «) y las dimensiones (opcional) y, a continuación, ejecuta el siguiente comando. put-metric-data

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

Una vez que la aplicación emita la métrica deseada, los datos se envían a. CloudWatch La métrica está visible en la CloudWatch consola. Puede acceder a ella iniciando sesión en la CloudWatch página AWS Management Console y navegando hasta ella. A continuación, puede ver la métrica desplazándose a la página de métricas o buscándola usando el campo de búsqueda. Para obtener información sobre la visualización de las métricas, consulta Ver las métricas disponibles en la Guía del CloudWatch usuario de Amazon.

Paso 2: Crear una política de escalado de seguimiento de destino

La métrica que creó ahora se puede añadir a una política de escalado de seguimiento de destino.

Para crear una política de escalado de seguimiento de destino (AWS CLI)
  1. Utilice el siguiente comando cat para almacenar un valor de destino para su política de escalado y una especificación de métricas personalizada en un archivo JASON llamado config.json en su directorio principal. Reemplace cada marcador de posición de entrada del usuario con información propia. Para el TargetValue, calcule las tareas pendientes aceptables por cada métrica de instancia e introdúzcala aquí. Para calcular este número, decida un valor de latencia normal y divídalo por el tiempo medio que tarda en procesar un mensaje, como se describe en una sección anterior.

    Si no especificó ninguna dimensión para la métrica que creó en el paso 1, no incluya ninguna dimensión en la especificación métrica personalizada.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Usa el put-scaling-policycomando, junto con el config.json archivo que creaste en el paso anterior, para crear tu política de escalado.

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    Esto crea dos alarmas: una para el escalado horizontal y otra para la reducción horizontal. También devuelve el nombre de recurso de Amazon (ARN) de la política en la que está registrada CloudWatch, que se CloudWatch utiliza para invocar el escalado cada vez que se infringe el umbral métrico.

Paso 3: Prueba de la política de escalado

Una vez que finalice la configuración, verifique que la política de escalado funcione. Puede probarla aumentando el número de mensajes en la cola de SQS y verificando después que el grupo de escalado automático ha lanzado una instancia EC2 adicional. También puede probarla reduciendo el número de mensajes en la cola de SQS y verificando después que el grupo de escalado automático ha terminado una instancia EC2.

Pruebas de la función de escalado horizontal
  1. Siga los pasos de Creación de una cola estándar de Amazon SQS y envío de un mensaje o Creación de una cola FIFO de Amazon SQS y envío de un mensaje para añadir mensajes a la cola. Asegúrese de que ha aumentado el número de mensajes en la cola de forma que las tareas pendientes por cada métrica de instancia supere el valor de destino.

    Este proceso puede tardar unos minutos hasta que los cambios invoquen la alarma.

  2. Utilice el describe-auto-scaling-groupscomando para comprobar que el grupo ha lanzado una instancia.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
Pruebas de la función de reducción horizontal
  1. Siga los pasos de Recibir y eliminar un mensaje (consola) para eliminar los mensajes de la cola. Asegúrese de que ha disminuido el número de mensajes en la cola de forma que las tareas pendientes por cada métrica de instancia esté por debajo del valor de destino.

    Este proceso puede tardar unos minutos hasta que los cambios invoquen la alarma.

  2. Usa el describe-auto-scaling-groupscomando para comprobar que el grupo ha terminado una instancia.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

Amazon SQS y protección de la reducción horizontal

Los mensajes que no se procesaron cuando se terminó la instancia se devuelven a la cola de SQS, donde pueden ser procesados por otra instancia que siga ejecutándose. Para las aplicaciones en las que se realizan tareas de ejecución prolongada, puede utilizar opcionalmente la protección frente a la reducción horizontal de instancias para tener el control sobre los procesos de trabajo de la cola que se terminan cuando el grupo de escalado automático se reduce horizontalmente.

En el siguiente pseudocódigo se muestra una forma de proteger los procesos de trabajo controlados por cola de larga ejecución frente a la terminación por reducción horizontal.

while (true) { SetInstanceProtection(False); Work = GetNextWorkUnit(); SetInstanceProtection(True); ProcessWorkUnit(Work); SetInstanceProtection(False); }

Para obtener más información, consulte Diseñe sus aplicaciones en Amazon EC2 Auto Scaling para gestionar sin problemas la terminación de instancias.