繁体   English   中英

部署 Azure Web 应用程序时最小化停机时间的最佳实践

[英]Best practice for minimizing downtime when deploying Azure Web Apps

我有一个应用服务计划,在这个计划中,我将解决方案的 5 个组件部署为 Web 应用程序。 我在 Azure DevOps 中使用“发布管理”将代码部署到这些应用程序。

为了最大限度地减少部署期间的停机时间,我先部署到暂存槽,然后将暂存槽换成生产槽以完成部署。

我已配置应用服务预热(详见此处)以调用一个端点,该端点将在插槽交换过程中“预热”应用程序。

这似乎有效,但我有两个问题:

  1. 即使预热已经运行,在插槽交换后向应用程序发出的第一个请求也需要很长时间。 我怀疑这是由于生产插槽具有“粘性/插槽设置”,据我所知,这需要重新启动应用程序。 为了测试这一点,我删除了插槽设置,但延迟仍然存在。

  2. 应用程序相互依赖,并且插槽交换(即使在 Azure DevOps 中并行启动)不能保证同时完成,这意味着新代码可能与旧代码交互。 虽然我们可以围绕这个进行设计,但这并不是最优的。

从我目前的调查来看,我能想到的解决这些问题的唯一方法是启动第二个应用服务计划,并将流量管理器配置为位于这两个服务计划的前面。 部署时,我会优先考虑其中一个服务计划,同时部署到另一个服务计划,一旦完成,将流量转移到新部署的服务计划,同时升级另一个服务计划,然后在两者都完成后再次平衡两者之间的流量在相同的代码级别。

在 Azure 中使用 WebApps 时,当前零停机部署的“最佳实践”是什么?

使用流量管理器的重复服务计划是一个可行的选择吗?如果不是,您有什么建议?

遵循这些更多的最佳实践建议。

根据状态码交换

在交换操作期间,暂存槽中的站点通过向其根目录发出 HTTP 请求来预热。 有关该过程的更详细说明,请参阅如何在部署插槽交换期间预热 Azure Web 应用程序

默认情况下,只要站点以任何状态代码响应,交换就会继续进行。 但是,如果您希望在应用程序无法预热时不继续进行交换,则可以使用以下应用程序设置对其进行配置:

  • WEBSITE_SWAP_WARMUP_PING_PATH:发出预热请求的路径。 将此设置为以斜杠作为值开头的 URL 路径。 例如,“/warmup.php”。 默认值为 /。

  • WEBSITE_SWAP_WARMUP_PING_STATUSES:预热操作的预期 HTTP 响应代码。 将此设置为以逗号分隔的 HTTP 状态代码列表。 例如:“200,202”。 如果返回的状态码不在列表中,则交换操作不会完成。 默认情况下,所有响应代码都有效。

尽量减少随机冷启动

  • WEBSITE_ADD_SITENAME_BINDINGS_IN_APPHOST_CONFIG:将此设置为“1”将阻止 web 应用程序的工作进程和应用程序域在应用程序服务的存储基础架构重新配置时回收。

https://ruslany.net/2019/06/azure-app-service-deployment-slots-tips-and-tricks/#prevent-cold-start

控制槽粘性配置

但是,如果出于任何原因您需要恢复到交换这些设置的旧行为,则可以将应用程序设置 WEBSITE_OVERRIDE_PRESERVE_DEFAULT_STICKY_SLOT_SETTINGS 添加到应用程序的每个插槽并将其值设置为“0”或“false”。

https://ruslany.net/2019/06/azure-app-service-deployment-slots-tips-and-tricks/#slot-sticky-config

我建议将本地缓存部署槽结合使用,以防止任何停机。

将值为 Always 的粘性应用设置WEBSITE_LOCAL_CACHE_OPTION添加到您的Production slot 如果您使用的是WEBSITE_LOCAL_CACHE_SIZEINMB ,请将其作为粘性设置添加到您的Production slot

• 创建一个暂存槽并发布到您的暂存槽。 如果您获得生产槽的本地缓存的好处,您通常不会将暂存槽设置为使用本地缓存来为暂存启用无缝的构建-部署-测试生命周期。

• 根据您的暂存槽测试您的站点。

• 准备好后,在暂存槽和生产槽之间发出交换操作

• 粘性设置包括名称和对插槽的粘性。 因此,当Staging 插槽被交换到Production时,它会继承 Local Cache 应用程序设置 新交换的生产槽将在几分钟后针对本地缓存运行,并将作为交换后槽预热的一部分进行预热。 因此,当插槽交换完成时,您的生产插槽将针对本地缓存运行

请参阅 Azure 最佳实践文档:

https://docs.microsoft.com/en-us/azure/app-service/deploy-best-practices

https://docs.microsoft.com/en-us/azure/app-service/overview-local-cache

在加热站点之前,我使用了“预览交换”功能。

交换槽的主要问题是交换时工作进程会重新启动。 这意味着需要重新加热这些站点。

当您将 Swap 与 Preview 一起使用时,工作进程会重新启动,但交换不会完成,这意味着您可以相应地预热站点。 一旦您对测试和性能感到满意,您只需“完成交换”,站点就会做出相同的响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM