Автоматическое масштабирование с использованием формирования облаков в соответствии с количеством запросов
Мы используем формирование облака для автоматического масштабирования в соответствии с метрикой RequestCount балансировщика нагрузки. В настоящее время мы увеличиваем масштаб экземпляра, если запрос увеличивается до 1500 за 1 минуту (каждый экземпляр может обрабатывать 1500 запросов в минуту). Проблема в том, что группа автомасштабирования постоянно проверяет RequestCount и добавляет новый экземпляр, если количество запросов превышает 1500 в течение 1 минуты. Но это не требуется, так как у меня сейчас есть 2 экземпляра, которые могут обрабатывать 3000 запросов. в минуту. Есть ли возможность сделать матрицы на заказ? т. е. если будет добавлен новый экземпляр, политика масштабирования изменится до 3000 req.
Пример сценария:
- Первоначально к ELB подключен 1 ELB, 1 экземпляр tomcat (может обрабатывать 1500 запросов в минуту).
- 1 облачные часы с активным масштабированием, если требуется. счет на ELB увеличен до 1500 за мин.
- В настоящее время нагрузка на запрос ELB составляет 1500 за 1 мин. сейчас требуется нагрузка увеличивается до 1700 мин. поэтому он прикрепит новый экземпляр tomcat на ELB. Так что у меня есть 2 экземпляра, которые могут обрабатывать 3000 запросов. за мин.
- Но теперь, что проблема в облаке смотреть все еще проверить требование. рассчитывать на 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"