关系数据库模型由英国计算机科学家 Edgar Frank Codd 于 1070 年在 IBM 工作时首次提出,并已在商业上部署了四十多年。在今天继续发展的软件开发中,这是一项罕见的成就。关系型数据库通常用作当今世界上最小到最大的应用程序和产品的后端。虽然关系数据库已针对速度、并发性、延迟和整体性能进行了优化,但它们尚未适应大规模管理元数据更改。具体来说,许多组织在部署架构更改时努力保持开发速度、敏捷性和信心。
历史
过去,开发人员会提前几个月计划模式更改,并与数据库管理员(DBA)协作以批准和协调向新模型的过渡。为了应用这些更改,系统将被关闭数小时或数天进行维护。考虑到它所花费的复杂性和时间,团队每年只会交付少量更改。
当前形势
如今,这些维护窗口根本无法接受,因为用户希望服务在零停机时间的情况下持续可用。此外,今天的开发人员习惯于加速部署流程,并希望连续部署架构更改,有时每天多次。
但是关系数据库并没有加紧满足开发人员的需求。架构更改对持续部署构成了操作障碍,并且与开发人员的工作流程无关。他们发展模式以尝试和最小化模式迁移,或者通过以次优方式修改代码来完全避免它们。因此,大型表的架构部署通常仍然是手动操作,并且被认为是有风险的操作。
我相信关系数据库能够而且应该满足模式部署的现代开发实践,从而实现更多的自动化、控制和速度,从而在流程中灌输信心。
建议范式
我相信以下核心原则对于模式迁移至关重要。
非阻塞
一些关系数据库,以及某些类型的模式迁移,在迁移的表上放置一个写锁,从而有效地使应用程序无法访问它。反过来,这通常表现为中断情况。大型表的 ALTER TABLE 迁移可以用几小时甚至几天来衡量。这些阻塞迁移对于现代开发流程和应用程序来说是不可接受的,并且数据库必须提供非阻塞迁移,以允许在整个操作过程中完全访问迁移的表。
轻量级
架构更改应该能够满足应用程序的需求。即使可用,非阻塞模式更改通常也会消耗资源,并且会尝试利用尽可能多的磁盘 IO 操作、内存和 CPU 来运行完成。这会与应用程序所需的资源竞争,并经常导致应用程序性能下降。
异步
数据库应该能够接收模式更改请求并以异步方式运行它。原子或事务性迁移受到赞赏,但它们意味着连接在迁移持续时间内保持活动状态,以小时或天为单位。不应要求部署工具或脚本长时间保持这些连接。连接丢失时的行为通常不是开发人员想要的。
可调度
由于在同一张表上运行或仅仅因为产生过多的资源消耗,迁移可能会相互冲突。数据库应该提供一种调度迁移的机制。数据库应该确定哪些迁移可以安全地并发运行,哪些不是。
可中断
即使是轻量级迁移,迁移仍然会影响磁盘空间和磁盘 I/O 操作。应该可以免费中断正在运行的迁移。在最需要资源的时候,回滚或刷新页面是不希望发生的费用的示例。
可追踪
数据库应该能够提供对长期迁移进度或 ETA 的估计。
无关故障
数据库应该能够恢复由于数据库故障而中断的迁移。例如,操作员应该可以在不影响长达数天的迁移的情况下重新启动数据库服务器。运营商不应该因为开发者的部署而推迟维护工作,开发者也不应该拒绝部署。
如果数据库提供多节点设计,则迁移应该与跨节点故障转移无关,并且不应绑定到它们开始的特定节点。
可恢复
架构迁移应被视为一流的部署。因此,数据库系统应该能够取消部署迁移,从而恢复迁移前的模式。开发人员应该确信,如果模式部署出错,他们可以将其还原并返回到已知的良好状态。
可重新部署
就像代码部署一样,模式部署应该是幂等的。开发人员或部署系统应该能够连续两次(或更多)提交相同的迁移请求,并且数据库应该解决过多的请求以确保迁移运行一次,正如开发人员所期望的那样。
数据库应该潜在地支持声明性模式部署,其中开发人员提交所需的状态而不是命令式命令。声明式模式部署本质上是幂等的。
总结
有了这些概述的原则,开发人员将确信他们的模式迁移不会给生产服务器带来大量负载。它还将向他们保证,他们的部署工具在运行更改时不必将数据库阻塞数小时。他们知道数据库将在其他部署到位时无缝地安排他们的迁移,他们可以高枕无忧,并且他们可以随时跟踪迁移的进度并在需要时中断它们。
开发人员将无需考虑运营问题。他们不需要担心计划内的维护或计划外的故障转移。
他们会对自己的部署充满信心,因为他们知道他们可以一次又一次地重新部署他们的更改,或者将它们全部还原,并在出现不可预见的问题时返回到最后一个已知状态。
所有这些都表明了一个高效的开发流程,这将使开发人员对他们的架构更改拥有所有权,并有信心以可靠的速度进行部署。最终,它将使开发人员能够专注于成功地为他们的客户提供卓越的产品和服务。
原文标题:Exploring a Paradigm Shift for Relational Database Schema Changes
原文作者:Shlomi Noach
原文地址:https://dzone.com/articles/exploring-a-paradigm-shift-for-relational-database-schema