6

로드 밸런서 RequestCount 메트릭에 따라 자동 확장을 위해 구름 형성을 사용합니다. 현재 요청이 1 분 동안 1500으로 증가하면 (각 인스턴스는 분당 1500 요청을 처리 할 수 ​​있음) 인스턴스를 확장합니다. 문제는 자동 확장 그룹이 RequestCount를 계속 확인하고 요청 수가 1500 분을 초과하면 새 인스턴스를 추가하기 때문에 문제입니다. 하지만 지금은 3000 req를 처리 할 수있는 2 개의 인스턴스가 있으므로 필요하지 않습니다. 분당. 행렬을 맞춤화 할 수있는 시설이 있습니까? 즉, 새로운 인스턴스가 추가되면 스케일 업 정책은 3000 req로 변경됩니다.요청 수에 따라 클라우드 형성을 사용하는 자동 확장

시나리오 예 :

  1. 처음 1 ELB ELB에 부착 한 톰캣 인스턴스가 (CAN 핸들 REQ 1,500 분당.).
  2. req. ELB에 대한 카운트는 분당 1500으로 증가합니다.
  3. 현재 ELB의 요청로드는 1 분간 1500입니다. 지금 req. 하중은 분당 1700로 증가합니다. 그래서 ELB에 새로운 바람둥이 인스턴스를 첨부 할 것입니다. 그래서 나는 3000 req를 처리 할 수있는 2 개의 인스턴스가있다. 분
  4. 하지만 지금은 구름 시계가 여전히 req를 확인하는 데 어떤 문제가 있습니다. ELB와 req에 계산하십시오. 부하는 분당 1700입니다. 필요하지 않은 새 바람둥이 인스턴스를 추가합니다.

어떻게이 문제가 발생합니까?

답변

4

로드 밸런서의 평균값을 사용하십시오. 다른 유형의 측정 항목을 사용할 수 있습니다. 합계, 평균, 최소, 최대 및 샘플. Average를 선택하면로드 밸런서 아래의 모든 인스턴스에 대한 평균을 제공합니다. 따라서 그룹의 모든 서버가 분당 1500 건의 요청을 처리하는 경우에만 새 인스턴스가 실행됩니다.

유형의

간략 설명 :

  • 평균 - 요청의 총 수 (예 : 3000) -로드 밸런서
  • 합계 평균
  • 최대 - 요청 모든 서버의 최대 수 (정확하게 균형을 잡지 못할 수도 있기 때문)
  • 최소 - 임의의 서버가 갖는 최소 요청 수 (정확히 일치하지 않을 수 있기 때문에)
  • 샘플 - 계산에 사용 된 서버 수 늦게 평균 (로드 밸런서에 몇 대의 서버가 있는지)

사용자 정의 메트릭을 만들 수도 있지만 아마존에 값이 무엇인지 알려주는 응용 프로그램을 만들어야합니다. Cloud Watch API를 사용하면 쉽게 자신 만의 API를 만들 수 있습니다. 여기를 보시길 바랍니다 http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html?r=1540

+2

이 할 수있는 가장 좋은 방법은 스케일이하는 것입니다 : 당신은 내가 ElasticBeanstalk 응용 프로그램에서 사용했던 cloudformation 템플릿을 찾을 수 아래 증분/감소가 아닌 '원하는 용량'(https://forums.aws.amazon.com/thread.jspa?threadID=86073 참조). – dsummersl

+0

좋은 점은 RequestCount에 평균이 없기 때문에 이런 식으로해야한다는 것입니다. 나는 그 감사를 잊었다. – bwight

+0

예,이 경우 유효한 답변이 아닙니다. –

1

dsummersl이 말한 것처럼, RequestCount은 평균 메트릭으로 곧바로 사용할 수 없습니다.

나는 몇 가지 대안을 발견했습니다. here. 기본적으로 CloudWatch는 사용자 정의 CloudWatch 메트릭을 정의하여 인스턴스가 수신중인 요청의 수를 방출하도록 지시합니다.

이 경우 각 인스턴스에서 요청 수를 수집하고 put-metric-data을 사용하여 cloudwatch로 보내거나 ebextension을 작성하여 EBS에서 처리하도록해야합니다 (가장 간단한 방법이라고 생각합니다).

그런 다음 사용자 정의 측정 기준에 따라 자동 확대/축소를 확대/축소로 설정할 수 있습니다.

희망이 있습니다.

0

나는 을 적용한 Scaling Policy을 적용하여 RequestCount에 기반한 확장을 만들었습니다.

RequestCount 만 요약 또는 샘플링 및 RequestCount를 사용할 때 될 수 있다는 것을 그냥 참고
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"