panwang 3 سال پیش
کامیت
9a76ec124d
2فایلهای تغییر یافته به همراه175 افزوده شده و 0 حذف شده
  1. BIN
      .DS_Store
  2. 175 0
      longvideoapi_update.py

BIN
.DS_Store


+ 175 - 0
longvideoapi_update.py

@@ -0,0 +1,175 @@
+#!/u:sr/bin/env python
+#coding=utf-8
+#edite  panwang
+import docker
+import sys
+import  requests
+import json
+import queue
+import threading
+from aliyunsdkcore import client
+from aliyunsdkess.request.v20140828.DescribeScalingInstancesRequest import DescribeScalingInstancesRequest
+from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
+from aliyunsdkcore.request import CommonRequest
+from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
+from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
+import time
+
+
+AccessKey = 'LTAIuPbTPL3LDDKN'
+AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
+RegionId = 'cn-hangzhou'
+clt = client.AcsClient (AccessKey, AccessSecret, RegionId)
+#stress
+#slb_id = 'lb-bp12usgpoh04qsa6pw42r'
+#longvidleoapi
+id_1 = 'lb-bp1d6hp2ctotgt870miav'
+id_2 = 'lb-bp1lktzqe3mksoj8whjdf'
+
+class MyThread (threading.Thread):
+    def __init__(self, func):
+        threading.Thread.__init__ (self)
+        
+        self.func = func
+
+    def run(self):
+        self.func ()
+
+#健康检查
+def  checkHealth(ipadd):
+    while  True:
+        health_url = 'http://%s:8182/longvideoapi/test' %(ipadd)
+        header = {"Content-Type":"application/json"}
+        try:
+            health_code = requests.get(health_url).status_code
+        except  Exception  as  e:
+           continue
+        if  health_code == 200:
+            return  False
+            
+#服务更新完之后逐步修改服务器的权重值,直接加载100会出现502。权重值每次增加10,每2s修改一次
+def setInstanceWeightProcess(instance_id):
+    for  i in range(1,6):
+        weight = i*20
+        setWeight(id_1,instance_id,weight)
+        setWeight(id_2,instance_id,weight)
+        time.sleep(5)
+
+#设置权重 instance_id :服务器id,weight:权重值
+def setWeight(slb_id,instance_id ,weight):
+
+    BackendServers = [{"ServerId": instance_id, "Weight": weight}]
+
+    request = CommonRequest ()
+    request.set_accept_format ('json')
+    request.set_domain ('slb.aliyuncs.com')
+    request.set_version ('2014-05-15')
+    request.set_method ('POST')
+    request.set_action_name ('SetBackendServers')
+    request.add_query_param ('BackendServers', BackendServers)
+    request.add_query_param ('LoadBalancerId', slb_id)
+    try:
+        response = clt.do_action (request)
+    except Exception as e:
+        print (e)
+#获取slb下所有服务器信息
+def  getInstanceId(slb_id):
+    request = DescribeLoadBalancerAttributeRequest()
+    request.set_accept_format('json')
+    request.set_LoadBalancerId(slb_id)
+    response = clt.do_action_with_exception(request)
+    return json.loads (response)
+
+#获取实例IP地址
+def  getIpadd(instance_id):
+    request = DescribeNetworkInterfacesRequest()
+    request.set_accept_format('json')
+    request.set_InstanceId(instance_id)
+    response = clt.do_action_with_exception(request)
+    request_content = json.loads(response)
+    IpAddr  = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
+    return  IpAddr
+
+#更新服务
+def  update():
+    time.sleep(10)
+    global success_count
+    apps = 'vlogapi'
+    version = sys.argv[1]
+    registry = 'registry-vpc.cn-hangzhou.aliyuncs.com/stuuudy/vlogapi:{}'.format(version)
+    while  not q2.empty():
+        instance_id = q2.get()
+        ipadd = getIpadd(instance_id)
+        print("服务器信息:" + "%s/%s" %(instance_id, ipadd))
+        client = docker.DockerClient(base_url='tcp://%s:2375'  %(ipadd),timeout=60 )
+        try:
+        #更新前移除旧的容器
+            id = client.containers.get(apps)
+            id.remove(force = True)
+
+        except Exception as e:
+            print("容器不存在或者无法删除当前容器")
+        try:
+            #更新前删除旧的镜像
+            images = client.images.list(all)
+            
+            for  i in range(len(images)):
+              if images[i]:
+                 client.images.remove(force=True, image=images[i].tags[0])
+                 time.sleep(2)
+            #images = client.images.get(registry)
+            #client.images.remove(force=True, image=registry)
+        except Exception as e:
+            print(e)
+            print("镜像不存在,无法获取到镜像ID")
+            sys.exit(0)
+        try:
+            #登录镜像仓库
+            client.login(username='stuuudys' ,password='Qingqu@2019', registry='registry-vpc.cn-hangzhou.aliyuncs.com')
+            #启动一个容器
+            client.containers.run(registry, detach = True, cap_add = 'SYS_PTRACE', network_mode = 'host', name = apps,volumes={'/datalog/': {'bind': '/datalog/', 'mode': 'rw'}})
+            checkHealth(ipadd)
+            print("%s :权重修改中......" %(ipadd))
+
+            setInstanceWeightProcess(instance_id)
+            success_count = success_count + 1
+            print("更新进度" + "%s/%s"  %(success_count, total))
+        except Exception as e:
+            raise e
+            sys.exit()#容器启动失败立即退出更新
+
+if __name__ == '__main__':
+
+
+    #更新完成计数
+    success_count = 0
+    threads = []
+    thread_num = 1
+    res = getInstanceId (id_1)
+    #slb下服务器总数
+    total = len(res["BackendServers"]["BackendServer"])
+    q1 = queue.Queue()
+    q2 = queue.Queue()
+    if res["BackendServers"]["BackendServer"]:
+        for i in range ((len (res["BackendServers"]["BackendServer"]))):
+            instance_id = res["BackendServers"]["BackendServer"][i]["ServerId"]
+            q1.put(instance_id)            
+
+    while not  q1.empty():
+        for i in range (thread_num ):
+            if q1.empty():
+               break
+            instance_id = q1.get ()
+            setWeight (id_1,instance_id, 0)
+            setWeight (id_2,instance_id, 0)
+
+            q2.put(instance_id)
+        for i in range (thread_num ):
+        # 开启线程
+            thread = MyThread (update)
+            thread.start ()
+            threads.append(thread)
+        for thread in threads:
+            thread.join ()
+    
+