阿里云弹性伸缩服务(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 服务前,您需要添加 ECS 实例作为 Slb 实例的后端服务器,用来接收 Slb 监听转发的请求。与AutoScaling配合使用时,将把伸缩组中的实例自动添加到伸缩组附加 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 与伸缩组的耦合程度,大大增加了您使用上的灵活性与实用性。