阿里云弹性伸缩服务(AutoScaling)与负载均衡(Slb)结合,使您可以将 Slb 实例附加到伸缩组,并通过 Slb 实例可以将流量分配到伸缩组中的各个实例。长久以来,Slb 实例只能在创建伸缩组的时候进行指定,不支持修改。这意味着您在创建伸缩组的同时,就不得不仔细的考量好自己的业务需求量及所需要的 Slb 实例数量。现在,AutoScaling推出最新功能:AttachLoadBalancer和DetachLoadBalancers,这种尴尬的现状将一去不复返。
本文将为您介绍如何将 Slb 实例附加到和分离出伸缩组。
负载均衡
Slb 是将流量根据转发策略分发到后端多个云服务器的分发控制服务,Slb 通过流量转发,健康检查等一系列策略增强了应用的整体服务能力。
一个 Slb 通常包含三个部分:
- Slb 实例(Server Load Balancer Instance)
- 监听(Listeners)
- 后端服务器(Backend Servers)
Slb实例
Slb 实例是一个运行的 Slb 服务实体。要使用 Slb 服务,您必须创建一个 Slb 实例,然后在实例中添加监听和后端服务器。关于 Slb 实例更详细的信息请参考 什么是Slb实例。
监听
创建 Slb 实例后,您需要为实例配置监听。Slb 实例监听负责检查连接请求,然后根据调度算法定义的转发策略将请求流量分发至后端服务器。关于 Slb 监听的更详细信息请参考 监听介绍。
后端服务器
在使用 Slb 服务前,您需要添加 ECS 实例作为 Slb 实例的后端服务器,用来接收 Slb 监听转发的请求。与AutoScaling配合使用时,将把伸缩组中的实例自动添加到伸缩组附加 Slb 实例的后端服务器。关于 Slb 后端服务器的更详细信息请参考 后端服务器概述。
将 Slb 附加到伸缩组
您可以选择将 Slb 实例附加到伸缩组上,在将负载附加到伸缩组的时候根据您指定的forceAttach参数值,将有以下两种行为:
- forceAttach为true,将 Slb 附加到伸缩组上的同时,将把当前伸缩组内的所有实例添加到 Slb 实例后端。
- forceAttach为false,将 Slb 附加到伸缩组上的同时,不会添加当前组内已有实例到 Slb实例后端。
对于一个已经附加在伸缩组上的 Slb实例,如果您想将伸缩组中当前全部实例加入到某一 Slb 实例的后端,您可以选择再次将该 Slb 附加到伸缩组,并选择 forceAttach 为 true。
您需要注意,将Slb实例添加到伸缩组时,由于Slb实例类型的限制,Slb实例需要满足以下条件:
- Slb实例必须是用户拥有的未删除实例。
- Slb实例与伸缩组必须在相同地域(region)下。
- Slb实例必须为active状态。
- Slb实例必须至少配置一个监听并开启健康检查。
- 如果Slb实例与伸缩组都为专有网络(vpc网络)类型,需要处于相同的vpc下。
- 当伸缩组为vpc网络类型,Slb实例为经典网络类型时,Slb实例后端服务器中如果包含vpc实例,必须与当前伸缩组处于相同vpc下。
- 伸缩组中附加的Slb实例个数必须少于伸缩组的配额。
将 Slb 分离出伸缩组
在将 Slb 从伸缩组移除的时,根据您指定的 forceDetach参数,将有以下两种行为:
- forceDetach 为true,将 Slb 从伸缩组移除的同时,将把 Slb 后端实例中与伸缩组关联的实例移除。
- forceDetach 为false,将 Slb 从伸缩组移除的同时,不会从 Slb 后端实例中移除与伸缩组关联实例。
在分离伸缩组的Slb实例时,您应该确认Slb实例不再向伸缩组内实例分发请求,以免造成您的服务请求丢失。并且,不同于 attachLoadBalancer操作,您不能多次尝试移除伸缩组中的同一个 Slb 实例。
最佳实践
SDK进行Attach/Detach Slb
此处,以AutoScaling java sdk为例,介绍如果通过 openapi 的方式来完成附加和移除 Slb 实例。
在使用sdk之前,首先需要下载相应的依赖,您可以在阿里云 SDK 中查找 java SDK ,下载所需依赖。如果您使用maven管理您的项目,您只需要在项目中添加如下依赖信息:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ess</artifactId>
<version>2.2.1</version>
</dependency>
AttachLoadBalancers:
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", "yourAk", "yourSecret")
IAcsClient client = new DefaultAcsClient(profile);
AttachLoadBalancersRequest request = new AttachLoadBalancersRequest();
request.setScalingGroupId(scalingGroupId); // 伸缩组id
request.setLoadBalancers(Arrays.asList(loadBalancerId));//附加的Slb实例列表
request.setForceAttach(ForceAttach);
AttachLoadBalancersResponse response = client.getAcsResponse(request);
上述AttachLoadBalancers的代码中,目前最多支持一次附加5个Slb实例到伸缩组。forceAttach参数表示是否将伸缩组内当前所拥有的全部实例加入到Slb实例的后端。
DetachLoadBalancers:
DetachLoadBalancersRequest request = new DetachLoadBalancersRequest();
request.setRegionId(REGION_ID);
request.setScalingGroupId(scalingGroupId);
request.setLoadBalancers(Arrays.asList(loadBalancerId));
request.setForceDetach(ForceDetach);
DetachLoadBalancersResponse response = client.getAcsResponse(request);
通过 openapi 的方式进行 Slb 的附加和移除操作,目前支持一次最多操作5个Slb实例。
写在最后
AttachLoadBalancer操作与DetachLoadBalancer操作使得您可以随时随意的进行 Slb 的增加和减少操作,降低了 Slb 与伸缩组的耦合程度,大大增加了您使用上的灵活性与实用性。