4

我目前正在运行一个带有多个部署槽(例如开发、登台、生产)的 web 应用程序。每个 Slot 都连接到一个数据库(db_dev、db_staging、db_production)。我想部署到暂存槽,然后切换到生产。数据库迁移如何适应这里?

我的意思是,如果我使用 db migrations 部署新版本来暂存 db_staging 会更新。如果我切换插槽会怎样?迁移是否应用于 db_production?停机时间怎么办?

据我了解,只有 URL 被切换,所以在切换后,暂存槽中的应用程序将指向 db_production?那没有意义。

我可以部署到暂存槽并指向 db_production(带有迁移),但随后数据库将被更新,并且可能会破坏实时槽中的应用程序。

4

2 回答 2

4

我也一直在思考这个问题,据我所知,唯一明智的过程如下:

  1. 停止 Prelive 站点
  2. 将实时数据库克隆回新的暂存数据库
  3. 运行脚本以确保数据安全(可能会联系真实用户的清晰信息等)
  4. 更改暂存槽粘性连接字符串以指向此数据库
  5. 运行 DBUP aganst staging DB(现在是 live-ish 的升级版)
  6. 部署到暂存槽
  7. 重新启动 prelive 站点
  8. 测试分期直到满意
  9. 备份实时数据库
  10. 针对实时运行 DBUP(如果它们是非破坏性更改,则站点可以保持正常运行)
  11. 交换直播和直播插槽
  12. 现场检查

如果您可以保持数据库更新不中断,那么回滚可以像交换插槽一样简单。如果没有,您又回到了熟悉的回滚脚本或恢复快照的痛苦中。

于 2017-06-03T18:38:27.707 回答
2

不要在源代码中对连接字符串进行硬编码,而是将它们放在应用服务设置的连接字符串部分下,并将其作为环境变量进行访问。它不仅更安全,因为它允许您在任何环境中只有一个代码,并且无论您是否交换,都可以将设置检查为“插槽设置”,对于该插槽,配置保持不变。

在此处输入图像描述

更多信息在这里:

https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/

更新

在数据库更新的情况下,即需要运行以更新新应用程序版本的数据库架构的必要脚本,您可以使用 web.config 的 applicationInitialization 部分。通常用于预热应用程序,但也适用于您的情况。

<system.webServer>  
  <applicationInitialization >  
    <add initializationPage="/init-script.php" hostName="xxxxxx.azurewebsites.net"/>  
  </applicationInitialization>  
<system.webServer> 

AppInit 模块将等到此代码完成,然后再完成交换过程,这基本上允许应用程序的生产流量。基本逻辑将检查数据库是否正在运行预期的版本,如果不是,则将按顺序执行其他一些逻辑。

于 2016-07-28T13:46:51.100 回答