如何在更新数据库和应用程序 ORM 时最小化应用程序停机时间
Posted
技术标签:
【中文标题】如何在更新数据库和应用程序 ORM 时最小化应用程序停机时间【英文标题】:how to minimize application downtime when updating database and application ORM 【发布时间】:2010-05-12 22:28:58 【问题描述】:我们目前为一家休闲和旅游公司运行电子商务解决方案。每次发布时,我们必须在更新数据库架构和数据访问代码时关闭电子商务网站。我们正在使用自定义构建的 ORM,其中每个数据实体负责自己的 CRUD 操作。这是通过根据数据实体中的属性动态生成 SQL 来实现的。
例如,地址的数据实体将是...
[tableName="address"]
public class address : dataEntity
[column="address1"]
public string address1;
[column="city"]
public string city;
所以,如果我们向数据库中添加一个新列,我们必须更新数据库的架构并更新数据实体。
正如您所料,业务人员对这次停电不太满意,因为这会限制他们的现金流。操作人员很不高兴,因为他们必须应对数据库和应用程序升级的高压时间。程序员们很沮丧,因为他们不断地为他们继承的遗留系统陷入困境。
各位聪明人有什么建议吗?
【问题讨论】:
【参考方案1】:第一个答案显然是,不要使用 ORM。只有应用程序程序员认为他们很好。像其他人一样学习 SQL :)
好的,回到现实。是什么阻止您将所有架构更改限制为仅添加。然后,您可以随时更新数据库模式,并且只安装重新编译的应用程序,直到数据库更新后的安全时间(我发现早上 6 点最好)。如果您必须删除一些东西,请以相反的方式执行这些步骤 - 安装新应用程序,保持架构不变,然后从架构中删除这些位。
在推出更改时,您总是会遇到高压,但至少您可以通过 2 个更易于理解的部分来更好地管理它。您的 DBA 可以更新现有应用程序的架构。
缺点是您必须更有条理,但这在与生产服务器打交道时并不是一件坏事,您目前应该认真组织。
【讨论】:
我强烈反对这一点。 解决方案与您的解决方案没有什么不同,只是我说在应用程序中运行之前在数据库中运行的时间会稍长一些。顺便说一句,我在 911 呼叫中心工作,我们根本不能有停机时间。我们拆分容错对,更新数据库,更新应用程序,然后将正在运行的系统故障转移到更新后的系统。如果我们必须撤消我们的应用程序,切换回旧应用程序会容易得多,同时保持新的数据库模式。当然,ORM 让这变得越来越困难,但这更多是我们必须处理的实施问题。 像其他任何事情一样,为正确的工作使用正确的工具...例如“示例”...阅读重度产品可以使用大多数 ORM 中提供的第一级和第二级缓存功能,并避免拨打电话到永远不会产生新答案的数据库。另一方面,写入繁重的应用程序可能会发现将写入(尤其是复杂的写入)卸载到数据库更有意义。【参考方案2】:支持此方案将大大增加您的环境和/或流程和/或应用程序的复杂性。
您可以运行复杂的更新过程,您的应用程序代码足够智能,可以同时在旧架构和新架构上正确运行。然后,您可以先更新应用程序,然后再更新架构。第三步可能是迁移任何数据,同样,应用程序必须能够使用这些数据。在这种情况下,您只需在升级应用程序所需的时间内“删除”应用程序,这可能只需几秒钟,具体取决于升级涉及的文件和机器数量。
在大多数情况下,最好让应用程序/环境/流程保持简单,并在一天/一周/一个月的缓慢时间与市中心一起生活。几乎所有应用程序都需要不时“关闭”以“定期安排维护”。
【讨论】:
以上是关于如何在更新数据库和应用程序 ORM 时最小化应用程序停机时间的主要内容,如果未能解决你的问题,请参考以下文章
轻量ORM-SqlRepoEx MySQLSql Service 迁移
如何在不使用Eloquent ORM时构建Laravel应用程序