好运飞艇交流群奥巴马都去作客的美国版天涯论坛Reddit的代码部署演变史

  • 时间:
  • 浏览:0
  • 来源:彩神快3网站-彩神app官方

  亲戚亲戚朋友 老会 在Reddit部署代码。每位工程师也有写代码,进行检查,检查,并定期将其推广到生产。 通常状况下每周处于200次,部署通常须要只有10分钟。

  目前这套系统是从push本身Perl脚本发展而来的。本身脚本诞生的时间与Reddit现在的历史时间有很大不同。当时整个开发团队小的可怜,用一间很小的会议室就都须要装满了。甚至Reddit还没人在AWS上。该站点运行在固定数量的服务器上,须要手动加带额外的容量,而且由兩个多称为r2的大型单片Python应用系统进程组成。

  在没人多年的发展过程中,还没人变过的一件事什么都有有 请求在负载均衡器上进行分类,而且分配给不同的应用服务器的特定“池”。比如,列表页面和评价页面是由单独的服务器池提供的。尽管给定任意的r2系统进程都都须要解决任何类型的请求,而且单独的池从流量的峰值再到某些的池,而且当它们有不同的依赖关系时,有而且就会解决失败。

  push工具有一套硬编码的服务器列表,而且是围绕着整体的部署系统进程进行搭建的。它将遍历所有应用系统进程服务器,SSH到机器,运行预设的命令序列,以通过git更新服务器上的代码副本,而且重新启动所有应用系统进程系统进程。本质上(也什么都有有 说经过小量的超净,而也有真正的代码):

  部署是按照顺序逐步进行的。它通过逐个服务器进行工作。听起来好像很简单,但这我我嘴笨 是本身很好的思:它允许使用canary式的部署形式。而且您仅部署到小量的服务器,并注意到老会 出显了兩个多新的异常,你应该就会知道代码上方而且有bug,而且你终止部署(快捷键是Ctrl + C),而且在老会 出显影响前一天尽快回滚。而且本身部署很简单,而且在生产中能很轻松的发现问题,而且在没人产生影响前一天也都须要轻而易举的对代码进行回滚。这也导致 着有必要一次就部署一下,以确保新的错误来自本次部署,而也有原本,而且更容易知道有哪些前一天恢复以及恢复有哪些。

  前一天亲戚亲戚朋友 又招聘了一批新的员工,总工程师变成6位了,看起来似乎须要一间稍微大某些的会议室了。在这前一天亲戚亲戚朋友 现在结速我嘴笨 须要有更好的合作土法子土法子开发的机制了,尤其是每当时人在隔壁家工作的前一天。于是亲戚亲戚朋友 便修改了一下push工具,当现在结速部署而且现在结速部署时,它会通过IRC的聊器人软件通知到每当时人。机器人软件是在IRC上方,也是由它去发送通知的。事实上,部署的形式看上去还是没人改变,而且现在是系统代替了员工进行工作,而且也是由它去通知当时人你正在做有哪些。

  也什么都有有 从这前一天现在结速,亲戚亲戚朋友 使用了通过聊天去通知部署本身工作流程。其我我嘴笨 这段期间亲戚亲戚朋友 使用了什么都有有交流类的软件去管理部署,而且而且亲戚亲戚朋友 使用的是第三方软件IRC服务,亲戚亲戚朋友 没土法子删剪信任由产品控制的聊天室,而且它仍然是单向信息流。

  随着网站流量的增长,基础设施的支持也显得愈发重要。亲戚亲戚朋友 有时不得不推出一批新的应用服务器并投入使用。这项工作还常的人工化,包括还须要去手工更新push上方的主机列表。

  当亲戚亲戚朋友 增加规模时,亲戚亲戚朋友 通常是通过一次性增加若干台服务器,从而增加池的数量。其结果是通过顺序的迭代服务器列表,都须要在同一池子中快速连续地访问多个服务器,而也有繁复的组合进行访问。

  亲戚亲戚朋友 使用uWSGI来管理员工的工作系统进程,而且而且重启它说说,会导致 现有的系统进程被杀掉,而且启动一批新的系统进程。新的系统进程需最少每段时间来准备服务请求,这而且影响到服务请求池的数量。而且亲戚亲戚朋友 把传输波特率到了假若署到服务器就都须要了。

  亲戚亲戚朋友 对部署工具进行了一次的调整,现在用的是Python开发出来的,而且没人知道为什么么会 会 还是叫push。新版本在某些功能上做了某些改善。

  首先,现在是从DNS去获取所有的主机列表了,而也有在通过硬编码的形式。本身调整就解决再老会 出显那种更新主机列表的前一天,忘记去更新部署工具了,这才是兩个多基本的服务发现系统。

  为了解决须要按照顺序进行重启的问题,亲戚亲戚朋友 在重启前一天会打乱主机列表。而且没人做会使得服务器池变得混乱,原本就都须要以更快的传输波特率回滚,而且部署也就变得更快。

  最现在结速的前一天,每次也有通过打乱顺序去解决,但没人做就增加了快速恢复代码的难度,而且你不想每次都部署,第一台服务器不而且每次都相同,而且亲戚亲戚朋友 又调整了本身机制,使用了seed技术,在恢复代码时,它都须要在第二次部署的前一天重新使用。

  原本我嘴笨 小而且也有点痛 要的调整点什么都有有 始终部署固定版本的代码。本身工具的前兩个多版本会去更新指定主机的master,而且而且许多人不小心提交了代码而使得master改变了中期部署的土法子,会为什么么会 样呢?通过部署特定的git修订而也有分支名称,亲戚亲戚朋友 确保了每次部署的前一天,无论在生产的哪个环节,都能获取到相同的版本。

  最后,新版本的工具区分了代码(主要针对主机列表和SSHing)和正在运行的命令。它仍然与r2的需求有很大的偏差,但它有了排序的原始的API。这允许r2控制当时人的部署步骤,对建立和发布流的更改更加容易。什儿 ,以下而且是在单个服务器上运行的功能。确切的命令是隐藏的,而且序列仍然是特定于r2的工作流程的。

  于是亲戚亲戚朋友 决定使用云端和autoscale(单独博客文章的主题)。这都须要帮亲戚亲戚朋友 节省一大笔钱,当网站处于没人小量的访问量时,自动增长都须要满足意料之外的需求。。

  先前改为从DNS获取主机列表的调整使得这是兩个多自然的过渡。主机列表的更改频率比前一天更块,但与该工具没人有哪些不同。原本是生活的一每段,只不过现在变成了自动启动autoscaler。

  然而,autoscaling的确是引发了某些有趣的边缘案例。就像没人免费的午餐一样。而且一台服务器运行的一并,也处于了部署,没人会产生有哪些状况呢?亲戚亲戚朋友 须要确保每个新启动的服务器都登记过了,以获取新的代码,而且处于说说。服务器如保中途部署呢?工具须要做得更智能,以检测服务器哪天都须要合理地移除,而也有在部署过程本身中老会 出显问题的前一天才进行提醒。

  自然而然,而且各种各样的导致 ,这次亲戚亲戚朋友 也把uWSG加带了Gunicorn。就部署而言,这并没人带来有哪些不同。

  随着时间的流逝,高峰的流量也须要太大的服务器进行支撑。也就导致 着每次部署所须要的时间也没人长。最糟糕的状况下,正常的部署须要将近兩个多小时。这果真糟透了。

  亲戚亲戚朋友 重写了部署工具来并行解决主机。新版本的名称叫rollingpin。旧工具所花的大每段时间是消耗在了初始化连接ssh以及听候命令被执行完的前一天,什么都有有在一定的安全数量上进行并行说说是都须要缩短时间的。部署的时间也立即被降到了5分钟。

  为了降低一次重启多台服务器带来的影响,工具在打乱顺序时也变得更明智了。它将以最大程度地将服务器从每个池中分离出来,而不仅仅是盲目的打乱主机的顺序。原本做也是有意地减少对网站的影响。

  新工具最重要的调整使部署工具和在每个服务器上的工具之间API定义的更加清晰,并与r2的需求分离了。这最初是为了考虑开源而关注的,但最终在不久前一天的确常有用。以下是部署示例,突老会 出显示的命令是远程执行的API。

  忽然就感觉到好像有什么都有许多人一下就使用r2了。这果真太伟大了,当然也导致 着须要更多的部署。在同兩个多时间规则下,保持兩个多部署传输波特率会变得没人困难,而且每个工程师都须要在口肩头协调亲戚亲戚朋友 会在有哪些顺序上部署代码。为了解决本身问题,亲戚亲戚朋友 又新加了兩个多功能,什么都有有 都须要自动协调部署队列。工程师将要求部署锁定,并获取或放在队列。这能助 维持部署秩序,让亲戚亲戚朋友 在听候的前一天放松一下。

  随着团队的发展,原本重要的补充是在核心部署。亲戚亲戚朋友 修改了部署工具以将指标发送给Graphite,而且很容易将部署与指标更改相关联。

  就像老会 间,亲戚亲戚朋友 有第兩个服务上线了。网站的新移动版本正在上线。这是兩个多删剪不同的堆栈,并有当时人的服务器和构建过程。这是部署工具解耦API的第兩个多真正。随着对每个项目不同构建步骤的增加,它保持不变,而且亲戚亲戚朋友 不想 在相同的系统下管理本身兩个多服务。

  在接下来的一年中,亲戚亲戚朋友 想看 了Reddit团队的爆炸性增长。亲戚亲戚朋友 从本身兩个多服务发展到了二十哪几只,从兩个多团队到十兩个,亲戚亲戚朋友 的大每段服务都建立在Baseplate,后端服务框架,或什儿 于移动网络的节点应用也有的是。基础每段是所有部署的基础,而且会上线太大,而且rollpin不出乎它的部署内容。这使得亲戚亲戚朋友 都须要使用熟悉的工具轻松地开发新的服务。

  随着服务器数量的增加,本身块也就变得没人庞大,部署所须要的时间而是我多。亲戚亲戚朋友 你会 用高并行计数来进行部署,而且原本做会导致 应用服务器带老会 出显小量的的重启。于是,亲戚亲戚朋友 降低了规模,对于传进来的请求什么都有有 能及时解决,其它的应用服务器也老会 出显了超载的状况。

  Gunicorn的主系统进程使用了跟uWSGI相同的模型,也会一次重启所有员工的工作系统进程。当新的工作系统进程启动时,您无法满足任何请求。亲戚亲戚朋友 整体的启动时间为10-200秒,这导致 着在此期间,亲戚亲戚朋友 将无法提供任何请求。为了解决本身问题,亲戚亲戚朋友 把Gunicorn的主系统进程加带了Stripe的工作经理Einhorn,一并保留了Gunicorn的HTTP stack和WSGI container。Einhorn是通过创建新的系统进程从而完成重启的,听候它当时人准备好,而且收获老的系统进程,并重复,直到所有的升级。本身机制创建了兩个多安全网,并允许亲戚亲戚朋友 在部署期间都须要响应请求。

  新模式当然也带来了新问题。就像前面提到的那样,它须要200秒的时间完成系统进程的替代和启动。这也什么都有有 说而且的你代码上方有bug,它不想立即显示,您都须要回滚多台服务器。为了解决本身状况产生,亲戚亲戚朋友 引入了本身土法子,都须要部署到另一台服务器上,直到所有的系统进程都重新启动才都须要。很简单,只须要调整einhorn的状况,而且等到所有的机器都准备好就都须要了。为了传输波特率,亲戚亲戚朋友 增加了并发,这现在而且很安全了。

  新的机制都须要让亲戚亲戚朋友 一并对多台服务器进行部署,部署2000台机器的时间降低到了7分钟,尽管须要额外的听候。

  部署的基础每段是多年的逐步改进积累而来的,绝也有任何一次大的调整导致 的。在当前系统和过去的任何前一天,都都须要想看 历史的阴影和每一次选泽的权衡。原本本身演变的土法子是有利弊的:在任何兩个多期间,也有需最少太大的代价,而且亲戚亲戚朋友 最终而且会陷入。重要的是要关注你的发展方向,原本你就都须要继续朝着有用的方向前进。

  Reddit的基础每段须要不想 跟得上团队以及新事物的发展。公司的成长传输波特率达到了Reddit历史上的峰值,与前一天相比,亲戚亲戚朋友 所从事的项目也没人有趣。现在亲戚亲戚朋友 面临的问题有两每段:提高工程师自主权,一并生产基础设施中的系统安全,以及为亲戚亲戚朋友 搭建更好的网络,让亲戚亲戚朋友 更有信心进行部署。

  推荐: