Amazon AWS EC2 提供了良好的AutoScaling能力,可以根据预先定义的几个系统性能参数的阈值提供自动地服务能力伸缩,并且同时提供了良好的使用文档、开发文档,基本看完其开发文档即可正常使用其提供的功能。本文仅记录一次AutoScaling过程的一些操作步骤备忘以及一些需要今后注意地地方。
一、简单实验
1. 下载AutoScaling工具包
2. 配置本地环境
如果电脑上没有安装Java,就安装一个,然后处理后续操作。
export JAVA_HOME=/Library/Java/Home
export AWS_AUTO_SCALING_HOME=/Users/eryxlee/amazon/tools/AutoScaling-1.0.49.1
export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin
编辑认证文件credential.txt,里面包含如下内容:(具体keyed,key到AWS Security Credentials中寻找。
AWSAccessKeyId=XXXXXXXXXXXXXXXXX
AWSSecretKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
编辑完之后,变更权限
chmod 600 credential.txt
export AWS_CREDENTIAL_FILE=/Users/eryxlee/amazon/tools/AutoScaling-1.0.49.1/credential.txt
3. 简单命令操作
配置完环境变量之后,运行as-cmd命令即可得到一个AutoScaling的命令列表。
运行as-describe-auto-scaling-groups得到No AutoScalingGroups found,如果你之前没有建过的话
4. 建立简单的一个AutoScaling配置,并最终销毁它
4.1. 建立节点启动配置
as-create-launch-config MyTestLC --image-id ami-7530ee1c --instance-type t1.micro
这里:
MyTestLC是配置名
image-id是AMI的id
instance-type是节点类型
运行完之后可以运行as-describe-launch-configs查阅已经创建的配置。
4.2. 建立AutoScaling组
as-create-auto-scaling-group MyTestGroup --launch-configuration MyTestLC --availability-zones us-east-1a --min-size 1 --max-size 1
这里:
MyTestGroup是组名
launch-configuration是上一步创建的配置名
availability-zones指定节点创建所在的可用区域
min-size指最小节点数量
max-size指最大节点数量
运行完之后可以运行验证命令:
as-describe-auto-scaling-groups --headers
可以的大如下类似信息:
AUTO-SCALING-GROUP GROUP-NAME LAUNCH-CONFIG AVAILABILITY-ZONES MIN-SIZE MAX-SIZE DESIRED-CAPACITY
AUTO-SCALING-GROUP MyTestGroup MyTestLC us-east-1a 1 1 1
INSTANCE INSTANCE-ID AVAILABILITY-ZONE STATE STATUS LAUNCH-CONFIG
INSTANCE i-cf3291a8 us-east-1a InService Healthy MyTestLC
4.3. 查验结果
现在登录AWS console,可以看到已经有一个节点在启动了。不过我们也可看到,这个节点没有配置security group,也没有配置keypair,基本上属于不可用状态。(除非已经在AMI中配置好了所有自启动并且计算完将结果传输到其他服务器上。)
4.4. 销毁节点
在清理AutoScaling组之前,推荐先销毁所有的节点,运行一下命令,指定最大最小数量均为0:
as-update-auto-scaling-group MyTestGroup --min-size 0 --max-size 0
整个节点关闭过程需要几分钟,耐心等待。
4.5. 销毁AutoScaling组
as-delete-auto-scaling-group MyTestGroup
4.6. 销毁启动配置
as-delete-launch-config MyTestLC
这样一个AutoScaling的轮回就基本结束了。不过也可以看到,除非AMI配置很好,这个AutoScaling组做不了啥工作。
二、建立一个真实可用的AutoScaling组
1. 准备工作
要做好一个运行良好的AutoScaling组,需要实现做好规划,准备在节点上面完成什么功能,结果如何输出,是否需要人工登录,是否需要安全配置等等。
下面我们就看一个简单的WEB应用服务器的简单扩容配置方式,假定我们需要提供一个Pyramid应用,它提供80端口访问,使用独立的MySQL数据库,并且管理人员偶尔需要登录上去进行简单管理。
1.1. AMI制作
先从已有AMI启动一个节点,假定这个节点已经设置好OS配置,可以正常运行。下面开始应用的部署:
* 在该节点上配置好python环境
* 安装好Pyramid
* 部署应用
* 配置应用Log集中输出到特定服务器
* 配置supervisor服务
因为AutoScaling的自身特性,不推荐在其上配置MySQL之类的数据库服务,也不建议在上面存储任何数据,如果要存储文件,建议直接存储到S3。这样该节点随时打开关闭都不会影响应用数据完整性。
也可以配置puppet等自动安装服务,不过如果应用系统稳定,建议直接做出AMI,免去启动之后安装配置动作,直接启动即可用。
如果节点启动之后需要一个比较长的暖场时间,则需要小心配置之后涉及的冷却时间和ELB存活自动检测以免出现多启动节点或ELB认为节点已正常但实际还未提供服务的情况。
1.2. keypair生成
如果今后希望可以登录AutoScaling的节点,则需要在创建的时候提供keypair,建议在开始配置前准备好一个可用的keypair
1.3. security group配置
如果需要配置对外访问安全,还需要配置好security group。我们这里因只需要提供80端口(Pyramid 6543端口)、22端口服务,则配置22端口对所有IP可访问。6543端口对ELB可访问(amazon-elb/amazon-elb-sg),ELB对外提供80端口,外网无法直接访问节点6543端口。
1.4. ELB配置
配置ELB HTTP 80端口转向6543端口
2. 环境配置
2.1. AutoScaling的配置
同第一节内容
2.2. CloudWatch配置
下载CloudWatch工具包,http://aws.amazon.com/developertools/2534
export AWS_CLOUDWATCH_HOME=/Users/eryxlee/amazon/tools/CloudWatch-1.0.12.1
export PATH=$PATH:$AWS_CLOUDWATCH_HOME/bin
3. 创建启动配置
as-create-launch-config MyTestLC --image-id ami-7530ee1c --instance-type t1.micro --key testenv-keypair --group test-autoscale
这里多了两个参数:
key指key pair的名字
group指security group的名字
4. 创建AutoScaling组
as-create-auto-scaling-group MyAutoScalingTestGroup --launch-configuration MyTestLC --availability-zones us-east-1a us-east-1b --min-size 1 --max-size 10 --load-balancers autoscale
这里可用区域指定了2个,之后创建的节点可以分布在这两个区域中。
load-balancers指定了ELB名字
同第一节,创建完之后,即可看到一个节点已经启动,现在就可以测试直接通过ELB的DNS名字可以直接访问Pyramid应用。如果有任何问题,检查之前的配置。
注意:新建的ELB很有可能会出现节点加入了之后Health Check过不了没法提供服务的情况(已经遇到几次了。),这时候只要手工将节点从ELB中移除,然后再加入,就会正常。正式使用前,最好几个配置到Auto Scaling中的可用区域中的节点都试试看,直到正常自动加入为止。
5. 配置ScaleUp策略
as-put-scaling-policy MyScaleUpTestPolicy --auto-scaling-group MyAutoScalingTestGroup --adjustment=1 --type ChangeInCapacity --cooldown 90
这个命令指定了一直ScaleUp的策略,策略内容为每次增加一个节点,之后90秒为冷却时间。冷却时间是为了确保刚才启动的节点已经真正提供服务之后再进行系统负载评估。在冷却时间内,其他Scale操作命令都无效,安静的等待刚才的服务节点提供服务能力。良好的冷却时间选择能够有效的防止系统规模暴涨暴跌。
该命令执行之后,会返回类似arn:aws:autoscaling:us-east-1:538202822254:XXXXXXXXXXX的一长串ARN名字,记得保留这个名字后面有用。
定义了ScaleUp策略之后,怎么触发这个策略呢?那就需要用到刚才配置的CloudWatch工具了。下面的命令定义了一个CPU负载过高的告警,一旦CPU一段时间内达到定义的负载阈值,就会触发这个告警:
mon-put-metric-alarm MyHighCPUAlarm --comparison-operator GreaterThanThreshold --evaluation-periods 1 --metric-name CPUUtilization --namespace "AWS/EC2" --period 60 --statistic Average --threshold 60 - -alarm-actions POLICY-ARN_from_previous_step --dimensions "AutoScalingGroupName=MyAutoScalingTestGroup"
这是一个很复杂的命令。它的主要目的就是评估现有系统性能,一旦发现超出告警设定,就使用AWS SNS发出消息。其参数的含义是:
comparison-operator:比较操作符,主要有GreaterThanOrEqualToThreshold、GreaterThanThreshold、LessThanOrEqualToThreshold、LessThanThreshold 这几种。
evaluation-periods:评估时间周期
metric-name:度量对象,这里选择CPU
namespace:命名空间,如AWS/EC2、AWS/ELB
period:告警时间周期
statistic:统计方式,可以是Minimum、Maximum、Sum、Average、SampleCount
threshold:阈值,CPU达到60%
alarm-actions:这里是SNS话题名,往这个话题发送消息
Dimensions:是一个key/value对,用于标识这个度量对象的一些特定属性。
注意:
a. 为了演示需要(尽快看到效果),在上面几个命令中,各参数的值都被人为缩小了,实际环境所用的值大多都会大于上面的设定。具体的配置值需要根据实际场景反复实验推敲。
b. 注意各配置参数之间的关系,以及它们之间的配合。
c. AWS还提供了定时ScaleUp等很多策略配置,具体查看AWS文档。
6. 定义ScaleDown策略
定义了ScaleUp策略之后,最好还要定义ScaleDown策略,这样就会在负载低的时候减少节点,从而减少资源占有,降低成本。
as-put-scaling-policy MyScaleDownTestPolicy --auto-scaling-group MyAutoScalingTestGroup --adjustment=-1 --type ChangeInCapacity --cooldown 90
mon-put-metric-alarm MyLowCPUAlarm --comparison-operator LessThanThreshold --evaluation-periods 1 --metric-name CPUUtilization --namespace "AWS/EC2" --period 60 --statistic Average --threshold 15 --alarm-actions POLICY-ARN_from_previous_step --dimensions "AutoScalingGroupName=MyAutoScalingTestGroup"
命令含义基本跟ScaleUp类似。
7. 加压吧!
完成上面的配置之后,马上可以再开个节点安装个siege进行压力测试了,也应该可以在Console中看到instance的增加减少,不过需要点耐心。
通过压力测试也可以验证各参数之间的配合是否协调,是否能满足设计需要。
8. 清理现场
如果不要这个AutoScaling配置了,还需要完成下面动作清理现场。
mon-delete-alarms MyLowCPUAlarm
mon-delete-alarms MyHighCPUAlarm
as-update-auto-scaling-group MyAutoScalingTestGroup --min-size 0 --max-size 0
as-delete-auto-scaling-group MyAutoScalingTestGroup
as-delete-launch-config MyTestLC
9. 计费事项
实现了AutoScaling是件很爽的事情,除了收到账单的时候。AWS的整体费用真正用起来可不算低哦。在整个AutoScaling配置中,涉及到收费的地方有:
a. Amazon SNS,每月10w免费额度,之后每10w收6美分
b. Instance,按节点量、大小计算
c. ELB,按时长+流量计算
d. CloudWatch,按节点+告警计算
e. 流量费用
f. EBS、EBS IO费用,如果用了的话
No comments:
Post a Comment