Loading... 在物联网架构中,长连接和登录服务器是架构中重要的一部分,而由于牵扯到手机端和物连终端一直在线,而一旦升级长连接服务会导致高并发访问登录服务,进而对整个架构造成压力冲击,甚至造成雪崩现象。 通过近一年的手动部署更新以及日常维护,对更新长连接服务有了一定的认识,也梳理出了“更新八步骤”: (1)停 nls。使用ucloud控制台,调整到ulb nls machtalk页面,暂停两个后端服务。 (2)关 ncs。使用dcos平台,切换到xcloud-ncs相应节点的目录下,并进行suspend操作。 (3)查 ncs对应的访问地址。 (4)删 删除ncs对应的redis中的server_id_onlines节点。 (5)改 在dcos页面,修改ncs对应的镜像tag。 (6)起 启动ncs节点,等待dcos状态反应正常。 (7)复 恢复一个nls反代节点。 (8)看 观察在线数是否恢复。 其中的关键,在于通过开关登录服务的haproxy代理,实现在长连接服务器重启过程中避免登录服务开启。 以往,以上操作均是手工进行,而随着一次一次的部署和刷新认知,渐渐发现可以通过编程实现自动化的部署。昨日,已经实现了半自动化,仅需一部分人工的方式进行了更新。而本次,将通过调用ucloud sdk python3实现自动控制ulb后端开关。 整体步骤记录如下: 登录UCloud控制台,新增DEVOPS 公钥和私钥。 ![2023-12-19T06:14:51.png][1] 切换UCloud控制台到ULB界面,在传统负载均衡页面,获取ULB ID ![2023-12-19T06:15:50.png][2] 查看相关页面,获取UCloud对应的“地域短ID” ![2023-12-19T06:16:22.png][3] 通过查看ULB的页面操作内容,发现操作内容英文说明“UpdateULBAttribute” ![2023-12-19T06:17:00.png][4] 翻看SDK说明,找到类似的方法“” https://ucloud.github.io/ucloud-sdk-python3/services.html?highlight=ulb#ulb ``` update_backend_attribute(req: Optional[dict] = None, **kwargs) → dict[source] UpdateBackendAttribute - 更新ULB后端资源实例(服务节点)属性 Request ProjectId (str) - (Config) 项目ID。不填写为默认项目,子帐号必须填写。 请参考 GetProjectList接口 Region (str) - (Config) 地域。 参见 地域和可用区列表 BackendId (str) - (Required) 后端资源实例的ID(ULB后端ID,非资源自身ID) ULBId (str) - (Required) 负载均衡资源ID Enabled (int) - 后端实例状态开关 IsBackup (int) - 是否为backup0:主rs1:备rs默认为0 Port (int) - 后端资源服务端口,取值范围[1-65535] Weight (int) - 所添加的后端RS权重(在加权轮询算法下有效),取值范围[0-100],默认为1 Response ``` 开始编写代码 安装包 ``` pip install ucloud-sdk-python3 ``` python文件头部,引入sdk包 ``` #!/bin/env python3 from ucloud.core import exc from ucloud.client import Client import sys ``` 定义连接的主要信息 ``` client = Client({ "region": "cn-bj2", "project_id": "xxx", "public_key": "xxx", "private_key": "xxx", }) ``` 定义获取目标ulb的详细信息 ``` def get_nls_backendinfon(): try: resp = client.ulb().describe_ulb({ 'ULBId': 'ulb-xxx' }) except exec.UCloudException as e: print(e) else: print(resp) ``` 找到其中的backend信息 ![2023-12-19T06:20:57.png][5] 编写开关主要函数 ``` def turn_ulb_nls_to_update_mode(): try: resp = client.ulb().update_backend_attribute({ 'ULBId': 'ulb-xxx', 'BackendId': 'backend-1', 'Enabled': 1, }) except exec.UCloudException as e: print(e) else: print(resp) try: resp = client.ulb().update_backend_attribute({ 'ULBId': 'ulb-xxx', 'BackendId': 'backend-2', 'Enabled': 0, }) except exec.UCloudException as e: print(e) else: print(resp) try: resp = client.ulb().update_backend_attribute({ 'ULBId': 'ulb-xxx', 'BackendId': 'backend-3', 'Enabled': 0, }) except exec.UCloudException as e: print(e) else: print(resp) def turn_ulb_nls_to_normal_mode(): try: resp = client.ulb().update_backend_attribute({ 'ULBId': 'ulb-xxx', 'BackendId': 'backend-1', 'Enabled': 0, }) except exec.UCloudException as e: print(e) else: print(resp) try: resp = client.ulb().update_backend_attribute({ 'ULBId': 'ulb-xxx', 'BackendId': 'backend-2', 'Enabled': 1, }) except exec.UCloudException as e: print(e) else: print(resp) try: resp = client.ulb().update_backend_attribute({ 'ULBId': 'ulb-xxx', 'BackendId': 'backend-3', 'Enabled': 1, }) except exec.UCloudException as e: print(e) else: print(resp) ``` 最后,编写程序入口函数 ``` if __name__ == '__main__': if len(sys.argv) > 1: # 获取第一个参数(索引1) action = sys.argv[1] if action == "get": get_nls_backendinfon() elif action == "start": turn_ulb_nls_to_update_mode() elif action == "stop": turn_ulb_nls_to_normal_mode() else: print("输入的好像不对,请检查") print("./ulb_nls.py get -- 获取ulb nls的信息") print("./ulb_nls.py start -- 调整nls后端状态,进入ncs更新状态") print("./ulb_nls.py stop -- 调整nls后端转改,进入ncs更新完毕状态") else: print("No action specified") print("输入的好像不对,请检查") print("./ulb_nls.py get -- 获取ulb nls的信息") print("./ulb_nls.py start -- 调整nls后端状态,进入ncs更新状态") print("./ulb_nls.py stop -- 调整nls后端转改,进入ncs更新完毕状态") ``` 最终,实现的开关效果如下: ![2023-12-19T06:24:03.png][6] ![2023-12-19T06:24:07.png][7] [1]: https://www.sddts.cn/usr/uploads/2023/12/379676306.png [2]: https://www.sddts.cn/usr/uploads/2023/12/3255325486.png [3]: https://www.sddts.cn/usr/uploads/2023/12/3466473840.png [4]: https://www.sddts.cn/usr/uploads/2023/12/2007266289.png [5]: https://www.sddts.cn/usr/uploads/2023/12/3072842723.png [6]: https://www.sddts.cn/usr/uploads/2023/12/3903993778.png [7]: https://www.sddts.cn/usr/uploads/2023/12/2047309514.png 最后修改:2024 年 05 月 11 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏