阿里云负载均衡权重管理脚本

阿里云权重管理

背景

我们的公司采用的是阿里云环境,发布体系中需要滚动更新功能,需要编写脚本来完成负载均衡对应主机的权重为0,然后发布代码到这个服务器上, 重启成功后修改回原有权重,然后一个一个处理完毕集群的所有主机。

阿里云负载均衡简介

负载均衡的几个常见概念。

名词 说明
负载均衡服务 (Server Load Balancer) 阿里云计算提供的一种网络负载均衡服务,结合阿里云提供的ECS服务,提供四层和七层负载均衡服务。
负载均衡实例(Server Load Balancer Instances) 负载均衡实例是一个运行的负载均衡服务。要使用负载均衡服务,必须先创建一个负载均衡实例。
服务地址 (SLB IP address) 系统为创建的负载均衡实例分配的服务IP地址。根据创建的负载均衡实例的类型,服务地址可能是公网IP也可能是私网IP。您可以将域名解析到公网IP地址提供对外服务。
监听 (Listeners) 负载均衡服务监听规定了如何将请求转发给后端服务器。一个负载均衡实例至少添加一个监听。
后端服务器 (Backend Servers) 处理负载均衡分发的前端请求的ECS实例。
虚拟服务器组 (Backend Servers Groups) 一组处理负载均衡分发的前端请求的ECS实例。不同的监听可以关联不同的虚拟服务器组,实现监听维度的请求转发。

阿里云提供2种服务器组, 一个是默认服务器组,一个是虚拟服务器组, 如果一个负载均衡上面只挂一个域名的多个主机,建议直接将后端的服务器加入到默认服务器组即可,

如果你的负载均衡挂多个域名的话, 建议以域名为虚拟服务器的名字,创建多个虚拟服务器组,每个组下面挂载对应的后端服务器。

我们的线上环境建议采用一个域名一个负载均衡, 测试环境可以考虑一个负载下弄多个域名,省点钱,我们简单算下使用多负载均衡和一个负载负载多域名方案价格差异。

阿里云官方的负载均衡配置价格不贵,配置费用为0.02元每小时。公网流量费用0.48元/GB,对于2种方案来说流量都是一样的。采用多负载均衡会多出多个配置费用, 1个负载均衡的配置费用1年下来大概为0.02*24*365≈175元。可以根据自身公司情况选择一种方案。

管理脚本

使用这个脚本,需要安装python3环境,并安装如下包

pip install aliyun-python-sdk-core-v3
pip install aliyun-python-sdk-ecs
pip install aliyun-python-sdk-slb

slb_manager.py内容如下:

# !/usr/bin/env python
# -*-coding:utf-8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest

import json
import os
import sys

from enum import Enum

def byte_to_json(response):
    response_str = str(response, encoding=‘utf-8‘)
    response_json = json.loads(response_str)
    return response_json

class SlbManagerInfo():
    def __init__(self, exit_code=0, exit_message=""):
        self.exit_code = exit_code
        self.exit_message = exit_message
        self.extra_message = {}

    def __str__(self):
        return str(self.__dict__)

class SlbManager():
    """
        阿里云负载均衡管理,支持对默认的组和虚拟服务器组的管理
    """

    def __init__(self, slb_config_file, region_id="cn-beijing"):
        """
        初始化client,slb_config_file内容为以下格式
        {
            "slb_ak":"xxxxxxxxxxxxxx",
            "slb_sk":"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        }
        """
        self.slb_config_file = slb_config_file
        self.region_id = region_id

        self.slb_manager_info = SlbManagerInfo()

        self.ak, self.sk = self.get_aksk_from_config_file()
        self.client = AcsClient(self.ak, self.sk, self.region_id)
    def pre_check(self):
        if isinstance(self.weight,int):
            if (self.weight >100 or self.weight <0):
                self.slb_manager_info.exit_code = 1
                self.slb_manager_info.exit_message = "权重设置不符合要求(0=100)" + "你的设置为" +str(self.weight)
        else:
            self.slb_manager_info.exit_code = 2
            self.slb_manager_info.exit_message = "权重不是int的,请检查"
    def set_comm_request(self, request, product_type="slb"):
        request.set_accept_format(‘json‘)
        request.set_method(‘POST‘)
        request.set_domain(product_type + ‘.aliyuncs.com‘)

    def get_aksk_from_config_file(self):
        if not (os.path.exists(self.slb_config_file)):
            self.slb_manager_info.exit_code = 1
            self.slb_manager_info.exit_message = self.slb_config_file + "文件找不到"
        try:
            with open(self.slb_config_file, ‘r‘) as f:
                slb_config = json.load(f)
        except IOError as e:
            self.slb_manager_info.exit_code = 2
            self.slb_manager_info.exit_message = "文件读取失败" + str(e)
        return slb_config["slb_ak"], slb_config["slb_sk"]

    def get_slb_id(self):
        request = CommonRequest()
        self.set_comm_request(request)
        request.set_version(‘2014-05-15‘)
        request.set_action_name(‘DescribeLoadBalancers‘)
        request.add_query_param(‘LoadBalancerName‘, self.slb_name)
        response = self.client.do_action_with_exception(request)
        response_json = byte_to_json(response)
        if response_json["TotalCount"] != 1 :
            self.slb_manager_info.exit_code = 3
            self.slb_manager_info.exit_message ="根据负载均衡名字获取到的总个数不为1 ,请确认负载的名字,真实获取的个数为" +str(response_json["TotalCount"] )
        else:
            self.slb_id = response_json["LoadBalancers"]["LoadBalancer"][0]["LoadBalancerId"]
        a=1
    def get_ecs_id(self):
        request = CommonRequest()
        self.set_comm_request(request, product_type=‘ecs‘)
        request.set_version(‘2014-05-26‘)
        request.set_action_name(‘DescribeInstances‘)
        request.add_query_param(‘InstanceName‘, self.ecs_name)
        response = self.client.do_action_with_exception(request)
        response_json = byte_to_json(response)
        if response_json["TotalCount"] != 1 :
            self.slb_manager_info.exit_code = 4
            self.slb_manager_info.exit_message = "获取不到ecsid,请检查ecs_name"
        else:
            self.ecs_id = response_json["Instances"]["Instance"][0]["InstanceId"]

    def set_weight_for_ecs(self):
        for backend_server in self.backend_servers:
            backend_server["ServerId"] = backend_server["VmName"]
            if backend_server["VmName"] == self.ecs_id:
                # 保留下设置前的权重
                self.slb_manager_info.extra_message["old_weight"] = backend_server["Weight"]
                backend_server["Weight"] = self.weight

    def set_weight_for_default_group_backend_servers(self):
        request = CommonRequest()
        self.set_comm_request(request)
        request.set_version(‘2014-05-15‘)
        request.set_action_name(‘SetBackendServers‘)
        request.add_query_param(‘LoadBalancerId‘, self.slb_id)
        request.add_query_param(‘BackendServers‘, self.backend_servers)
        response = self.client.do_action_with_exception(request)
        response_json = byte_to_json(response)
        # 这个貌似没法对结果进行判定。

    def set_weight_for_virtual_group_backend_servers(self):
        request = CommonRequest()
        self.set_comm_request(request)
        request.set_version(‘2014-05-15‘)
        request.set_action_name(‘SetVServerGroupAttribute‘)
        request.add_query_param(‘LoadBalancerId‘, self.slb_id)
        request.add_query_param(‘VServerGroupId‘, self.virtual_group_id)
        # request.add_query_param(‘VServerGroupName‘, ‘test2‘)
        request.add_query_param(‘BackendServers‘, self.backend_servers)
        response = self.client.do_action_with_exception(request)
        response_json = byte_to_json(response)
        # 这个貌似没法对结果进行判定。

    def get_slb_info(self):
        request = CommonRequest()
        self.set_comm_request(request)
        request.set_version(‘2014-05-15‘)
        request.set_action_name(‘DescribeLoadBalancersRelatedEcs‘)
        request.add_query_param(‘LoadBalancerId‘, self.slb_id)
        response = self.client.do_action_with_exception(request)
        response_json = byte_to_json(response)
        if not response_json["Success"]:
            self.slb_manager_info.exit_code = 4
            self.slb_manager_info.exit_message = response_json["Message"]
        else:
            self.slb_info = response_json["LoadBalancers"]["LoadBalancer"][0]

        if self.is_default_group:
            self.backend_servers = self.slb_info["BackendServers"]["BackendServer"]
        else:
            self.virtual_server_group= None
            for virtual_group in self.slb_info["VServerGroups"]["VServerGroup"]:
                if virtual_group["GroupName"] == self.group_name:
                    self.virtual_server_group = virtual_group
                    break
            if self.virtual_server_group is None:
                self.slb_manager_info.exit_code = 6
                self.slb_manager_info.exit_message = "你输入的虚拟服务器组,不在特定的负载均衡下,请检查"
            else:
                self.virtual_group_id = self.virtual_server_group["GroupId"]
                self.backend_servers = self.virtual_server_group["BackendServers"]["BackendServer"]

        # self.backend_servers =  response_json["LoadBalancers"]["LoadBalancer"][0]["VServerGroups"]["VServerGroup"][0]["BackendServers"]["BackendServer"]

    def set_weight_for_default_group(self, slb_name, ecs_name, weight):
        # set
        self.slb_name = slb_name
        self.ecs_name = ecs_name
        self.weight = weight
        self.is_default_group = True
        if self.slb_manager_info.exit_code == 0:
            self.pre_check()
        if self.slb_manager_info.exit_code == 0:
            self.get_slb_id()
        if self.slb_manager_info.exit_code == 0:
            self.get_ecs_id()

        if self.slb_manager_info.exit_code == 0:
            self.get_slb_info()

        if self.slb_manager_info.exit_code == 0:
            self.set_weight_for_ecs()

        if self.slb_manager_info.exit_code == 0:
            self.set_weight_for_default_group_backend_servers()
        print(self.slb_manager_info)
        return self.slb_manager_info.exit_code

    def set_weight_for_virtual_group(self, slb_name, group_name, ecs_name, weight):
        # set
        self.slb_name = slb_name
        self.ecs_name = ecs_name
        self.group_name = group_name
        self.weight = weight
        self.is_default_group = False
        if self.slb_manager_info.exit_code == 0:
            self.pre_check()
        if self.slb_manager_info.exit_code == 0:
            self.get_slb_id()
        if self.slb_manager_info.exit_code == 0:
            self.get_ecs_id()
        if self.slb_manager_info.exit_code == 0:
            self.get_slb_info()
        if self.slb_manager_info.exit_code == 0:
            self.set_weight_for_ecs()
        if self.slb_manager_info.exit_code == 0:
            self.set_weight_for_virtual_group_backend_servers()
        print(self.slb_manager_info)
        return self.slb_manager_info.exit_code

def main():

    """
    python3 slb_manager.py <you_slb_name> <you_group_name> <you_ecs_name> <you_ecs_weight>
    """
    print(sys.argv)
    slb_name = sys.argv[1]
    group_name = sys.argv[2]
    ecs_name = sys.argv[3]
    weight = int(sys.argv[4])
    slb_config_file = r‘c:\\slbconfig‘
    region_id = ‘cn-beijing‘
    manager = SlbManager(slb_config_file=slb_config_file, region_id=region_id)
    ret =0
    if group_name == "default":
        ret =manager.set_weight_for_default_group(slb_name, ecs_name, weight)
    else:
        ret =manager.set_weight_for_virtual_group(slb_name, group_name, ecs_name, weight)
    sys.exit(ret)

if __name__ == "__main__":
    main()
    # manager = SlbManager(slb_config_file=r‘c:\\slbconfig‘,region_id=‘cn-beijing‘)
    # manager.set_weight_for_default_group(‘lb_tmp‘,‘aliyun_test03‘,10)
    # manager.set_weight_for_virtual_group(‘lb_tmp‘,‘test2‘,‘aliyun_test02‘,0)

注意事项

  1. 脚本是支持默认服务器组和虚拟服务器的, 如果接受的第三个参数为default,表示设置的默认后端服务器的权重, 如果为其他的,表示设置虚拟服务器组,且组名为你传递过来的值,所有使用此脚本你的虚拟服务器组不能设置叫default的组名。
  2. 可以根据退出码来判定设置结果情况。
  3. 输出的结果信息里面有修改前的权重值,可以使用bash命令来提取这个脚本的输出来获取。
  4. 你提供的ecs名字在ecs在你所有的ec的名字中是唯一的
  5. 你提供的slb名字在你自己的slb的所有名字中是唯一的。

脚本使用

第一步: ram创建一个账号, 并授予该账号的slb所有权限,ecs所有权限,并为该用户生成ak,sk。

第二步: 创建一个文件写入ak,sk信息。

内容如下

{
      "slb_ak":"xxxxxxxxxxxxxx",
      "slb_sk":"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

第三步:

修改脚本的 slb_config_file的路径为你的aksk文件路径,修改region-id默认值。

第四步: 创建一个按量付费的负载均衡测试下。

使用样例

C:\Users\Administrator\Anaconda3\python.exe E:/haoweilai/Devops/scripts/slb_manager.py lb_tmp3 test23 aliyun_test02 13
[‘E:/haoweilai/Devops/scripts/slb_manager.py‘, ‘lb_tmp3‘, ‘test23‘, ‘aliyun_test02‘, ‘13‘]
{‘exit_code‘: 3, ‘exit_message‘: ‘根据负载均衡名字获取到的总个数不为1 ,请确认负载的名字,真实获取的个数为0‘, ‘extra_message‘: {}}

C:\Users\Administrator\Anaconda3\python.exe E:/haoweilai/Devops/scripts/slb_manager.py lb_tmp test23 aliyun_test02 14
[‘E:/haoweilai/Devops/scripts/slb_manager.py‘, ‘lb_tmp‘, ‘test23‘, ‘aliyun_test02‘, ‘14‘]
{‘exit_code‘: 0, ‘exit_message‘: ‘‘, ‘extra_message‘: {‘old_weight‘: 100}}

C:\Users\Administrator\Anaconda3\python.exe E:/haoweilai/Devops/scripts/slb_manager.py lb_tmp default aliyun_test02 50
[‘E:/haoweilai/Devops/scripts/slb_manager.py‘, ‘lb_tmp‘, ‘default‘, ‘aliyun_test02‘, ‘50‘]
{‘exit_code‘: 0, ‘exit_message‘: ‘‘, ‘extra_message‘: {‘old_weight‘: 100}}

参考

阿里云官方在线调试: https://api.aliyun.com/

阿里云python sdk地址: https://developer.aliyun.com/tools/sdk?#/python

负载均衡产品api参考: https://help.aliyun.com/document_detail/27566.html?spm=a2c4g.11186623.6.703.5a986327GsPz8E

原文地址:https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_liunx_51_aliyun_slb_manager.html

时间: 2024-11-08 08:50:06

阿里云负载均衡权重管理脚本的相关文章

使用阿里云负载均衡遭遇的http重定向https的问题

昨天解决了在阿里云负载均衡上部署https证书的问题(详见一个空行引起的阿里云负载均衡上部署https证书的问题),并完成了部署,负载均衡的监听配置是这样的: 用户与负载均衡之间走https协议,负载均衡与后端服务器之间走http协议,这样的好处之一是后端服务器不用一台台安装证书了. 今天早上准备实现当用户以http访问站点时自动跳转为https访问,于是想当然地在后端web服务器中添加了一条如下的URL重写规则(IIS URL Rewrite Module): <rewrite> <r

新功能:阿里云负载均衡SLB支持HTTP/HTTPS超时时间自定义功能

摘要: 大家好,很高兴的告诉大家,阿里云负载均衡SLB已经在新加坡.澳大利亚(悉尼).马来西亚(吉隆坡).日本(东京).美国(硅谷).美国(弗吉尼亚).德国(法兰克福).阿联酋(迪拜).印度(孟买)上述地域支持HTTP/HTTPS超时时间自定义功能(增加黑名单),国内地域也即将上线. 1. Greeting 大家好,很高兴的告诉大家,阿里云负载均衡SLB已经在新加坡.澳大利亚(悉尼).马来西亚(吉隆坡).日本(东京).美国(硅谷).美国(弗吉尼亚).德国(法兰克福).阿联酋(迪拜).印度(孟买)

新功能:阿里云负载均衡SLB支持HTTPS虚拟主机功能(SNI)

摘要: 新功能:负载均衡SLB支持HTTPS虚拟主机功能(SNI) Greeting 大家好,很高兴告诉大家,阿里云负载均衡SLB支持HTTPS虚拟主机(单VIP多证书功能-SNI),目前已经在所有海外地域和国内华北3(张家口).华北5(呼和浩特)地域开放,欢迎大家使用.具体内容请大家观看视频:http://cloud.video.taobao.com//play/u/3230239311/p/2/e/6/t/1/50141182873.mp4. 原文链接 原文地址:http://blog.51

腾讯云--腾讯云sdk-实现脚本修改腾讯云负载均衡权重

一.请确认你的当前python环境为python 2.x 获取 python 版本的方法 (linux shell) # python -v python 2.7.11 二.CLB SDK下载与配置 ----------  要想使用SDK,则先需要获取云API秘钥  ---------- 获取云API秘钥方式: 登录腾讯云控制台,将鼠标悬停在你的小人头上面,会弹出访问管理,访问秘钥--API秘钥 2.1  下载最新版的CLB python SDK 下载地址为:  http://clbsdk-12

腾讯云SSL证书+阿里云负载均衡实现https转https

现在很多人,很多企业都开始注重信息安全,http协议由于采用不加密传输数据,所以会存在信息的泄漏,所以现在更多的企业和个人的网站开始采用https协议来加密自己网站的传输数据.如果你有多台相同的服务器提供服务,那么利用负载均衡实现http转换成https,可以花费更少的资金,更方便,更便捷. 创建负载均衡 1.1 登录阿里云,进入到控制台,点击左侧的负载均衡,进入到负载均衡的页面 1.2  进入到负载均衡页面,点击创建负载均衡,进入到负载均衡创建页面,收费方式分为预付费模式,按量付费模式 1.3

阿里云负载均衡升级:同城容灾进一步提升可用性

为了向广大SLB用户提供更加稳定可靠的负载均衡服务,近期阿里云对其SLB系统进行了升级,优先在杭州和青岛地域部署了同城容灾的本地高可用解决方案,下面就让我们一起来了解一下SLB同城容灾方案. 什么是同城容灾? SLB集群本身,已经实现了各种冗余,包括电力.网络.服务器等.我们单集群可以防止“单路电力故障”.“单边网络故障”.“服务硬件故障”.“系统意外宕机”甚至“整(一)个机柜突然掉电.突然断网.突然宕机”等故障对用户对外服务造成的影响. 但是更大范围的故障,比如整个数据中心不可用,已经不能从S

云负载均衡入门与产品使用指南

课程介绍 负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性. 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法. 课时列表 课时1:负载均衡产品创建与使用限制 课时2:负载均衡产品结构 课时3:负载均衡管管理控制台基本操作 课时4:负载均衡产品优势与定义 课时5:负载均衡管理控制台监控指标的介绍 课时6:负载均衡管理控制台修改配置监听 课时7:负载均衡应

**云负载均衡的介绍和使用场景**

负载均衡 服务器的向上扩展和向外扩展 向上扩展(垂直扩展):向单一节点条件硬件设备或其升级为一个大型节点. 向外扩展(水平扩展):添加更多节点并将数据及工作负载分布于这些节点当中. 向上扩展 受限于自身的物理硬件设备,会有瓶顶 向外扩展 可以无限升级服务能力,快速的对业务进行扩容. 负载均衡: 就是分摊到多个操作单元上进行执行,减少系统的压力.例如Web服务器,FTP服务器,企业关键应用服务器和其他关键人物服务器等,从而共同完成工作任务. 负载均衡的优势: 低成本,可扩展性,高可靠性 云负载均衡

负载均衡之LVS--Shell脚本配置LVS

本篇内容主要用三个脚本来实现LVS的配置.脚本1:lvs.sh 是配置在负载均衡端,脚本2:realserver.sh 是配置后端Real Server服务器上的.脚本3:check_lvs.sh 是用在负载均衡端上来测试后端服务器的健康状态的脚本,如有一个Real Server 宕机就会自动清除,如果恢复了就再加上,后端所有服务器都宕机了,会把负载均衡端提供的错误页面加到集群中来. 规划: 负载均衡: DIP:192.168.1.11 VIP:192.168.1.10 后台Real Serve