6

Stiamo utilizzando la formazione di nubi per il ridimensionamento automatico in base alla metrica RequestCount del bilanciatore di carico. Attualmente scaliamo un'istanza se la richiesta viene aumentata a 1500 per 1 minuto (ogni istanza può gestire 1500 richieste al minuto). Il problema è che, poiché il gruppo di scalabilità automatica controlla continuamente il RequestCount e aggiunge una nuova istanza se il conteggio delle richieste è maggiore di 1500 per 1 minuto. Ma non è necessario in quanto ora ho 2 istanze che possono gestire 3000 req. al minuto. C'è qualche possibilità di personalizzare le matrici? Ad esempio, se viene aggiunta una nuova istanza, la politica di ridimensionamento passerà a 3000 req.Ridimensionamento automatico utilizzando la formazione di nubi in base al numero di richieste

Scenario di esempio:

  1. Inizialmente c'è 1 ELB, esempio 1 tomcat attaccato ELB (can maniglia 1500 req per min.).
  2. 1 orologio nuvola con azione di scala su ploicy se il req. contare su ELB è aumentato a 1500 per min.
  3. Attualmente il carico di richiesta su ELB è 1500 per 1 minuto. ora req. il carico viene aumentato a 1700 per min. quindi allegherà una nuova istanza di tomcat su ELB. Quindi ho 2 istanze in grado di gestire 3000 req. per min.
  4. Ma ora il problema è che il cloud watch controlla ancora il req. contare su ELB e se richiesto il carico è 1700 per min. aggiungerà una nuova istanza di Tomcat che non è richiesta.

Come posso uscire da questo problema?

risposta

4

Quello che si vuole fare è usare la media per il bilanciamento del carico. Puoi avere diversi tipi di metriche. Somma, media, minima, massima e campione. Se scegli Media, ti darà una media per tutte le istanze sotto loadbalancer. Pertanto, attiverà solo una nuova istanza di avvio quando tutti i server del gruppo sono a 1500 richieste al minuto.

Breve descrizione del tipo:

  • media - media per il bilanciamento del carico
  • Somma - Il numero totale di richiesta (ad esempio: 3000)
  • massima - Il numero massimo di richieste di qualsiasi server ha (perché potrebbe non essere bilanciato esattamente)
  • Minimo: il numero minimo di richieste di qualsiasi server (perché potrebbe non essere esattamente bilanciato)
  • Esempio: il numero di server utilizzati per il calcolo tardi la media (essenzialmente quanti server sono sul bilanciamento del carico)

È possibile creare anche le proprie metriche personalizzate, ma è necessario creare un'applicazione che indichi ad amazon quali sono i valori. Usando il cloud watch api puoi facilmente crearne uno tuo. Date un'occhiata qui http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html?r=1540

+2

Solo una nota che il RequestCount si può riassumere solo o campionata, e quando si utilizza il RequestCount, la cosa migliore da fare è di scala ad un "capacità desiderata" piuttosto che incremento/decremento (vedere https://forums.aws.amazon.com/thread.jspa?threadID=86073). – dsummersl

+0

Buon punto, dovresti farlo in questo modo perché RequestCount non ha una media. Mi sono dimenticato di questo grazie. – bwight

+0

Sì, non è una risposta valida in questo caso. –

1

Come ha detto dsummersl, RequestCount non può essere utilizzato immediatamente con le metriche medie.

Ho trovato un paio di soluzioni alternative here. Fondamentalmente, ti dicono di definire una metrica personalizzata di CloudWatch in modo da poter strumentare le tue istanze per emettere il numero di richieste che stanno ricevendo.

Per questo è necessario raccogliere il numero di richieste da ogni istanza e inviarlo a cloudwatch utilizzando put-metric-data o creando un ebextension in modo che l'EBS lo faccia per voi (penso che questo sia il modo più semplice).

Quindi è possibile impostare Ridimensionamento automatico per ridimensionare su/giù in base a tale metrica personalizzata.

Spero che aiuti.

0

Ho eseguito il ridimensionamento basato su RequestCount applicando Scaling Policy con lo Cloudwatch alarms associato che attiva la valutazione della politica. Qui di seguito troverete modello cloudformation che ho usato in ElasticBeanstalk app:

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" 
Problemi correlati