关于如何在一个永远在使用的网站上运行维护的任何想法?

我帮助在澳大利亚的一个大型游戏网站。 我们从当地时间上午7点到第二天凌晨1点,每周的每一天都进行比赛。 自该网站发布以来,我们一天都没有跳过。 当然,这使得维护非常困难,我们发现我们的临时服务器在我们的生产分支之前多达50次提交。 通常情况下,主开发人员必须非常早地合并分支机构,确保一切正常。

我们一直在试图使我们的中转站点与我们能够到达的生产站点类似,但是我们只能使其类似。

我们的网站是基于Laravel实时Node.JS服务器。 我们正在使用Laravel Forge。

有没有人有任何build议,我们如何推动更新更频繁? 我们对任何事情都开放。

有很多事情可以做,以改善您的部署过程。 其中一些是:

  • 确保你的代码已经过很好的testing

    理想情况下,您应该有100%的unit testing覆盖率,以及对每个可能的情况进行集成testing。

    如果你没有这个,你应该放弃一切,并得到这个照顾。

    研究行为驱动的发展。

    有一个完整的testing套件将允许您…

  • 运行持续集成。

    每当有人提交更改,CI就会自动运行testing套件。 如果testing套件通过,则可以立即进行部署(或者安排部署)。 对于不需要对数据库进行任何重大更改的更改,仅凭这一项就可以为您节省大量时间和头痛。

    如果出现问题,CI还可以给你一个单击回滚。

    如果你的testing套件不完整和正确,那么CI是非常有用的,因为整个前提是能够以自动方式validation你的代码。

  • 进行primefaces更新。

    理想情况下,您不应该在生产服务器上复制旧文件。 相反,使用capistrano这样的工具将每个文件复制到新的位置,然后使用符号链接指向所需的部署。 回滚是瞬间的,因为它涉及到简单地改变符号链接指向以前的部署。 (虽然这不一定涵盖您的数据库迁移。)

    还要看看Docker等容器是否可以帮助您。

  • 进行更小,更频繁的更改。

    无论你有testing,CI还是没有,只有这一点可以显着帮助你。 每个变化都应该有自己的git分支,部署应该尽可能less的变化。 由于更改较小,因此在部署期间可能会出错。

    在这个笔记上,尽可能地让变化更加孤立。 如果你已经改变了奥马哈游戏,并且不影响德州扑克,5卡牌或其他任何东西,那么这是唯一需要暂停维护的游戏。

  • 分析任何长时间运行。

    您提到了部署的一些部分需要很长时间。 这可能是数据库模式更改。 有一个DBA看看你的数据库,以及每个模式的变化,看看有什么更好的performance是非常值得的。

    让主题专家查看占用大量时间的部署的任何其他部分。

  • 几个小时工作。

    你可能已经在做这个了,但是它提到了。 不应期望开发人员(和系统pipe理员)能够“9到5”地工作,特别是对于全天候的操作。 如果有人需要花费整夜的时间来保留部署,修复任何问题,然后保持白天的时间表,那么你的期望是不现实的,并且你正在设置这个人的倦怠。

从你说的话看来,你每天从凌晨1点到早上7点有一个维修时间,问题不是时间,而是方便。 这是正常的,很多人只是把它作为业务的一部分来处理。

你可以有一个2(或更多的后端)系统,前端将stream量引导至当前正在运行的任何一个。 一旦你感到高兴的是一个发行版将会起作用,你可以告诉前端切换到新的系统。 这应该是一个简短的脚本需要很短的时间。

现在,您可以select退出旧系统,以便退出或使其保持最新状态,以便可以将其用作实时系统的备用,直到构build/testing下一个更新为止。

修改其他答案:您应该遵循蓝绿色的部署模型 。 当你想发布一个新版本的时候,你需要把它部署到一个内部的分段网站上。 然后,您可以在下一个版本的生产站点上运行自动化testing。 当testing通过时,您指向负载均衡器以使用新网站。

这有助于以下方面:

  1. 总是发现严重的问题,停机时间为零。
  2. 由于新版本已经启动并预热,切换到新版本的停机时间几乎为零。
  3. 您可以随时切换回旧版本,因为它仍在物理上运行。

当你和其他人提到的所有其他问题,你可以在任何时候以无压力的方式进行部署,就不那么严重了。 蓝绿色部署模式是部署问题的完整解决scheme。

如果您的主数据中心出现故障,您会怎么做? 您可能会接受停机时间,您可能会故障切换到另一个数据中心,您可能一直在多个数据中心中以主动 – 主动模式运行,也可能有其他计划。 无论是哪个版本,都可以在发布时执行,然后在发布期间将主数据中心closures。 如果您准备在数据中心停机的时候发生停机,那么您已经准备好了停机时间,所以在发布期间这不应该成为问题。

要添加到以前的答案:

  • 使用允许回滚和即时切换的部署策略,Capistrano或几乎任何其他部署系统都可以帮助解决这个问题。 您可以使用数据库快照和代码符号链接等function,以便能够快速恢复到以前的状态。

  • 使用完整的configurationpipe理,不要留下任何手动pipe理。 SaltStack,Ansible和Puppet等系统就是例子。 它们也可以应用于Docker容器configuration和stream浪箱。

  • 使用HA确保在升级节点时切换请求。 如果升级失败,只需简单地closures节点,并在回滚时将其恢复,HA解决scheme将会注意到并再次向所述节点推送请求。 HAProxy就是一个例子,但是nginx也可以正常工作。

  • 确保应用程序可以处理并发实例,将中央版本化数据存储库用于需要存储在磁盘上的非代码数据(如caching)。 这样,您将永远不会将已升级的应用程序运行到不同版本的caching文件中。 这将在清除caching和做caching热身之上完成。 (caching的东西只是一个例子)

我通常设置工作stream程,团队经理可以批准合并请求到一个特殊的分支,完成所有正常的CI工作,但是最后一步也是开始推送到生产节点。 你基本上做的是手动CI部署到生产实例。 如果该实例不会生成无效响应,中断或对您的数据产生奇怪的影响,则可以使用您的CI解决scheme大规模升级所有节点。 这样,如果一个部署工作,你知道所有的部署将工作的特定标签/提交。

现在,听起来好像您正在单个节点上运行生产应用程序,只有一个部署stream程,一个来源和一个目标。 这实际上意味着工作stream程中的每一步都是一个本身可以破坏网站的故障点。 确保这样的事情不可能发生是所有CI,HA和故障转移过程的基础。 不要只运行一个节点,不要只运行一个HA进程,不要只运行一个IP地址,不要只运行一个CDN等。这可能听起来很昂贵,但是重复你已经拥有的在具有自己的连接的服务器上的机架中,通常在商业站点上的停机时间不到一个小时。

我全世界都同意Michael的观点( https://serverfault.com/a/739449/309477 )。

在我看来,你应该做的第一个改进就是使用部署工具(Capistrano)。

它可以让你和平部署,然后立即切换到新版本。 如果出现任何问题,您可以立即切换回工作版本,只需将当前符号链接更改为正常工作版本即可。

和Capistrano相当快,首先处理(相比之下,开始使用testing和CI将是一个更大的时间投资)。

其次,如果钱不是你的主要问题,你应该有一个iso-prod开发服务器来testing你的应用程序,然后部署在生产环境中。 使用工业解决scheme(Ansible,Chef,Puppet)来pipe理VPS实例。