当您对实时网站进行更改时,您如何检查 居住 系统工作正常吗?您使用哪些工具?谁做的?您是否在测试期间阻止对该网站的访问?可接受的停机时间是多少?

有帮助吗?

解决方案

我倾向于在另一个环境中进行所有测试(而不是实时环境!)。这使我能够将更新推送到实时站点,因为我知道代码应该可以正常工作,并且我只需对实时数据进行健全性测试 - 确保我没有忘记某个文件,或者出现一些奇怪的问题。

因此,在测试或登台环境中进行适当的测试,然后进行简单的健全性检查。无需停机。

其他提示

已经有很多好的建议了。

正如人们所提到的,如果您不涉及单点,那么通过一次升级应用程序服务器来分阶段进行更改很简单。但这种情况很少发生,所以让我们忽略这一点,专注于困难的部分。

通常那里有一个与其他所有东西通用的数据库。这意味着整个系统将停机。 你如何最大限度地减少这种情况?

自动化. 。编写整个部署过程的脚本。这(特别是)包括任何数据库模式更改。这(特别是)包括架构版本之间所需的任何数据迁移。

质量控制. 。确保有测试。自动验收测试(用户从业务逻辑/体验角度看到和期望的内容)。考虑在生产系统中设置测试帐户,您可以编写脚本来测试只读活动。如果您不与其他外部系统交互,也可以考虑进行写入活动。您可能需要过滤掉系统某些部分的测试帐户活动,特别是当它们涉及金钱和会计时。当豆子不匹配时,统计豆子的人就会感到不安,这是有充分理由的。

排练. 。在与生产尽可能相同的临时环境中进行部署。使用生产数据量和生产数据来执行此操作。您需要感受更改表需要多长时间。您需要检查更改表在结构上以及实际数据中的所有外键是否有效。

如果您有大量数据,架构更改将需要时间。也许比你承受得起的时间还要长。一种解决方案是使用 分阶段数据迁移, ,以便在停机期间用“最近”或“当前”(假设一到三个月前)的数据填充架构更改,并且在您再次上线后,剩余五年的数据可以慢慢流入。对于最终用户来说,一切看起来都不错,但有些功能在几个小时/几天/之后都无法访问。

在工作中,我们花了一段时间将代码冻结在测试环境中。然后,经过几周的通知后,我们在周五晚上的午夜关闭了该网站,通宵进行部署和验证,并在周六早上将其上线。流量统计数据告诉我们这是执行此操作的最佳时间范围。

如果你有一组负载均衡的服务器,你就可以单独一台一台离线并更新。用户无需停机!

有一个可爱的、令人放松的图像和/或备份页面。有些网站实现了简单的 JavaScript 游戏,让您在等待更新时保持忙碌。

例如,失败的鲸鱼。

-亚当

在我工作的最后一个地方,QA 会在 QA 环境中执行测试。任何重大问题都将在推出之前得到修复、测试和验证。

构建经过 QA 认证后,生产支持团队将代码推送到暂存环境,客户在暂存环境中查看站点并验证一切是否符合预期。

实际的生产部署发生在下班时间(晚上 9 点之后)。如果是紧急夜间推送,或者从凌晨 5 点开始- 上午 8 点如果是正常计划的推出)。

该站点托管在多个服务器上,这些服务器使用 F5 负载均衡器进行负载平衡:

  • 一些服务器已从生产中删除,
  • 代码已安装,并且
  • 在将服务器放回池中之前,会对服务器执行粗略检查。

重复此操作,直到所有服务器都升级到最新代码并允许站点始终保持正常运行。

这个过程是理想的,但在某些情况下数据库也需要升级。如果是这种情况,那么有两种选择,具体取决于新数据库是否会破坏站点。

如果新数据库与现有前端不兼容,您别无选择,只能在一段时间内关闭站点。

但是如果新的数据库与现有的前端兼容,您仍然可以将代码推出而无需任何实际停机,但这需要有两个生产数据库服务器。

  • 所有流量都路由到第二个数据库,并拉动第一个数据库服务器。
  • 第一个数据库已升级,验证完成后,重新投入生产。
  • 所有流量都路由到第一个数据库,然后拉出第二个数据库。
  • 第二个数据库已升级并在验证完成后重新投入生产。
  • 下一步是如上所述执行部分升级。

总结一下:

  • 当您对实时网站进行更改时,如何检查实时系统是否正常工作? 在最好的情况下,这是逐步完成的。

  • 您使用哪些工具? 使用任何自动化工具进行手动检查以验证代码是否正确安装以及一些基本的自动化测试。我们使用 Selenium IDE。

  • 谁做的? DBA 执行数据库升级,技术支持/系统管理员推/拉服务器并安装代码,QA 或生产支持执行手动测试和/或运行自动测试。

  • 您是否在测试期间阻止对该网站的访问? 如果可能的话,应该不惜一切代价避免这种情况,特别是正如吉尔斯之前提到的,如果它是付费网站。

  • 可接受的停机时间是多少? 停机时间应限制在用户最不可能使用站点的时间,并且应在 3 小时内完成。
    笔记: 3个小时已经很充裕了。在练习和排练之后,就像杰普林德斯特罗姆提到的那样,团队将完成整个过程,有时不到一个小时就可以进出。

希望这可以帮助!

其中一些取决于您是否也更新数据库。过去,如果数据库正在更新,我们会在计划的(和发布的)维护期内关闭该站点 - 通常是在非工作时间进行,影响最小。如果更新不涉及数据库,那么在负载平衡的环境中,我们将从混合中取出 1 个盒子,进行部署和测试。如果成功,它就会进入混合状态,另一个盒子(假设有 2 个盒子)会被拿出来并更新/测试。

笔记:我们没有测试代码,只是部署顺利,因此任何方式的停机时间都很短。正如已经提到的,代码应该已经在另一个环境中通过了测试。

恕我直言,对于免费网站来说,较长的停机时间(小时)是可以接受的。如果您对用户进行足够的教育,他们就会明白这是必要的。也许给他们一些东西可以玩,直到网站恢复(例如。Flash 游戏、显示开发团队工作情况的网络摄像头实时直播等)。对于一个人们付费访问的网站,如果你让他们定期停机,很多人会浪费你的时间进行投诉。如果我运行的是向用户收费的服务,我会避免像瘟疫一样的停机,并非常缓慢而小心地推出更新。

在我当前的设置中,我有一个辅助网站连接到与实时副本相同的数据库和缓存来测试我的更改。

我还有几个在 cron 作业上运行的“页面观察器”脚本,这些脚本使用正则表达式来检查网站是否正确呈现关键页面。

答案是“这取决于”。首先,关于您要发布到的环境类型。是位于某处共享主机上的“你好,世界”类型的网站,还是拥有 50 万台服务器的 google.com?通常每天有一个用户,或者更多的是几百万个用户?您是否正在发布 HTML/CSS/JPG,或者是否有一个带有 SQL 服务器、中间层服务器、分布式缓存等的大型后端?

一般来说,如果您有能力拥有单独的开发、质量保证、登台和生产环境,那么确实有这些环境。如果您有资源 - 创建生态系统,以便您可以通过一(一)次点击构建完整的可安装包。并确保 相同 再次单击即可在 DEV/QA/STAGE/PROD 中成功安装二进制安装...关于这个主题的文章有很多,你需要更具体地回答你的问题才能得到合理的答案

在 80 以外的端口上运行主服务器。坚持使用轻量级服务器(例如nginx)位于其前面的端口 80 上。当您更新站点时,在新端口上启动另一个实例。测试。当您对已正确部署感到满意时,编辑代理配置文件并重新启动它。就 nginx 而言,这会导致零停机或失败请求,并且还可以比更典型的仅 Apache 托管选项提供性能改进。

当然,这并不能替代适当的临时服务器,它只是用有限资源执行切换的一种“礼貌”方式。

要在上线之前在单独的开发站点上进行所有测试,我使用Selenium(一个网页测试器)在网站的所有可通航部分中运行,请将虚拟值填充到表单中,请检查这些值是否出现在右侧因此,位置,等等。

它也足够强大,可以检查许多JavaScript或动态内容。

然后,在升级实时站点后,再次与Selenium进行快速直通,验证了更新是否有效,并且没有丢失的链接或数据库错误。

通过抓住微妙的错误,我会错过的只是手动轻弹,从而为我节省了几次。

另外,如果将实时站点放在某种“反向代理”或负载平衡器(如果很大)后面,则可以在有问题的情况下轻松切换回上一个版本。

使其对用户透明的唯一方法是将其置于负载平衡代理后面。您在更新另一台服务器时关闭一台服务器。然后,当您完成更新后,您将更新的一个放在网上,然后将另一个取下来。我们就是这样做的。

如果您有任何类型的“测试版”版本,请不要将其推出到实时服务器上。如果您有一个“活跃、繁忙的网站”,人们很可能会对其进行攻击并破坏某些内容。

这是典型的高可用性设置,为了保持高可用性,您至少需要 3 台服务器。2 个实时服务器和 1 个测试服务器。如果您想要一个专用的数据库或其他东西,请加上任何其他额外的服务器。

创建一个主机类并在该主机类上部署您的实时站点。我所说的主机类是指设置了负载平衡的一组主机,并且可以轻松地在该类中添加和删除主机。

当您完成 Beta 测试并准备好进行生产时,无需关闭您的站点,只需从生产主机类中删除一些主机,将它们添加到新主机类中并在那里部署最新的代码并正确测试。一旦您确定一切正常,请将所有主机逐渐移至新主机,并将新主机类指定为生产主机类。或者您可以使用最初使用的相同内容,此活动背后的整个想法是确保您在生产环境中测试您的部署,部署后您的站点将在生产环境中运行,因为部署问题非常可怕且难以调试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top