关于如何在始终处于使用状态的站点上进行维护的任何想法?

che*_*505 18 maintenance php node.js

我在澳大利亚的一家大型游戏网站上帮忙。我们从当地时间早上 7 点到第二天凌晨 1 点举办比赛,每周的每一天。自从网站发布以来,我们一天也没有跳过。自然,这使得维护非常难以运行,我们发现我们的临时服务器在我们的生产分支之前最多提交 50 次。通常,主开发人员必须极早醒来以合并分支并确保一切正常。

我们一直在努力使我们的临时站点与生产站点尽可能相似,但我们只能使其如此相似。

我们的网站基于 Laravel,带有一个实时的 Node.JS 服务器。我们正在使用 Laravel Forge。

有人对我们如何更频繁地推送更新有任何建议吗?我们对任何事情都持开放态度。

Mic*_*ton 22

您可以做很多事情来改进部署过程。其中一些是:

  • 确保您的代码经过良好测试。

    理想情况下,您应该拥有 100% 的单元测试覆盖率,以及针对每个可能的场景进行集成测试。

    如果你还没有得到这个,你可能应该放下所有的东西并得到它的照顾。

    研究行为驱动的开发。

    拥有完整的测试套件将使您能够...

  • 运行持续集成。

    每当有人提交更改时,CI 就可以自动在其上运行测试套件。如果测试套件通过,则可以立即部署(或安排部署)。对于不需要对数据库进行任何重大更改的更改,仅此一项即可为您节省大量时间和麻烦。

    万一出现问题,CI 也可以给你一键回滚。

    CI是很多有用的更少,如果您的测试套件是不完整的,正确的,因为整个前提下休止符上能够验证您的代码以自动方式。

  • 进行原子更新。

    理想情况下,您不应该只是将新文件复制到生产服务器上的旧文件上。相反,请使用诸如 capistrano 之类的工具,它将每个文件复制到一个新位置,然后使用符号链接指向所需的部署。回滚是即时的,因为它只需更改符号链接以指向先前的部署。(虽然这不一定涵盖您的数据库迁移。)

    还要看看 Docker 之类的容器是否可以帮助你。

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

    无论您有测试、CI 还是什么都没有,仅此一项就可以显着帮助您。每个更改都应该有自己的 git 分支,并且部署应该有尽可能少的更改。由于更改较小,因此在部署期间可能出错的可能性较小。

    在这一点上,尽可能使更改更加独立。如果您对奥马哈游戏进行了更改,并且它不影响德州扑克、5 张牌梭哈或其他任何游戏,那么这是唯一需要暂停维护的游戏。

  • 分析任何长期运行的东西。

    您提到部署的某些部分需要很长时间。这可能是数据库架构更改。非常值得让 DBA 查看您的数据库以及每个架构更改,以了解哪些方面可以做得更好。

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

  • 工作零时。

    您可能已经这样做了,但值得一提。不应再期望开发人员(和系统管理员!)“朝九晚五”工作,尤其是对于 24x7 的操作。如果有人希望有人整夜照看部署,解决任何问题,然后保持白天的时间表,那么您的期望是不切实际的,并且您正在为这个人设置倦怠。


use*_*517 6

从你所说的来看,你每天早上 1 点到 7 点都有一个维护窗口,问题不是时间而是方便。这是正常现象,许多人只是将其作为业务的一部分来处理。

您可以有 2 个(或更多后端)系统,其前端可将流量引导至当前处于活动状态的任何一个。一旦您对发布的工作感到高兴,您就告诉前端切换到新系统。这应该很容易编写脚本,需要很短的时间。

现在您可以选择保留旧系统,以便您可以退出或更新它,以便在构建/测试下一次更新之前将其用作实时系统的备用系统。

  • 只是接受连接并将它们传送到当前主要后端的东西。 (2认同)

usr*_*usr 5

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

这有助于以下方式:

  1. 始终可以在零停机时间的情况下发现严重问题。
  2. 切换到新版本的停机时间完全为零,因为新版本已经启动并预热。
  3. 您可以随时切换回旧版本,因为它仍在物理运行中。

当您可以随时以无压力的方式进行部署时,您和其他人提到的所有其他问题都会变得不那么严重。蓝绿部署模型是一个非常完整的部署问题解决方案。