6

Chúng tôi đang sử dụng hình thành đám mây để tự động mở rộng quy mô dựa trên cân bằng tải RequestCount metric. Hiện tại, chúng tôi mở rộng một trường hợp nếu yêu cầu được tăng lên 1500 trong 1 phút (mỗi trường hợp có thể xử lý yêu cầu 1500 mỗi phút). Vấn đề là, vì nhóm autoscaling liên tục kiểm tra RequestCount và thêm một cá thể mới nếu số lượng yêu cầu lớn hơn 1500 trong 1 phút. Nhưng nó không cần thiết vì bây giờ tôi có 2 trường hợp có thể xử lý 3000 req. mỗi phút. Có cơ sở nào để chế tạo ma trận không? tức là nếu phiên bản mới được thêm vào thì chính sách tăng quy mô sẽ thay đổi thành 3000 req.Tự động mở rộng bằng cách sử dụng hình thành đám mây theo Số yêu cầu

Ví dụ kịch bản:

  1. Ban đầu có 1 ELB, 1 tomcat dụ gắn liền với ELB (có thể xử lý 1500 req mỗi phút.).
  2. 1 đồng hồ trên đám mây với hành động mở rộng quy mô nếu có yêu cầu. đếm trên ELB được tăng lên đến 1500 cho min.
  3. Hiện tại, yêu cầu tải trên ELB là 1500 trong 1 phút. bây giờ req. tải được tăng lên đến 1700 cho min. do đó, nó sẽ đính kèm một trường hợp tomcat mới trên ELB. Vì vậy, tôi có 2 trường hợp có thể xử lý 3000 req. trong phút.
  4. Nhưng giờ vấn đề là xem trên đám mây vẫn kiểm tra lại. đếm trên ELB và nếu req. tải là 1700 cho min. nó sẽ thêm một cá thể tomcat mới không cần thiết.

Làm thế nào tôi có thể đến từ vấn đề này?

Trả lời

4

Điều bạn muốn làm là sử dụng mức trung bình cho bộ cân bằng tải. Bạn có thể có các loại chỉ số khác nhau. Tổng, Trung bình, Tối thiểu, Tối đa và Mẫu. Nếu bạn chọn Trung bình nó sẽ cung cấp cho bạn trung bình cho tất cả các trường hợp dưới loadbalancer. Vì vậy, nó sẽ chỉ kích hoạt một khởi động thể hiện mới khi tất cả các máy chủ trong nhóm của bạn đang ở mức 1500 yêu cầu mỗi phút.

mô tả nhanh của các loại:

  • Trung bình - Điểm trung bình của cân bằng tải
  • Sum - Tổng số yêu cầu (ví dụ: 3000)
  • tối đa - Số lượng tối đa các yêu cầu bất kỳ máy chủ có (vì nó có thể không cân bằng chính xác)
  • Tối thiểu - Số yêu cầu tối thiểu mà bất kỳ máy chủ nào có (vì nó có thể không cân bằng chính xác)
  • Mẫu - Số lượng máy chủ được sử dụng để calcu trễ trung bình (về cơ bản số lượng máy chủ đang cân bằng tải)

Bạn cũng có thể tạo chỉ số tùy chỉnh riêng. Sử dụng api xem trên đám mây, bạn có thể dễ dàng tạo của riêng bạn. Hãy xem tại đây http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/Welcome.html?r=1540

+2

Chỉ cần lưu ý rằng RequestCount chỉ có thể được tổng hợp hoặc lấy mẫu và khi sử dụng RequestCount, điều tốt nhất cần làm là mở rộng đến 'công suất mong muốn' thay vì tăng/giảm (xem https://forums.aws.amazon.com/thread.jspa?threadID=86073). – dsummersl

+0

Điểm tốt, bạn phải làm theo cách này vì RequestCount không có giá trị trung bình. Tôi quên mất cảm ơn đó. – bwight

+0

Có, đây không phải là câu trả lời hợp lệ trong trường hợp này. –

1

Như dsummersl cho biết, RequestCount không thể được sử dụng ngay với số liệu trung bình.

Tôi đã tìm thấy một vài cách giải quyết here. Về cơ bản, họ cho bạn biết để xác định số liệu CloudWatch tùy chỉnh để bạn có thể công cụ các trường hợp của mình để phát ra số lượng yêu cầu mà họ đang nhận.Đối với điều này, bạn sẽ cần phải thu thập số lượng yêu cầu từ mỗi trường hợp và gửi đến đồng hồ điện toán đám mây bằng cách sử dụng put-metric-data hoặc tạo ebextension để EBS làm điều đó cho bạn (tôi nghĩ đây là cách đơn giản nhất).

Sau đó, bạn có thể đặt Tự động chia tỷ lệ để tăng/giảm tỷ lệ dựa trên chỉ số tùy chỉnh đó.

Hy vọng điều đó sẽ hữu ích.

0

Tôi đã thực hiện việc chia tỷ lệ dựa trên RequestCount hoạt động bằng cách áp dụng Scaling Policy có liên quan Cloudwatch alarms kích hoạt việc loại bỏ chính sách. Bên dưới, bạn sẽ tìm thấy mẫu dạng đám mây mà tôi đã sử dụng trong ứng dụng 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"