发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

Instagram 的持续部署实践

  • 2016-05-11
  • 本文字数:1541 字

    阅读完需:约 5 分钟

Instagram 最近发布了一篇文章来介绍他们的持续部署(Continuous Deployment,简称 CD)流水线。借助这套 CD 流水线,工程师们能更快地将代码推送至生产环境,更方便地找到有问题的改动,以及将代码随时保持在可发布的状态。在一段时间频繁的迭代之后,最终其背后的核心原则主要包括:

  • 拥有高质量的测试集
  • 拥有快速定位问题改动的能力
  • 拥有可视化部署流程的能力
  • 拥有可行的回滚(rollback)计划

在 Instagram 使用这套 CD 流水线之前,发布流程是由一堆脚本与手动步骤混杂而成。通常有一台机器会先被部署并用来进行可用性测试(Sanity),然后剩下的机器才会被依次部署。Sauron 是一款基本的发布跟踪系统,由一套 UI 和一个数据库构成,用于可视化之前发布的结果。整个发布流程使用 Fabric 来实现基于 SSH 的自动化部署。

2013 年,Facebook 收购了 Instagram,并开始将其基础设施从 AWS 上迁移至 Facebook 自己的数据中心。据 Facebook 产品工程师(Production Engineer)、前文作者 Michael Gorven 介绍,Instagram 拥有几千台机器,却能做到每天部署 30 至 50 次代码。之所以规模庞大并持续增长的基础设施没有妨碍代码的发布,主要归功于 Facebook 用于发布的一套分布式 SSH 系统。

持续部署最初遇到的两个阻碍,分别是脆弱的测试集,以及一大堆等待发布的改动。其中,前者主要由低效及不稳定的测试造成,而后者则由失败的部署造成。基础设施的规模越大,部署时出错的几率越高,对应的每次部署所携带的改动就越多,从而使部署更容易出错。就解决方法来说,脆弱的测试集主要靠人为优化,而部署的试错则可以用所谓的“金丝雀部署”(Canary Deployment)来解决。在金丝雀部署中,改动只被推送到一部分离线服务器上并进行自动化测试,然后根据测试结果来决定这次部署是继续还是回滚。

在此基础上,Instagram 在 CD 流水线中加入了更多智能,使其能够判断决定哪些改动可以发布上线。通过与 Jenkins 的集成,CD 流水线可以根据测试结果将改动分为“好”与“坏”两类,并直接将分类结果推送至 Sauron,以供利益干系人(stakeholders)查阅。

Sauron 会显示每一个改动及其发布状态,并会将包含作者信息的发布动态自动推送到一个聊天频道;同时,改动的作者将会收到一封邮件与一条短信,来告知他们所做的改动正在发布。稍后,所有发布动态将被记录在数据库中,以便日后做各种可视化分析。

在越过最初的障碍后,CD 流水线又面临一个更大的挑战,即数据库的迁移,包括数据的迁移与表结构的迁移。一般来讲,数据库迁移的解决方案大多是根据各自的产品和基础设施而制作的定制化方案,而 Instagram 也不例外。每次将数据迁移时,Instagram 的大致做法为:

  1. 将一个在线数据片(shard)慢慢复制至新的位置,直至两者的区别足够小
  2. 使用开关将老的数据片下线
  3. 将仅剩的区别搬到新的数据片上
  4. 使用开关将新的数据片上线

Gorven 还详细介绍了如何使用开关( feature toggles )来做表结构的迁移。

首先,我们更新本发布代码,使其能够同时读写新老版本的数据。然后,我们复制一份表结构并对其进行改动,比如添加几列,并将数据写操作同时作用于新老表结构。如有必要,我们将通过批处理,将现有数据从老的表结构更新到新的表结构。最终,我们会将数据读操作从老版本数据切换到新版本数据,而保持写操作不变。这个阶段会持续一段时间,以防万一,直到我们将数据读写操作都切换到新版本数据上,完成整个迁移。

作为后续,Instagram 的发布工程团队将会把注意力放在提高甄别问题改动的能力,同时尽量保持发布的速度不受影响。

查看英文原文 Continuous Deployment at Instagram


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-11 19:002076

评论

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

可以 DIY 装修的商城系统,你也能拥有!

CRMEB

消息中间件

Damon

7月月更

发现增长新动力,企业到底需要一朵什么样的云?

ToB行业头条

推荐一款支持数据 + 代码生成的开发工具!yyds

了不起的程序猿

Java 程序员 工具

LabView中禁用模块(属性节点)

一碗黄豆酱

李宏毅《机器学习》丨3. Gradient Descent(梯度下降)

AXYZdong

机器学习 7月月更

LabView---信号发生器

一碗黄豆酱

web前端开发技术就业前景怎么样

小谷哥

直播预告 | 多云时代如何建设企业云管理平台?

BoCloud博云

cmp 云管理平台 云管理

一文了解 Nebula Graph 上的 Spark 项目

NebulaGraph

spark 图数据库 知识图谱 NebulaGraph

函数递归习题(easy版)

芒果酱

c++ C语言 7月月更

小李:“有没有特别简单的Python解密rsa的案例?”“还真有”

梦想橡皮擦

Python 爬虫 7月月更

低代码软件开发平台怎么选?

优秀

低代码开发 低代码平台

LP双币质押流动性挖矿dapp系统开发逻辑分析

开发微hkkf5566

SDL文字显示

柒号华仔

7月月更

数据仓库开发 SQL 使用技巧总结

C++后台开发

MySQL 数据库 sql 中间件 后端开发

IT小白也能轻松get日志服务---使用Nginx模式采集日志

云端explorer

nginx 运维 日志服务

Ampere Altra Max 提供可持续的高分辨率 H.265 编码

亚马逊云科技 (Amazon Web Services)

编码 Tech 专栏

Python图像处理丨三种实现图像形态学转化运算模式

华为云开发者联盟

Python 人工智能 AI 图像形态学

京东云联合Forrester咨询发布混合云报告 云原生成为驱动产业发展新引擎

京东科技开发者

云原生 数字化 科技 混合云 多云

React原理学习路线

郭明

ABAP-EXCEL上传下载

桥下本有油菜花

abap ABAPexcel

百度APP Android包体积优化实践(一)总览

百度Geek说

Java 安卓

短视频直播系统源码

开源直播系统源码

短视频源码 直播系统源码 短视频直播系统

不是我说,不掌握这些坑,你敢用BigDecimal吗?

程序员小毕

Java 程序员 面试 后端 BigDecimal

如何选择合适的体育场馆用LED显示屏

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

云图说丨数字资产链:您的数字资产产权保护神

华为云开发者联盟

区块链 云计算 开发 开发工具

2022年中国娱乐直播市场年度综合分析

易观分析

直播市场

LabView实验——温度检测系统(实验学习版)

一碗黄豆酱

服务器运维需要24小时在线吗?需要周末加班吗?

行云管家

服务器 IT运维

医院怎么实现高效低成本运维?有什么软件可以满足吗?

行云管家

运维 IT运维 医院运维

Instagram的持续部署实践_DevOps & 平台工程_Hrishikesh Barua_InfoQ精选文章