弹性伸缩系统
1. 项目背景
每次大促前我们都会面临着系统扩容的挑战,之所以使用"挑战"二字,是因为我们每次都是人肉操作,要投入大量的人员和时间去支持大促,之前的扩容流程如下:
- 找到目标机器
- 确定目标机器是否挂载data盘,确认/etc/fstab配置是否正确
- 在云资源控制台基于此机器创建镜像
- 基于镜像创建购买机器的订单
- 发送leader审批订单付款
- 协调研发发布代码保持版本一致
- 慢慢放量观察请求状态是否正常
这一套流程下来超过1小时并且操作人感觉很疲惫,在这种状态下就很容易引发各种线上故障。
2. 项目目标
针对上述的复杂流程我们希望做出改变,因为我们认为扩缩容不应该是这么复杂且高风险的事情,我们要用标准化和自动化来替代人工。于是就有了自动伸缩系统这个项目, 项目目标很简单:
- 大促1小时内完成所有项目扩缩容
- 单应用5分钟内完成扩缩容
归根结底还是落到了成本/稳定/效率的核心目标上
3. 项目核心
为了完成上述的2个大目标,我们进行拆解分析,其实无非就是和CI/CD,云厂商,监控,网关方面的交互,问题不大, 具体拆解的项目核心如下:
- 核心目标
- CI/CD:
- 在敏捷开发背景下,我们的操作在保证安全的情况下要尽可能小的影响开发人员
- 扩容之前禁用项目发布
- 扩容之后确保版本统一
- 在敏捷开发背景下,我们的操作在保证安全的情况下要尽可能小的影响开发人员
- 云厂商:
- 确保扩容机器/容器环境一致
- 确保配额充足
- 监控:
- 确保扩缩容之后快速发现异常,以实施应急预案
- 网关:
- 确保扩缩容对业务请求无影响(动态调整)
- CI/CD:
4. 项目挑战
- 监控的实时性和准确性: 决定扩缩容是否正常的判断逻辑
- 引入flink做实时计算
- 统一网关: 决定动态调整流量的逻辑是否可实现
- 镜像的制作速度
- 异步制作/每天定时制作
- 扩容之后打通ci/cd同步代码