摘要: ESS 伸缩配置定义了用于弹性伸缩的 ECS 实例的配置信息,包含了实例规格、网络、安全组、带宽等配置信息,您可灵活地搭配这些配置信息来为您的伸缩组创建伸缩配置。
本文将详细介绍 ESS 多实例规格的伸缩配置,并给出多实例规格伸缩配置相比单实例规格伸缩配置的优势所在,最后,本文将给出使用 ESS SDK 快速创建多实例规格伸缩配置的最佳实践。
ESS 伸缩配置多实例规格参数
原 ESS 弹性伸缩服务限定,一个伸缩组内只能有一个生效的伸缩配置,一个伸缩配置只能配置一种实例规格。由于上述的限制,导致伸缩组内有效的实例规格只有一个,如果当前的实例规格由于库存不足等变得不可用,那么伸缩组将无法创建出 ECS 实例。您需要重新选择当前伸缩组内其它伸缩配置或创建新的伸缩配置来恢复伸缩组,使伸缩组能够正常工作。为了优化上述问题,提高伸缩组内伸缩配置的可用性,ESS 弹性伸缩服务为伸缩配置新增了多实例规格参数(InstanceTypes.N)。您在创建伸缩配置的时候可以使用该参数为您的伸缩配置设置多个实例规格,当某个实例规格由于库存等原因变得不可用时,ESS 弹性伸缩服务会为您自动切换到其它有效的实例规格来创建实例。当您创建的伸缩配置使用了多实例规格参数时,您需要注意以下几点:
如果使用了 InstanceTypes.N 多实例规格参数,InstanceType 参数将被忽略。
InstanceTypes.N 参数中,N 的取值范围为 [1, 10],即一个伸缩配置内最多可以设置 10 种实例规格。
当您的伸缩组是经典网络伸缩组时,伸缩组所属 Region 必须支持您所配置的所有实例规格的经典网络实例的售卖,如果当前 Region 不支持您所配置的实例规格,伸缩组将无法为您创建出 ECS 实例。您可以通过 查询可用区列表 接口查询当前 Region 支持的实例规格,以及每种规格支持的网络类型。
当您的伸缩组是专有网络(VPC)伸缩组时,伸缩组配置的虚拟交换机对应的可用区内必须支持您所配置的所有实例规格的专有网络实例的售卖,每个伸缩组可以配置多个虚拟交换机,您可以通过 使用 ESS SDK 快速创建多可用区伸缩组 了解更多。
InstanceTypes.N 参数中 N 代表当前伸缩配置中实例规格的优先级,编号为 1 的实例规格优先级最高,实例规格优先级随着编号的增大依次降低。
如果当前伸缩配置中优先级较高的实例规格由于库存等原因无法创建出 ECS 实例时,ESS 会自动选择下一优先级的实例规格来为您创建实例。
当您在使用多实例规格参数来创建伸缩配置时,实例规格不可重复,否则伸缩配置将无法创建。
使用 SDK 创建多可用区伸缩组
本章将介绍如何使用 SDK 创建多实例规格的伸缩配置,这里以 Java 语言和 Python 语言为例进行介绍。
Java
导入 ESS Java SDK
首先,您需要下载 aliyun-java-sdk-core、aliyun-java-sdk-ess 两个依赖,您可以查看 maven-central 界面,搜索并下载相应的 jar 包,aliyun-java-sdk-ess 对应的 jar 包的版本号需要是 2.1.3 及以上版本才能使用多实例规格参数,aliyun-java-sdk-core 推荐使用最新的版本。
您可以选择使用 maven 来管理您 Java 项目的依赖库,在您的项目对应的 pom.xml 文件中加入下面的依赖项即可:
<dependency>
<groupId>com.aliyungroupId>
<artifactId>aliyun-java-sdk-essartifactId>
<version>2.1.3version>
dependency>
<dependency>
<groupId>com.aliyungroupId>
<artifactId>aliyun-java-sdk-coreartifactId>
<version>3.5.0version>
dependency>
使用 Java SDK 创建多实例规格伸缩配置
导入 ESS Java SDK 到您的 Java 工程以后,您就可以创建多实例规格伸缩配置了。使用 Java SDK 创建多实例规格伸缩配置的代码如下:
public class EssSdkDemo {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "xxxxxxxxxxxxxx";
public static final String AKS = "xxxxxxxxxxxxxx";
/**
* 排在最前面的实例规格优先级最高,实例规格优先级随着在数组中出现的次序依次递减
*/
public static final String[] TYPE_ARRAY = { "instancetype1", "instancetype2" };
public static final List INSTANCE_TYPES = Arrays.asList(TYPE_ARRAY);
public static final String SCALING_GROUP_ID = "xxxxxxxxxxxxxx";
//ubuntu_16_0402_64_20G_alibase_20170818.vhd
public static final String IMAGE_ID = "xxxxxxxxxxxxxx";
public static final String SECURITY_GROUP_ID = "xxxxxxxxxxxxxx";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
System.out.println(createScalingConf(client));
}
/**
* 创建多实例规格伸缩配置
*
* @param client
* @return
* @throws Exception
*/
public static String createScalingConf(IAcsClient client) throws Exception {
CreateScalingConfigurationRequest request = new CreateScalingConfigurationRequest();
request.setScalingGroupId(SCALING_GROUP_ID);
request.setImageId(IMAGE_ID);
request.setInstanceTypes(INSTANCE_TYPES);
request.setSecurityGroupId(SECURITY_GROUP_ID);
CreateScalingConfigurationResponse response = client.getAcsResponse(request);
return response.getScalingConfigurationId();
}
}
注意:AK,SCALING_GROUP_ID,SECURITY_GROUP_ID 等参数需要您根据个人情况进行设置。
Python
安装 ESS Python SDK
同 Java 语言一样,在使用 ESS Python SDK 前,您需要先下载 aliyun-python-sdk-ess、aliyun-python-sdk-core 两个依赖。本文推荐使用 pip 的方式来安装 Python 依赖包,关于 pip 的安装您可以参数 Installation-Pip。 安装好 pip 以后,您可以使用命令 pip install aliyun-java-sdk-ess==2.1.3 pip install aliyun-java-sdk-core==3.5.0 安装两个所需的依赖。
使用 Python SDK 创建多实例规格伸缩配置
导入 ESS Python SDK 依赖库以后,您就可以创建多实例规格伸缩配置了。使用 Python SDK 创建多实例规格伸缩配置的代码如下:
#coding=utf-8
import json
import logging
from aliyunsdkcore import client
from aliyunsdkess.request.v20140828.CreateScalingConfigurationRequest import CreateScalingConfigurationRequest
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
# 请替换自己的ak信息
ak = 'ak'
aks = 'aks'
scaling_group_id = 'xxxxxxxxxxxxxxx'
image_id = 'xxxxxxxxxxxxxxx'
security_group_id = 'xxxxxxxxxxxxxxx'
instance_types = ['instancetype1', 'instancetype2']
region_id = 'cn-beijing'
clt = client.AcsClient(ak, aks, region_id)
def _create_scaling_conf():
request = CreateScalingConfigurationRequest()
request.set_ScalingGroupId(scaling_group_id)
request.set_ImageId(image_id)
request.set_SecurityGroupId(security_group_id)
request.set_InstanceTypes(instance_types)
response = _send_request(request)
return response.get('ScalingConfigurationId')
def _send_request(request):
request.set_accept_format('json')
try:
response_str = clt.do_action(request)
logging.info(response_str)
response_detail = json.loads(response_str)
return response_detail
except Exception as e:
logging.error(e)
if __name__ == '__main__':
scaling_group_id = _create_scaling_conf()
print '创建伸缩配置成功,伸缩组ID:' + str(scaling_group_id)
注意:ak,scaling_group_id,security_group_id 等参数需要您根据个人情况进行设置。
在使用 SDK 创建伸缩配置的时候,您可以参考 创建伸缩配置接口 来了解每个参数的意义。建议多实例规格伸缩配置和多可用区伸缩组结合使用,这样可以在最大程度上提高您的伸缩组的可用性。关于多可用区伸缩组的创建方法,您可以参考 使用 ESS SDK 快速创建多可用区伸缩组 。
写在最后
ESS 伸缩配置多实例规格参数目前可通过 OpenApi 的方式来使用,弹性伸缩服务控制台近期也会支持多实例规格伸缩配置功能。