
# 通过独享型ELB的延迟注销实现业务平稳下线
#### 应用场景
如果您发现后端服务器健康检查异常，或基于业务需求需要移除后端服务器，或需要将后端服务器权重设置为0时，该后端服务器已建立的连接通常不会立即中断，导致客户端请求仍然转发至这些后端服务器。这可能会引发业务长期无法下线或出现请求错误的问题。
您可以使用独享型ELB的延迟注销功能。当移除后端服务器、将后端服务器权重设置为0或健康检查异常时，该后端服务器的现有连接将在一定时间内正常传输，到达延迟注销时间后主动断开连接，从而保障业务平稳下线。
#### 约束限制
后端协议为TCP/UDP/QUIC协议时，支持延迟注销功能。
#### 准备工作
- 已创建独享型ELB实例，具体操作请参考[购买独享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/elb_lb_000006.html)。
- 创建两台ECS，ECS与已创建的ELB实例属于同一个VPC，更多详细设置请参考[自定义购买ECS](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)。
  本实践方案以ECS安装CentOS系统为例，一台ECS_client用作客户端发送请求，客户端需支持长连接访问，一台ECS_server用作部署后端应用的后端服务器。
  
 
 #### 步骤一：创建后端服务器组并开启延迟注销
本实践方案创建开启延迟注销功能的后端服务器组并设置延迟注销时间为30秒。
1. 进入[后端服务器组列表页面](https://console.huaweicloud.com/vpc/?locale=zh-cn#/elb/elbPool/list)。
2. 在后端服务器列表页面，单击页面右上角"创建后端服务器组"按钮。
3. 配置后端分配策略，关键参数详情请参见[表1](https://support.huaweicloud.com/bestpractice-elb/elb_bp_1003.html#elb_bp_1003__table17921104011492)，其余配置项保持默认值即可。
   表1配置后端分配策略参数说明 
   | 参数        | **示例**           | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|:---|
   | 名称        | **server_group** | 创建的后端服务器组的名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 负载均衡类型    | **独享型**          | 可使用该后端服务器组的负载均衡实例类型。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 所属负载均衡器   | **关联已有**         | 使用该后端服务器组的负载均衡实例。 单击"关联已有"后，选择您已创建完成的负载均衡实例。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 后端协议      | **TCP**          | 后端云服务器自身提供的网络服务的协议。 本实践方案选择TCP协议。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 分配策略类型    | **加权轮询算法**       | 本实践方案选择加权轮询算法。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 延迟注销      | **开启**           | 如果后端协议为TCP/UDP/QUIC协议时，默认开启延迟注销功能。 - 关闭延迟注销功能后，如下场景负载均衡器存量的长连接会立即断开。 - 后端服务器从后端服务器组移除。  - 后端服务器权重设置为0。  - 后端服务器健康检查异常。    - 开启延迟注销功能后，如下场景负载均衡器停止向后端云服务器发送新的请求，同时触发延迟注销时间，延迟注销时间内，存量长连接可继续传输，延迟注销时间到期后，长连接断开。 - 后端服务器从后端服务器组移除。  - 后端服务器权重设置为0。  - 后端服务器健康检查异常。     |
   | 延迟注销时间（秒） | **30**           | 负载均衡器与后端服务器的现有连接在延迟注销时间内正常传输，超过延迟注销时间后全部断开。 本实践方案设置为30秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
      
   
4. 单击"下一步"，添加后端服务器并配置健康检查。
5. 单击"添加云服务器"，选择您已创建好的ECS_server实例，其余选项保持默认，完成云服务器的添加。
6. 开启健康检查，其余健康检查参数保持默认。
7. 单击"下一步"。
8. 确认配置无误后，单击"立即创建"。
 
#### 步骤二：创建TCP监听器并配置后端服务器组
本实践方案以TCP监听器为例进行转发。
1. 进入[弹性负载均衡列表页面](https://console.huaweicloud.com/vpc/?locale=zh-cn#/elb/list)。
2. 在目标弹性负载均衡实例的操作列，单击"添加监听器"。
3. 在添加监听器页面，协议类型选择"TCP"，监听端口选择"80"，其余配置保持默认。
4. 单击"下一步：配置后端分配策略"，配置后端服务器组。 单击"使用已有"，并选择[步骤一：创建后端服务器组并开启延迟注销]中创建的后端服务器组。
   
5. 单击"下一步：确认配置"，确认完成后，完成TCP监听器的创建。
 
#### 步骤三：在后端服务器中部署应用
1. 远程登录后端服务器ECS_server。 弹性云服务器有多种登录方法，具体请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
2. 在后端服务器中，新建目录Test。
   ```
   mkdir Test
   ```
   
3. 在Test目录下，新建一个server.py文件，并且在其中部署测试延迟注销的服务，**每秒打印服务端与客户端的连接状态** 。
   1. 新建server.py文件。
      ```
      python server.py
      ```
      
   
   2. 按**i** 键进入编辑模式。
      单击查看本示例代码参考
      - server.py文件脚本，默认端口配置为80。
        ```
        import socket
        import threading
        def handle_client(client_socket, addr):
            print(f"[+] Connection request from {addr}")
            try:
                while True:
                    data = client_socket.recv(1024).decode()
                    if not data:
                        break
                    print(f"[{addr}] Received: {data}")
                    client_socket.send(f"ACK: {data}".encode())
            except ConnectionResetError:
                print(f"[-] {addr} Connection interrupted")
            finally:
                client_socket.close()
                print(f"[-] {addr} Connection closed")
        def start_server():
            server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            server.bind(('0.0.0.0', 80))
            server.listen(5)
            print("[*] Server started, waiting to be connected...")
            while True:
                client_sock, addr = server.accept()
                client_thread = threading.Thread(target=handle_client, args=(client_sock, addr))
                client_thread.start()
        if __name__ == "__main__":
            start_server()
        ```
        
        
    
4. 按**Esc** 键，输入**:wq**保存server.py文件。
5. 运行server.py文件。
   ```
   python server.py
   ```
   
6. 收到如[图1]的回显，表示后端服务部署成功。
   图1后端服务启动成功   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002422709536.png "点击放大") 
 
#### 步骤四：在客户端中部署应用
1. 远程登录客户端ECS_client。
2. 在客户端服务器中，新建目录Test_client。
   ```
   mkdir Test_client
   ```
   
3. 在Test_client目录下，新建一个python_client.py文件，并且在其中部署应用服务，**每秒打印客户端与服务端的连接状态** 。
   1. 新建python_client.py文件。
      ```
      vi python_client.py
      ```
      
   
   2. 按**i** 键进入编辑模式。
      单击查看本示例代码参考
      - python_client.py文件脚本，默认端口配置为80。
        ```
        import socket
        import time
        import threading
        def client_loop():
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect(('<your_elb_ip>', 80))   # <your_elb_ip>，替换为您elb实际的私网IP地址
                print("[+] Connected to the server")
                while True:
                    try:
                        s.send("keep alive".encode())
                        response = s.recv(1024).decode()
                        print(f"[Status] {time.ctime()}: Response received -> {response}")
                        time.sleep(1)
                    except (ConnectionResetError, ConnectionAbortedError):
                        print("[-] Connection to server interrupted")
                        break
            except Exception as e:
                print(f"[Error] Connection failed: {e}")
            finally:
                s.close()
        if __name__ == "__main__":
            client_thread = threading.Thread(target=client_loop)
            client_thread.start()
            client_thread.join()
        ```
        
        
    
4. 按**Esc** 键，输入**:wq**保存client.py文件。
5. 运行client.py文件。
   ```
   python client.py
   ```
   
6. 收到如[图2]的回显，客户端打印出时间和连接状态，表示后端服务部署成功。
   图2客户端启动成功   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002456361337.png "点击放大") 
7. 查看后端服务器ECS_server，后端服务收到如[图3]的回显，打印出与客户端的连接状态。
   图3后端服务器收到客户端请求   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002424350418.png "点击放大") 
 
#### 步骤五：移除后端服务器并记录移除时间
本实践以移除后端服务器的场景为例验证延迟注销生效。
1. 进入[后端服务器组列表页面](https://console.huaweicloud.com/vpc/?locale=zh-cn#/elb/elbPool/list)。
2. 在后端服务器组列表页面，单击需要移除后端服务器的后端服务器组名称。
3. 切换到"后端服务器"页签，选择下方"云服务器"页签。
4. 勾选需要移除的服务器，单击服务器列表上方的"移除"。
5. 在移除后端服务器的对话框中单击"是"。
6. 记录下后端服务器被移除的时间，此时客户端打印时刻为**09:52:33**。
 
#### 步骤六：验证延迟注销功能
1. 观察在延迟注销时间内，观察客户端和服务端的打印结果。
   客户端和服务端分别打印出连接状态如[图4]和[图5]，表示两者间保持长连接。
   图4客户端打印连接状态   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002457847357.png "点击放大")
   图5服务器打印连接状态   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002424426050.png "点击放大") 
2. 等待延迟注销时间30秒后，观察客户端和服务端的打印结果。
   客户端和服务端分别打印出如[图6]和[图7]的回显，表明延迟注销时间结束后，客户端与后端服务器之间的连接断开。根据[图6]显示连接断开时间为**09:53:03** ，与移除后端服务器时间**09:52:33** 间隔为设置的延迟注销时间30秒。
   图6客户端打印连接断开   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002458150645.png "点击放大")
   图7服务器端打印连接断开   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002424472612.png) 
 
