AutoScaling彈性伸縮附加與分離負載均衡例項

tongkn發表於2018-07-05

阿里雲彈性伸縮服務(AutoScaling)與負載均衡(Slb)結合,使您可以將 Slb 例項附加到伸縮組,並通過 Slb 例項可以將流量分配到伸縮組中的各個例項。長久以來,Slb 例項只能在建立伸縮組的時候進行指定,不支援修改。這意味著您在建立伸縮組的同時,就不得不仔細的考量好自己的業務需求量及所需要的 Slb 例項數量。現在,AutoScaling推出最新功能:AttachLoadBalancer和DetachLoadBalancers,這種尷尬的現狀將一去不復返。

本文將為您介紹如何將 Slb 例項附加到和分離出伸縮組。

負載均衡

Slb 是將流量根據轉發策略分發到後端多個雲伺服器的分發控制服務,Slb 通過流量轉發,健康檢查等一系列策略增強了應用的整體服務能力。

一個 Slb 通常包含三個部分:

  1. Slb 例項(Server Load Balancer Instance)
  2. 監聽(Listeners)
  3. 後端伺服器(Backend Servers)

Slb例項

Slb 例項是一個執行的 Slb 服務實體。要使用 Slb 服務,您必須建立一個 Slb 例項,然後在例項中新增監聽和後端伺服器。關於 Slb 例項更詳細的資訊請參考 什麼是Slb例項

監聽

建立 Slb 例項後,您需要為例項配置監聽。Slb 例項監聽負責檢查連線請求,然後根據排程演算法定義的轉發策略將請求流量分發至後端伺服器。關於 Slb 監聽的更詳細資訊請參考 監聽介紹

後端伺服器

在使用 Slb 服務前,您需要新增 ECS 例項作為 Slb 例項的後端伺服器,用來接收 Slb 監聽轉發的請求。與AutoScaling配合使用時,將把伸縮組中的例項自動新增到伸縮組附加 Slb 例項的後端伺服器。關於 Slb 後端伺服器的更詳細資訊請參考 後端伺服器概述

將 Slb 附加到伸縮組

您可以選擇將 Slb 例項附加到伸縮組上,在將負載附加到伸縮組的時候根據您指定的forceAttach引數值,將有以下兩種行為:

  1. forceAttach為true,將 Slb 附加到伸縮組上的同時,將把當前伸縮組內的所有例項新增到 Slb 例項後端。
  2. forceAttach為false,將 Slb 附加到伸縮組上的同時,不會新增當前組內已有例項到 Slb例項後端。

對於一個已經附加在伸縮組上的 Slb例項,如果您想將伸縮組中當前全部例項加入到某一 Slb 例項的後端,您可以選擇再次將該 Slb 附加到伸縮組,並選擇 forceAttach 為 true。

您需要注意,將Slb例項新增到伸縮組時,由於Slb例項型別的限制,Slb例項需要滿足以下條件:

  1. Slb例項必須是使用者擁有的未刪除例項。
  2. Slb例項與伸縮組必須在相同地域(region)下。
  3. Slb例項必須為active狀態。
  4. Slb例項必須至少配置一個監聽並開啟健康檢查。
  5. 如果Slb例項與伸縮組都為專有網路(vpc網路)型別,需要處於相同的vpc下。
  6. 當伸縮組為vpc網路型別,Slb例項為經典網路型別時,Slb例項後端伺服器中如果包含vpc例項,必須與當前伸縮組處於相同vpc下。
  7. 伸縮組中附加的Slb例項個數必須少於伸縮組的配額。

將 Slb 分離出伸縮組

在將 Slb 從伸縮組移除的時,根據您指定的 forceDetach引數,將有以下兩種行為:

  1. forceDetach 為true,將 Slb 從伸縮組移除的同時,將把 Slb 後端例項中與伸縮組關聯的例項移除。
  2. 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 與伸縮組的耦合程度,大大增加了您使用上的靈活性與實用性。


相關文章