【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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:002084

评论

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

前端培训学习后的就业方向哪个比较好

小谷哥

强烈推荐!腾讯T8架构师手写的SpringBoot分布式架构笔记

小小怪下士

Java 分布式 后端 springboot

自主创新、领先一代,星环科技成功登陆科创板

星环科技

大数据 开源

如何让研发成员在会议上知无不言?

LigaAI

项目管理 敏捷开发 会议管理 迭代管理 企业号十月PK榜

Plan Stitch:一种使用缝合物理计划解决查询计划性能退化问题的方法

KaiwuDB

Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】

汀丶人工智能

nlp

原来Vue3的computed属性还能这么用啊🔥

渔戈

Vue 前端 10月月更

BH1750 光照传感器文档详解 及 驱动设计

矜辰所致

传感器 stm32 I2C协议 10月月更 BH1750

阿里巴巴 Noslate 正式开源 - 面向云原生的 JavaScript 容器方案

阿里巴巴终端技术

JavaScript 开源 云原生 前端 企业号十月PK榜

低代码开发平台盘点,让你的开发告别低效

SoFlu软件机器人

鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转

TiAmo

华为 鸿蒙开发 10月月更

Go语言入门04—循环语句

良猿

Go golang 后端 10月月更

突破单点瓶颈、挑战海量离线任务,Apache Dolphinscheduler在生鲜电商领域的落地实践

Apache DolphinScheduler

海豚调度 Apache DolphinScheduler 大数据调度 数据调度 企业号十月 PK 榜

企业级开发平台的演进

世开 Coding

软件开发 低代码 快速开发平台 少代码

一文彻底搞懂前端缓存机制

hellocoder2029

JavaScript

北京培训java开发的机构比较好

小谷哥

UIE Slim满足工业应用场景,解决推理部署耗时问题,提升效能

汀丶人工智能

java线下培训机构哪里比较好

小谷哥

golang中的map

六月的

Go map

常见恶意软件类型及危害

郑州埃文科技

网络安全 恶意软件 办公安全

途游游戏 DevOps 实践|都说「单元测试」好,「AAAC四步法」少不了

极狐GitLab

DevOps 运维 单元测试 CI/CD 代码安全

【云舟说直播间】数字可视化专场来袭

浪潮云

云计算

“程”风破浪的开发者|OpenHarmony应用开发环境搭建

技能实验室

OpenHarmony “程”风破浪的开发者

【10.14-10.21】写作社区优秀技术博文更新啦!

InfoQ写作社区官方

优质创作周报

Go语言入门03—条件语句

良猿

Go golang 后端 10月月更

2022年上海前端培训开发技术就业前景如何

小谷哥

解决 error: failed to push some refs to 'https://github.com/

timerring

git bug 10月月更

pt尾递归优化

hellocoder2029

JavaScript

uniapp打开地图选择位置

源字节1号

软件开发 前端开发 后端开发 小程序开发

“程”风破浪的开发者|Lombok的使用

楠羽

学习方法 lombok “程”风破浪的开发者

Mysql数据库基础之数据库的安装与配置

渔戈

MySQL 数据库 10月月更

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