浏览代码

add restart

xuekailun 7 月之前
父节点
当前提交
743ab15eba
共有 1 个文件被更改,包括 76 次插入0 次删除
  1. 76 0
      longvideoapi/longvideo_restart.py

+ 76 - 0
longvideoapi/longvideo_restart.py

@@ -0,0 +1,76 @@
+import logging
+import time
+import docker
+import longvideo_config
+import utils
+from longvideo_update import server_health_check
+
+logging.basicConfig(level=logging.INFO,
+                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
+                    datefmt='%a, %d %b %Y %H:%M:%S')
+
+
+def server_restart(alb_client, instance_id, image_name):
+    try:
+        logging.info(f"Restarting instance: {instance_id}")
+        # 获取ip
+        ip_address = utils.get_ip_address(client=alb_client, instance_id=instance_id)
+        logging.info(f"IP address: {instance_id}/{ip_address}")
+
+        # 摘流量
+        utils.set_instance_weight_process_with_alb(client=alb_client,
+                                                   slb_id_list=longvideo_config.server_group_id_list,
+                                                   instance_id_list=instance_id,
+                                                   weight_list=[(0, 15)])
+        logging.info(f"Set weight to 0 for instance: {instance_id}")
+
+        # 连接 Docker 客户端并重启容器
+        docker_client = docker.DockerClient(base_url=f'tcp://{ip_address}:2375', timeout=60)
+        container = docker_client.containers.get(image_name)
+        container.restart()
+        logging.info("Docker restart finished.")
+
+        # 探活
+        server_health_check(alb_client, instance_id)
+        time.sleep(20)
+        logging.info("Health check finished.")
+
+        # 设置权重
+        add_weight_list = [(10, 5), (20, 5), (40, 5), (60, 5), (80, 5), (100, 5)]
+        utils.set_instance_weight_process_with_alb(alb_client,
+                                                   longvideo_config.server_group_id_list,
+                                                   instance_id,
+                                                   add_weight_list)
+        logging.info(f"Server restart finished, instance: {instance_id}/{ip_address}")
+    except Exception as e:
+        logging.error(f"Server restart failed, instance: {instance_id}")
+        logging.error(e)
+
+
+def main():
+    try:
+        alb_client = utils.connect_alb_client(
+            access_key_id=longvideo_config.alb_client_params['access_key_id'],
+            access_key_secret=longvideo_config.alb_client_params['access_key_secret']
+        )
+
+        # 获取 ALB 下所有机器
+        online_instance_ids = utils.get_instance_ids(client=alb_client,
+                                                     server_group_id=longvideo_config.server_group_id_list[0])
+        online_instance_count = len(online_instance_ids)
+        logging.info(f"Online instance count: {online_instance_count}.")
+        logging.info(f"Online instance ids: {online_instance_ids}")
+
+        # 逐台重启
+        image_name = 'longvideoapi'
+        for i, instance_id in enumerate(online_instance_ids):
+            server_restart(alb_client=alb_client, instance_id=instance_id, image_name=image_name)
+            logging.info(f"Restart progress: {i + 1}/{online_instance_count}")
+        logging.info("All servers restarted successfully!")
+    except Exception as e:
+        logging.error("An error occurred during the main execution.")
+        logging.error(e)
+
+
+if __name__ == '__main__':
+    main()