在我的公司,我们有一个用c#编写的系统,并使用sql server db。 每当我们想要将代码更改上传到生产环境时,我们都会使系统脱机几个小时。 我想知道是否有办法在不关闭系统的情况下做到这一点。
大公司在做什么?我无法想象Amazon.com在更改代码或数据库时会离线3个小时。
感谢。
答案 0 :(得分:3)
首先回答您关于亚马逊/谷歌等公司的观点;他们有不止一个生产环境!
想象一下(简化的想法),您有10个生产Web服务器(每个服务器位于同一级别,相同的编译代码库等),以及您的集群数据库解决方案(非常简化的想法)。在当天的某些时刻,您只需要4台网络服务器(也许在欧洲睡着的时候)。因此,您将它们逐个删除(负载均衡器将流量重定向到其他人)并执行升级以使其保持脱机状态。与此同时,您在许多数据库笔记上执行数据库更新(它们处于脱机状态)。一旦你有足够的升级服务器/节点再次使网站上线,你就可以关闭你的公共网站(像亚马逊那样友好的消息);允许数据库与任何已更改的数据同步,并使用新升级的服务器/节点将其全部备份。然后,这允许您升级左侧服务器/节点,并在它们准备好时将它们添加到“实时池”。这使您可以花时间进行升级,但停机时间最短。
回到现实世界
不了解您的业务性质(无论是面向客户的24小时,还是周一至周五的9-5)。我公司的标准(一个伪24h公司,也就是我们在w / e上打开并且晚上有骨架远程工作人员)是准备好在编译状态下运行的代码以及脚本化的任何数据库更改。相关系统将在晚上离线(在用户被通知之后)并且通过编译复制更新。然后进行数据库更改。通常是在星期五,因为这会在星期六开始播放前的晚上/早上解决任何问题。
如果您愿意,没有什么可以阻止您自动执行此复制/执行/跳出应用程序池例程。
答案 1 :(得分:1)
确实有所不同。
有一些关于一些大玩家的好文章。乙
我工作的地方(红门)我们使用自己的工具之一(Deployment Manager)来部署Web应用程序和支持数据库。如果你想尝试一下,它可以免费用于5个项目和服务器。
它在引擎盖下使用的机制旨在减少停机时间。
适用于网络应用程序。它打包最新版本的应用程序并将其复制到每个Web服务器上的新文件夹中。然后,它重新配置IIS以将现有网站配置指向新目录。这意味着切换非常快,并最大限度地减少停机时间。您可以添加在部署之前或之后运行的PowerShell脚本,以进一步自定义部署。例如,@ jamesakadamingo提到您可以使用这些来删除然后从负载均衡器重新添加计算机,或者建立一个临时维护页面。
通过在当前模式和原有模式之间生成差异来处理数据库部署。但是,当用户想要在工作流中进行数据库部署时,这取决于用户。我们通常遵循在应用程序代码之前发布数据库更改的方法,因为通常“旧”代码将针对“新”数据库运行。如果不是这种情况,那么我们使用抽象方法,在更改数据库之前将启动代码版本。将编写此版本以处理旧数据库和新数据库。然后我们将部署数据库,稍后我们仍然会再次部署应用程序代码以删除旧应用程序中不再需要的任何代码。
本书中有一些关于自动化部署和最小化停机时间的建议。 Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation by Jez Humble and David Farley