Автоматическое масштабирование с использованием формирования облаков в соответствии с количеством запросов

Мы используем формирование облака для автоматического масштабирования в соответствии с метрикой RequestCount балансировщика нагрузки. В настоящее время мы увеличиваем масштаб экземпляра, если запрос увеличивается до 1500 за 1 минуту (каждый экземпляр может обрабатывать 1500 запросов в минуту). Проблема в том, что группа автомасштабирования постоянно проверяет RequestCount и добавляет новый экземпляр, если количество запросов превышает 1500 в течение 1 минуты. Но это не требуется, так как у меня сейчас есть 2 экземпляра, которые могут обрабатывать 3000 запросов. в минуту. Есть ли возможность сделать матрицы на заказ? т. е. если будет добавлен новый экземпляр, политика масштабирования изменится до 3000 req.

Пример сценария:

  1. Первоначально к ELB подключен 1 ELB, 1 экземпляр tomcat (может обрабатывать 1500 запросов в минуту).
  2. 1 облачные часы с активным масштабированием, если требуется. счет на ELB увеличен до 1500 за мин.
  3. В настоящее время нагрузка на запрос ELB составляет 1500 за 1 мин. сейчас требуется нагрузка увеличивается до 1700 мин. поэтому он прикрепит новый экземпляр tomcat на ELB. Так что у меня есть 2 экземпляра, которые могут обрабатывать 3000 запросов. за мин.
  4. Но теперь, что проблема в облаке смотреть все еще проверить требование. рассчитывать на ELB и, если требуется. нагрузка 1700 мин. он добавит один новый экземпляр tomcat, который не требуется.

Как я могу преодолеть эту проблему?

3 ответа

Решение

То, что вы хотите сделать, это использовать среднее значение для балансировщика нагрузки. Вы можете иметь различные типы метрик. Сумма, Средняя, ​​Минимальная, Максимальная и Выборка. Если вы выберете Среднее, оно даст вам среднее значение для всех случаев под балансировкой нагрузки. Таким образом, запуск нового экземпляра будет запускаться только тогда, когда все серверы в вашей группе будут обрабатывать 1500 запросов в минуту.

Краткое описание типа:

  • Среднее - среднее для балансировщика нагрузки
  • Сумма - общее количество запросов (пример: 3000)
  • Максимум - максимальное количество запросов, которое имеет любой сервер (потому что он может быть точно не сбалансирован)
  • Минимум - минимальное количество запросов, которые имеет любой сервер (потому что он может быть точно не сбалансирован)
  • Образец - количество серверов, используемых для расчета среднего значения (по сути, сколько серверов находится на распределителе нагрузки)

Вы также можете создавать свои собственные метрики, но вам нужно будет создать приложение, которое сообщает amazon, каковы значения. Используя облачные часы API, вы можете легко создать свой собственный. Посмотрите здесь http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html?r=1540

Как сказал dsummersl, RequestCount нельзя использовать сразу со средними показателями.

Я нашел пару обходных путей здесь. По сути, они говорят вам определить пользовательскую метрику CloudWatch, чтобы вы могли настроить свои экземпляры для выдачи количества запросов, которые они получают.

Для этого вам нужно будет собрать количество запросов от каждого экземпляра и отправить его в cloudwatch с помощью put-metric-data или создания расширения, чтобы EBS сделал это за вас (я думаю, это самый простой способ).

Затем вы можете настроить автоматическое масштабирование на увеличение / уменьшение на основе этой пользовательской метрики.

Надеюсь, поможет.

Я сделал масштабирование на основе RequestCount работать, применяя политику масштабирования со связанными тревогами Cloudwatch, которые запускают анализ политики. Ниже вы найдете шаблон облачной информации, который я использовал в приложении ElasticBeanstalk:

   RequestCountScalingAlarmLt2000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions:
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when Request Count < 2000"
       AlarmName: {"Fn::Join": ["-", ["Scale when Request Count < 2000", { "Ref":"AWSEBEnvironmentName" }]]}
       ComparisonOperator: LessThanThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 2000
   RequestCountScalingAlarmGt2000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions:
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when 2000 < Request Count < 20000"
       AlarmName: "Scale when Request 2000 < Count < 20000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 2000
   RequestCountScalingAlarmGt20000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions:
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when 20000 < Request Count < 30000"
       AlarmName: "Scale when 20000 < Request Count < 30000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 20000
   RequestCountScalingAlarmGt30000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions:
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when 30000 < Request Count < 40000"
       AlarmName: "Scale when 30000 < Request Count < 40000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 30000
   RequestCountScalingAlarmGt40000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions::
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when 40000 < Request Count < 50000"
       AlarmName: "Scale when 40000 < Request Count < 50000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 40000
   RequestCountScalingAlarmGt50000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions:
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when 50000 < Request Count < 60000"
       AlarmName: "Scale when 50000 < Request Count < 60000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 50000
   RequestCountScalingAlarmGt60000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions::
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when 60000 < Request Count < 70000"
       AlarmName: "Scale when 60000 < Request Count < 70000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 60000
   RequestCountScalingAlarmGt70000:
     Type: "AWS::CloudWatch::Alarm"
     Properties:
       ActionsEnabled: true
       AlarmActions:
         - Ref: RequestCountScalingPolicy
       OKActions:
         - Ref: RequestCountScalingPolicy
       AlarmDescription: "Scale when Request Count >= 70000"
       AlarmName: "Scale when Request Count >= 70000"
       ComparisonOperator: GreaterThanOrEqualToThreshold
       Dimensions:
         - Name: LoadBalancerName
           Value:
             Ref: AWSEBLoadBalancer
       EvaluationPeriods: "1"
       MetricName: RequestCount
       Namespace: AWS/ELB
       Period: "300"
       Statistic: Sum
       Threshold: 70000
   RequestCountScalingPolicy:
     Type: "AWS::AutoScaling::ScalingPolicy"
     Properties:
       AutoScalingGroupName:
         Ref: "AWSEBAutoScalingGroup"
       AdjustmentType: "ExactCapacity"
       PolicyType: "StepScaling"
       EstimatedInstanceWarmup: 120
       StepAdjustments:
         -
           MetricIntervalLowerBound: "0"
           MetricIntervalUpperBound: "2000"
           ScalingAdjustment: "1"
         -
           MetricIntervalLowerBound: "2000"
           MetricIntervalUpperBound: "20000"
           ScalingAdjustment: "2"
         -
           MetricIntervalLowerBound: "20000"
           MetricIntervalUpperBound: "30000"
           ScalingAdjustment: "3"
         -
           MetricIntervalLowerBound: "30000"
           MetricIntervalUpperBound: "40000"
           ScalingAdjustment: "4"
         -
           MetricIntervalLowerBound: "40000"
           MetricIntervalUpperBound: "50000"
           ScalingAdjustment: "5"
         -
           MetricIntervalLowerBound: "50000"
           MetricIntervalUpperBound: "60000"
           ScalingAdjustment: "6"
         -
           MetricIntervalLowerBound: "60000"
           MetricIntervalUpperBound: "70000"
           ScalingAdjustment: "7"
         -
           MetricIntervalLowerBound: "70000"
           ScalingAdjustment: "8"
Другие вопросы по тегам