华为云 Auto Scaling 服务可根据用户的业务需求和预设策略定时、周期、动态(根据CPU、内存等使用率),这里在一台测试服务上通过安装 web 应用,能过php运行斐波那契数列计算,模拟CPU高资源利用率场景。

一、测试环境和代码

使用的测试OS是Centos 8.2,测试主机使用的是2C 4G的虚拟机,web 应用环境httpd 和 php 安装代码如下:

1yum -y install httpd php php-fpm
2systemctl enable httpd php-fpm
3
4# 修改php.ini的执行超时时间,以下值默认是30秒
5max_execution_time = 300
6
7# 如果使用 nginx 而不是httpd,还需在location ~ \.php$ 块里增加下超时设置
8fastcgi_read_timeout 300;

斐波那契数列运算的 php 测试代码如下:

 1<?php
 2// power by www.361way.com
 3echo "test page: ";
 4echo gethostname();
 5echo "<br>";
 6
 7$index = 46;
 8
 9function fib($n = 1)
10{
11    // 低位处理
12    if ($n < 3) {
13        return 1;
14    }
15    // 递归计算前两位
16    return fib($n - 1) + fib($n - 2);
17}
18
19for ($i = 0; $i < $index - 2; $i++) {
20     echo fib($i);
21     echo "<br>";
22}
23
24?>

使用 php 指令直接测试,发现当运行50次时,所耗费时长要5分半钟,这里将index次数换成了上面的46次,运行一次要47秒左右(这样HTTP请求和php fastcgi 请求都不会超时)。

php-web-fib
php-web-fib

二、Auto Scaling配置

1. 创建私有镜像

使用刚刚配置好的ECS云主机创建私有镜像,如下图:

create-private-image
create-private-image

2. 创建ELB弹性负载均衡

创建ELB弹性负载均衡器,用于动态增加主机时,可以增加到ELB后端组里,这样请求可以自动分发到新增加的服务器上。

create-elb
create-elb

将上面创建的虚拟机加入该ELB后端组中:

create-elb-listener
create-elb-listener

3. 创建弹性伸缩配置

创建弹性伸缩配置,选定区域、实例规格、对应的私有镜像、磁盘大小、登录密码等,用于指定弹性创建的ECS主机的规格和配置:

as-configuration
as-configuration

4. 创建弹性伸缩组

创建弹性伸缩组,并使用刚刚创建的ELB和弹性伸缩配置

create-as-group
create-as-group

这里需要注意下,如果使用的根据资源使用率弹性,而不是定时任何的弹性,可以有如下两个操作:

  1. 期望实例数如果设置为0,需要手动把第一步(测试环境和代码)创建的ECS加入实例组;
  2. 期望实例和最小实例数设置为1,可以把第一步创建的ECS删除掉(也可以选择不删除)。

如果不按照上面的操作做,会出现无法根据资源弹性的情况。这是因为弹性伸缩配置是监控的其对应的组内主机的资源使用情况进行操作的。如果该组里资源为空,显然策略就获取不到源资源使用数据。

5. 创建弹性伸缩策略

策略可以配置按资源增加和减少实例,也可以配置根据时间周期增加或减少实例,以下是根据CPU使用率配置的示例:

create-as-policy
create-as-policy

以下增加的两条策略,一条是CPU超过70%增加实例的操作,一个是CPU使用率少于50%的操作配置,不过为了避免频繁增减,后面有一个300秒的冷却时间:

as-add-delete-policy
as-add-delete-policy

三、测试

由于这里一个请求,会执行47秒左右完成请求,同时对应的1个CPU core会占用100%的资源,所以这里将以下脚本放在后面执行两次:

1#/bin/bash
2# code by www.361way.com
3while true;do
4  curl http://ELB/test.php
5  sleep 45
6done

注:也尝试使用了ab做简单压测,不过由于后台CPU一直占满,跑不了几个请求ab就因为请求异常自动挂了。

伸缩执行结果见下图:

add-reduce-histroy
add-reduce-histroy