Zero Downtime deployments with Terraform
本文介绍了 Checkly 的工程团队如何使用 AWS EC2 / SQS / Terraform 完成队列 worker 的 zero downtime。
- 目标
- worker 在不伤害用户体验的情况下可以杀掉
- 多版本 worker 可以共存
- 每个 worker 都可以独立升级
- 新 worker 一旦就绪立马工作
- 当新 worker 都起来以后 老 worker 要被杀掉
- release 出错时停止继续部署
- 可以被部署到多个 region
- 新 worker 自动加入监控
- release 出错时可以触发警告
- 实现
- 使用 cron 发送消息到 sqs 队列。
- workers 订阅一个队列,每台机器 5 个 workers。每个 workers 是一个 docker nodejs 进程。
- 任务成功调用
done()
任务失败调用done(err)
, 任务失败解除锁定重新进入队列。 - autoscaling 可以基于机器的负载自动扩容。
- terraform 设置 aws_instance create_before_destroy=true, 并且基于
while ps|grep xxx; do sleep 5; done
阻塞执行直到进程启动。aws_instance 的环境变量通过配置/root/.profile
。 - terraform module 可以完成不同 region 配置不同参数。
- 部署失败时会处于不确定的状态,不建议自动处理,可能需要人工干预。