我正在尝试实现零停机时间部署,因此在理论上,我可以在下班时间减少部署,而在“更慢”的时间内部署更多。
我当前的设置,有些简化:
- Web服务器A(.NET App)
- Web服务器B(.NET App)
- 数据库服务器(SQL Server)
我当前的部署过程:
- “停止” Web服务器A和B上的站点
- 升级数据库架构以获取正在部署的应用程序的版本
- 更新Web服务器A
- 更新Web服务器B
- 将所有内容恢复在线
当前问题
每月导致少量的停机时间-大约30分钟。我在下班时间这样做,所以这不是一个大问题-但这是我想摆脱的事情。
另外-没有办法真正退缩。我通常不制作回滚DB脚本-仅升级脚本。
利用负载均衡器
我希望能够一次升级一台Web服务器。从负载均衡器中取出Web服务器A,对其进行升级,使其重新联机,然后对Web服务器B重复上述步骤。
问题是数据库。我的软件的每个版本都需要针对不同版本的数据库执行-所以我有点“卡住了”。
可能的解决方案
我正在考虑的当前解决方案采用以下规则:
- 切勿删除数据库表。
- 永远不要删除数据库列。
- 切勿重命名数据库列。
- 切勿重新排列列。
- 每个存储过程都必须进行版本控制。
- 含义-编辑后,“ spFindAllThings”将变为“ spFindAllThings_2”。
- 然后在再次编辑时变成“ spFindAllThings_3”。
- 相同的规则适用于视图。
虽然,这似乎有点极端-我认为它可以解决问题。该应用程序的每个版本都将以不间断的方式访问数据库。该代码期望视图/存储过程产生某些结果-并使该“合同”有效。问题是-它只是马虎了。我知道我可以在应用程序部署一段时间后清理旧的存储过程,但是感觉很脏。另外-这取决于所有遵循这些规则的开发人员,这大部分都会发生,但是我想有人会犯错。
最后-我的问题
- 这是草率的还是朴拙的?
- 还有其他人这样做吗?
- 其他人如何解决这个问题?