带有数据库迁移的 Azure Web App 部署槽
Azure Web App deployment slots with database migration
我目前 运行 是一个具有多个部署槽(例如开发、暂存、生产)的 webApp。每个 Slot 都连接到一个数据库(db_dev、db_staging、db_production)。我想部署到暂存槽,然后切换到生产环境。数据库迁移如何适应这里?
我的意思是,如果我部署一个带有数据库迁移的新版本来暂存 db_staging 得到更新。如果我切换插槽会怎样?迁移是否应用于 db_production?停机时间怎么办?
根据我的理解,只有 URL 发生了切换,因此在切换后暂存槽中的应用程序将指向 db_production?这没有意义。
我可以部署到暂存槽并指向 db_production(通过迁移),但随后数据库会更新并且可能会破坏实时槽中的应用程序。
不要在源代码中对连接字符串进行硬编码,而是将它们放在应用服务设置的连接字符串部分下,并将其作为环境变量访问。它不仅更安全,因为它允许您在任何环境下都只有一个代码,并且无论您是否交换,都将设置检查为 "slot setting",对于该插槽,配置保持不变。
更多信息在这里:
https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/
更新:
在数据库更新的情况下,即需要 运行 才能更新新应用版本的数据库架构的必要脚本,您可以使用 [=30] 的 applicationInitialization 部分=].通常用于预热应用程序,但也适用于您的情况。
<system.webServer>
<applicationInitialization >
<add initializationPage="/init-script.php" hostName="xxxxxx.azurewebsites.net"/>
</applicationInitialization>
<system.webServer>
AppInit 模块将等待此代码完成,然后再完成交换过程,这基本上允许应用程序的生产流量。基本逻辑是检查数据库是否 运行ning 预期版本,如果不是,将按顺序执行其他一些逻辑。
我也一直在琢磨这个问题,据我所知唯一合理的流程如下:
- 停止 Prelive 站点
- 将实时数据库克隆回新的登台数据库
- 运行 确保数据安全的脚本(可能会联系真实用户等的明确信息)
- 更改暂存槽粘性连接字符串以指向此数据库
- 运行 DBUP aganst staging DB(现在是live-ish的升级版)
- 部署到暂存槽
- 重启预发布网站
- 测试分期直到满意为止
- 备份实时数据库
- 运行 DBUP 对抗实时(如果它们是非破坏性更改,站点可以
熬夜)
- 交换直播和预直播时段
- 查看直播
如果您可以保持数据库更新不间断,那么回滚就可以像交换插槽一样简单。否则,您将回到熟悉的回滚脚本或恢复快照的痛苦中。
我目前 运行 是一个具有多个部署槽(例如开发、暂存、生产)的 webApp。每个 Slot 都连接到一个数据库(db_dev、db_staging、db_production)。我想部署到暂存槽,然后切换到生产环境。数据库迁移如何适应这里?
我的意思是,如果我部署一个带有数据库迁移的新版本来暂存 db_staging 得到更新。如果我切换插槽会怎样?迁移是否应用于 db_production?停机时间怎么办?
根据我的理解,只有 URL 发生了切换,因此在切换后暂存槽中的应用程序将指向 db_production?这没有意义。
我可以部署到暂存槽并指向 db_production(通过迁移),但随后数据库会更新并且可能会破坏实时槽中的应用程序。
不要在源代码中对连接字符串进行硬编码,而是将它们放在应用服务设置的连接字符串部分下,并将其作为环境变量访问。它不仅更安全,因为它允许您在任何环境下都只有一个代码,并且无论您是否交换,都将设置检查为 "slot setting",对于该插槽,配置保持不变。
更多信息在这里:
https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/
更新:
在数据库更新的情况下,即需要 运行 才能更新新应用版本的数据库架构的必要脚本,您可以使用 [=30] 的 applicationInitialization 部分=].通常用于预热应用程序,但也适用于您的情况。
<system.webServer>
<applicationInitialization >
<add initializationPage="/init-script.php" hostName="xxxxxx.azurewebsites.net"/>
</applicationInitialization>
<system.webServer>
AppInit 模块将等待此代码完成,然后再完成交换过程,这基本上允许应用程序的生产流量。基本逻辑是检查数据库是否 运行ning 预期版本,如果不是,将按顺序执行其他一些逻辑。
我也一直在琢磨这个问题,据我所知唯一合理的流程如下:
- 停止 Prelive 站点
- 将实时数据库克隆回新的登台数据库
- 运行 确保数据安全的脚本(可能会联系真实用户等的明确信息)
- 更改暂存槽粘性连接字符串以指向此数据库
- 运行 DBUP aganst staging DB(现在是live-ish的升级版)
- 部署到暂存槽
- 重启预发布网站
- 测试分期直到满意为止
- 备份实时数据库
- 运行 DBUP 对抗实时(如果它们是非破坏性更改,站点可以 熬夜)
- 交换直播和预直播时段
- 查看直播
如果您可以保持数据库更新不间断,那么回滚就可以像交换插槽一样简单。否则,您将回到熟悉的回滚脚本或恢复快照的痛苦中。