大发2分彩总代奥巴马都去作客的美国版天涯论坛Reddit的代码部署演变史

  • 时间:
  • 浏览:1
  • 来源:彩神苹果app_彩神ios下载

  让让我门 总爱在Reddit部署代码。每位工程师完整时会写代码,进行检查,检查,并定期将其推广到生产。 通常情况报告下每周存在100次,部署通常不能 必须10分钟。

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

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

  push工具有一套硬编码的服务器列表,为什让是围绕着整体的部署线程进行搭建的。它将遍历所有应用线程服务器,SSH到机器,运行预设的命令序列,以通过git更新服务器上的代码副本,为什让重新启动所有应用线程线程。本质上(也假使 说经过血块的洁净室,而完整时会真正的代码):

  部署是按照顺序逐步进行的。它通过逐个服务器进行工作。听起来好像很简单,但这着实是某种很好的思:它允许使用canary式的部署形式。原应您仅部署到血块的服务器,并注意到出先了有4个新的异常,你应该就会知道代码上端原应有bug,让人终止部署(快捷键是Ctrl + C),为什让在出先影响前一天尽快回滚。原应也不 部署很简单,为什让在生产中能很轻松的发现问题 ,为什让在这么产生影响前一天也还不能轻而易举的对代码进行回滚。这也原应有必要一次就部署一下,以确保新的错误来自本次部署,而完整时会从前,为什让更容易知道那些前一天恢复以及恢复那些。

  前一天让让我门 又招聘了一批新的员工,总工程师变成6位了,看起来似乎不能 一间稍微大也不的会议室了。在这前一天让让我门 开始英语 了了英文着实不能 有更好的合作协议协议开发的机制了,尤其是每各人在我家工作的前一天。于是让让我门 便修改了一下push工具,当开始英语 了了英文部署原应开始英语 了了英文部署时,它会通过IRC的聊器人软件通知到每各人。机器人软件是在IRC上端,也是由它去发送通知的。事实上,部署的形式看上去还是这么改变,为什让现在是系统代替了员工进行工作,为什让也是由它去通知各人你正在做那些。

  也假使 从这前一天开始英语 了了英文,让让我门 使用了通过聊天去通知部署也不 工作流程。其着实这段期间让让我门 使用了也不 交流类的软件去管理部署,为什让原应让让我门 使用的是第三方软件IRC服务,让让我门 这么子完整信任由产品控制的聊天室,为什让它仍然是单向信息流。

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

  让让我门都 增加规模时,让让我门 通常是通过一次性增加若干台服务器,从而增加池的数量。其结果是通过顺序的迭代服务器列表,还不能在同一池子中快速连续地访问多个服务器,而完整时会多样化的组合进行访问。

  让让我门 使用uWSGI来管理员工的工作线程,为什让原应重启它语录,会原应现有的线程被杀掉,为什让启动一批新的线程。新的线程需离米 每段时间来准备服务请求,这原应影响到服务请求池的数量。为什让让让我门 把效率单位到了假使 署到服务器就还不能了。

  让让我门 对部署工具进行了一次的调整,现在用的是Python开发出来的,为什让这么知道为什还是叫push。新版本在也不功能上做了也不改善。

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

  为了解决不能 按照顺序进行重启的问题 ,让让我门 在重启前一天会打乱主机列表。原应这么做会使得服务器池变得混乱,从前就还不能以减慢的效率单位回滚,为什让部署也就变得减慢。

  最开始英语 了了英文的前一天,每次完整时会通过打乱顺序去解决,但这么做就增加了快速恢复代码的难度,原应你不想每次都部署,第一台服务器不原应每次都相同,为什让让让我门 又调整了也不 机制,使用了seed技术,在恢复代码时,它还不能在第二次部署的前一天重新使用。

  从前着实小为什让也很糙要的调整点假使 始终部署固定版本的代码。也不 工具的前有4个版本会去更新指定主机的master,为什让原应另一各人不小心提交了代码而使得master改变了中期部署的法子,会为什样呢?通过部署特定的git修订而完整时会分支名称,让让我门 确保了每次部署的前一天,无论在生产的哪个环节,都能获取到相同的版本。

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

  于是让让我门 决定使用云端和autoscale(单独博客文章的主题)。这还不能帮让让我门 节省一大笔钱,当网站存在这么血块的访问量时,自动增长还不能满足意料之外的需求。。

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

  然而,autoscaling的确是引发了也不有趣的边缘案例。就像这么免费的午餐一样。原应一台服务器运行的一并,也存在了部署,这么会产生那些情况报告呢?让让我门 不能 确保每个新启动的服务器都登记过了,以获取新的代码,原应存在语录。服务器怎么中途部署呢?工具不能 做得更智能,以检测服务器了吗还不能合理地移除,而完整时会在部署过程某种中出先问题 的前一天才进行提醒。

  自然而然,原应各种各样的原应,这次让让我门 也把uWSG去掉 了Gunicorn。就部署而言,这并这么带来那些不同。

  随着时间的流逝,高峰的流量也不需要 太多的服务器进行支撑。也就原应每次部署所不能 的时间也这么长。最糟糕的情况报告下,正常的部署不能 将近有4个小时。这甜得糟透了。

  让让我门 重写了部署工具来并行解决主机。新版本的名称叫rollingpin。旧工具所花的大每段时间是消耗在了初始化连接ssh以及停留命令被执行完的前一天,也不 在一定的安全数量上进行并行语录是还不能缩短时间的。部署的时间也立即被降到了5分钟。

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

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

  忽然就感觉到好像有也不 人一下就使用r2了。这甜得太伟大了,当然也原应不能 更多的部署。在同有4个时间规则下,保持有4个部署效率单位会变得这么困难,原应每个工程师都不能 在口头上协调让让我门 会在那些顺序上部署代码。为了解决也不 问题 ,让让我门 又新加了有4个功能,假使 还不能自动协调部署队列。工程师将要求部署锁定,并获取或放进队列。这有助维持部署秩序,让让让我门 在停留的前一天放松一下。

  随着团队的发展,从前重要的补充是在核心部署。让让我门 修改了部署工具以将指标发送给Graphite,为什让很容易将部署与指标更改相关联。

  就像总爱间,让让我门 有第五个服务上线了。网站的新移动版本正在上线。这是有4个完整不同的堆栈,并有各人的服务器和构建过程。这是部署工具解耦API的第有4个真正。随着对每个项目不同构建步骤的增加,它保持不变,为什让让让我门 不能在相同的系统下管理这有4个服务。

  在接下来的一年中,让让我门 看得人了Reddit团队的爆炸性增长。让让我门 从这有4个服务发展到了二十有多少,从有4个团队到十五个,让让我门 的大每段服务都建立在Baseplate,后端服务框架,或这类于移动网络的节点应用也完整时会。基础每段是所有部署的基础,为什让会上线太多,原应rollpin这么了乎它的部署内容。这使得让让我门 还不能使用熟悉的工具轻松地开发新的服务。

  随着服务器数量的增加,也不 块也就变得这么庞大,部署所不能 的时间也太多。让让我门 想要用高并行计数来进行部署,为什让从前做会原应应用服务器带出先血块的的重启。于是,让让我门 降低了规模,对于传进来的请求假使 能及时解决,其它的应用服务器也出先了超载的情况报告。

  Gunicorn的主线程使用了跟uWSGI相同的模型,也会一次重启所有员工的工作线程。当新的工作线程启动时,您无法满足任何请求。让让我门 整体的启动时间为10-100秒,这原应在此期间,让让我门 将无法提供任何请求。为了解决也不 问题 ,让让我门 把Gunicorn的主线程去掉 了Stripe的工作经理Einhorn,一并保留了Gunicorn的HTTP stack和WSGI container。Einhorn是通过创建新的线程从而完成重启的,停留它各人准备好,为什让收获老的线程,并重复,直到所有的升级。也不 机制创建了有4个安全网,并允许让让我门 在部署期间还不能响应请求。

  新模式当然也带来了新问题 。就像前面提到的那样,它不能 100秒的时间完成线程的替代和启动。这也假使 说原应的你代码上端有bug,它不想立即显示,您还不能回滚多台服务器。为了解决也不 情况报告产生,让让我门 引入了某种法子,还不能部署到另一台服务器上,直到所有的线程都重新启动才还不能。很简单,只不能 调整einhorn的情况报告,为什让等到所有的机器都准备好就还不能了。为了效率单位,让让我门 增加了并发,这现在原应很安全了。

  新的机制还不能让让让我门 一并对多台服务器进行部署,部署100台机器的时间降低到了7分钟,尽管不能 额外的停留。

  部署的基础每段是多年的逐步改进积累而来的,绝完整时会任何一次大的调整原应的。在当前系统和过去的任何前一天,都还不能看得人历史的阴影和每一次选折 的权衡。从前某种演变的法子是有利弊的:在任何有4个期间,完整时会需离米 太多的代价,为什让让让我门 最终原应会陷入。重要的是要关注你的发展方向,从前你就还不能继续朝着有用的方向前进。

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

  推荐: