产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

Checkly 如何借助 Terraform 实现零宕机部署

  • 2018-11-26
  • 本文字数:1788 字

    阅读完需:约 6 分钟

Checkly如何借助Terraform实现零宕机部署

Checkly 是一款验证 API 端点正确性和浏览器点击流的监控工具。Checkly 创始人 Tim Nolet 分享了他们在 AWS 上基于 Docker 的基础设施中借助 Terraform 实现零宕机部署的经验。


Checkly 使用“工作者(worker)”运行用户提交的作业。每名工作者在一个 Docker 容器中运行,5 个容器运行在一个 EC2 实例上。Checkly 面临的挑战是,在不影响用户体验的情况下部署到 AWS,同时支持代码的多版本和工作者代码的独立升级。他们使用 Terraform 的模块、滚动更新和自定义远程执行程序代码来实现这一目标。


Checkly 使用 Puppeteer 框架自动化浏览器操作。Puppeteer 是一个面向 Chrome 浏览器的无头 Node API。每个 Checkly 工作者是一个 Node 进程,可以接受参数和运行测试,而不需要保存任何状态,这样便于根据请求流量进行横向扩展。用户请求被 cron 作业压入一个 AWS SQS 队列,工作者从中取出,并把结果放入另一个队列。失败的作业不会调用 SQS API 来删除消息,而是会重试。部署一个新版本到 AWS 是通过一个基于 Docker 的生命周期,后续使用 Terraform 原语进行滚动更新。代码会经过三个环境——开发、测试和生产。为了解更多信息,InfoQ 联系了 Checkly 创始人 Tim Nolet:


Docker 容器中内置了单元测试代码,build、tag、push 等 Docker 命令作为脚本包含在 package.json 中。我们把容器(标记上一个版本号和“测试”标签)push 到我们的私有 Docker 注册库,然后完成一个测试 EC2 实例周期,后者会使用 Terraform 的“taint”命令 pull 最新的测试容器。


Terraform 中的“taint”命令会强制销毁和重新创建资源(在本例中是 EC2 实例)。Checkly 的团队让测试实例运行几天。如果一切顺利,Docker 镜像将被重新标记为“最新”,所有生产 EC2 实例都将重复“taint”命令,从而完成滚动更新。Checkly 的其中一个目标是允许应用程序的多个版本共存,这可能需要在代码或数据存储和消息队列中进行额外的处理。例如,如果 SQS 消息中使用的 JSON 格式发生了变化,那么在较短的时间内,这两种格式都必须处理,旧格式减少而新格式增加。Nolet 详细阐述了他们的方法:


由于我们还很年轻,所以在整个数据传输对象或消息传递方案中还没有发生很大的变化。但我总是会在代码中解决这个问题。队列总线、存储和所有其他中间件都不是做这件事的合适位置。因此,如果这意味着要用一堆额外的 if 语句或 case switch 来处理这两种消息类型,那就这样吧。我们使用 Postgres 作为主要的数据存储,因为 JSON 字段非常适合于数据模型的小幅调整,不会带来很多麻烦。


Terraform 提供了 create_before_destroy 等原语,以及 Checkly 使用的远程执行程序。create_before_destroy 标志可以用于所有 Terraform 托管资源,用于确保在删除旧资源之前创建一个替换资源。当 Terraform 调用底层 AWS 配置程序时,remote-exec 命令会不断检查 Node 进程是否在容器中运行,是就返回,然后向 Terraform 发出资源就绪的信号。它使用一个简单的 grep 命令来实现这一点。Checkly 的 Terraform 代码被组织成模块,每个 AWS 区域一个模块。


Terraform 代码可以通过测试工具包进行测试,比如 Terratest,它可以验证 Terraform 管理的基础设施。然而,Checkly 并没有为此使用任何测试框架,而是依赖于这样一个事实,“测试和生产环境相同,任何主要问题都可以在测试环境中发现”,Nolet 如是说。


Checkly 的基础 Docker 镜像是基于 Ubuntu 的,其中包含运行 Puppeteer 和无头 Chrome 所需的所有包,这增加了一些额外的库和字体。Docker 容器运行一个 PM2 进程,该进程会启动一个 Node 进程。按照 Nolet 的说法,Docker 策略这一部分很稳定,可能导致部署回滚的错误通常出现在实际的产品代码中。Checkly 同时使用 AWS CloudWatch 和 AppOptics 进行监控。CloudWatch 针对 AWS 队列大小、延迟以及实例的基本健康状况发出警告。AppOptics 更侧重于应用程序,检查一些指标,比如最近 10 分钟里给定区域内的运行次数,或者给定区域内的运行时间。Checkly 的状态仪表板是公开的。


查看英文原文:https://www.infoq.com/news/2018/11/checkly-terraform-deployments

活动推荐


12 月 7 日北京 ArchSummit 全球架构师峰会上,来自 Google、Netflix、BAT、滴滴、美团 等公司技术讲师齐聚一堂,共同分享“微服务、金融技术、前端黑科技、智能运维等相关经验与实践。详情点击 https://bj2018.archsummit.com/schedule


2018-11-26 16:571740
用户头像

发布了 1008 篇内容, 共 389.9 次阅读, 收获喜欢 344 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

Git之使用GitHub搭建远程仓库

梦笔生花

GitHub、 git 学习 代码托管 分支管理 clone代码

案例分享:硬件敏捷

ShineScrum捷行

Scrum 敏捷开发 TDD 硬件敏捷

Triple 协议支持 Java 异常回传的设计与实现

Apache Dubbo

Java 开源 微服务 gRPC dubbo

Gitea 的邮件通知

HoneyMoose

华为云发布CodeArts Req需求管理工具,让需求管理化繁为简

IT科技苏辞

站在2023起跑线,政企数字化如何深入“核心地带”?

脑极体

华为云助推武水集团项目成功入选住建部“智慧水务”典型案例!

秃头也爱科技

架构实战营 模块三作业 外包学生管理系统架构设计

西山薄凉

「架构实战营」

移动办公时代,就看华为云桌面

秃头也爱科技

云上办公,华为云桌面为何能连续7年第一?

秃头也爱科技

MVP、原型、概念验证,傻傻分不清楚?

敏捷开发

开发 MVP 原型

软件测试简历书写 | 简历中应该如何描述才能体现出软技能的实力 ?

测试人

软件测试 自动化测试 简历 软技能 测试开发

说透IO多路复用模型

京东科技开发者

开发 系统 epoll poll Lunix

软件测试面试 | 一面试就紧张,怎么办?

霍格沃兹测试开发学社

【Java技术专题】「原理专题」深入分析Java中finalize方法的作用和底层原理

洛神灬殇

Java JVM Finalizer 12月月更

华为时习知,让企业培训更简单!

IT科技苏辞

一图了解人造石墨负极材料上中下游全产业链

PreMaint

新能源 锂电池

Tapdata Cloud 场景通关系列: Oracle → MySQL 异构实时同步

tapdata

oracle 异构数据 MySQL 数据库 实时数据 数据同步工具

Java高手速成│Java程序怎样和数据库对话

TiAmo

JDBC 数据库· 12月月更

时序引擎架构和实例演练

KaiwuDB

云渲染时可以关机吗_云渲染电脑可以关闭吗?

Renderbus瑞云渲染农场

云渲染

远程办公成趋势,华为云桌面为何连续7年领跑?

秃头也爱科技

90%的Java开发人员都会犯的5个错误

JAVA旭阳

Java

软件测试|HTTPS 的通信

霍格沃兹测试开发学社

Syscoin宣布与Web3孵化器WEconomy建立长期合作伙伴关系

100DAO 加速计划

DAO #Syscoin #区块链 #Web3

2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻

福大大架构师每日一题

golang 算法 福大大

参与Getaverse早期建设,成为节点验证者!!

Geek_Web3

#区块链# did #Web3

HTTP其他首部字段

穿过生命散发芬芳

HTTP 12月月更

【MySQL】数据库索引 - 浅谈索引类型

非晓为骁

Go 数据库 索引 MySQL 数据库

华为云HECS云耀云服务器:全民上云的开拓者

秃头也爱科技

浅谈权限系统在多利熊业务应用

百度Geek说

百度 权限系统 12 月 PK 榜 多利熊

Checkly如何借助Terraform实现零宕机部署_容器_Hrishikesh Barua_InfoQ精选文章