数据库迁移是将数据从一个数据库系统传输到另一个数据库系统的过程,这可能涉及更改数据库架构、数据库管理系统或两者。这样做是为了提高性能、可伸缩性和可靠性,或者利用目标数据库系统中的新特性和功能。?
就系统可用性而言,数据库迁移有两种形式:停机迁移和实时迁移。
该系统已关闭进行维护,开发人员发布了一个显示“正在维护中”的启动页面。在幕后,数据被复制到新数据库,并且连接字符串从旧数据库更新到新数据库。一旦一切都被验证可以正常工作,系统就会再次上线。此方法有一定的优点,因为无需过多关心迁移过程中的系统可用性和/或数据丢失。当然,缺点是系统 SLA 会下降,这可能不适合所有类型的应用程序。
在这种方法中,系统永远不会崩溃。相反,迁移设计使得迁移可以在没有任何停机时间的情况下完成,即系统在整个迁移过程中保持活动状态。尽管这需要更复杂的设计,但这种方法保证对服务可用性 SLA 没有影响或影响最小,并且对于许多场景来说可能是更有吸引力的选择。
本文将介绍实时数据库迁移设计的案例研究。
实时数据库迁移设计分为几个阶段:
此步骤是一个代码密集的步骤,其中服务以某种形式编写,使得位于数据层之上的服务层与服务所使用的数据库无关。该步骤包括:
完成第一阶段后,我们可以安全地开始对迁移模块进行编码,而不会影响当前的功能。
此步骤在现有数据层旁边引入新数据层。大多数时候,这将是一个新的存储库类,每个表/集合都有一个从现有数据层 1:1 映射的 CRUD 函数的新副本。?
此步骤还引入了 MigrationFlag (True/False) 并确保新的数据层代码仅位于 True 标志后面。这样,一旦部署代码,配置最初部署为 False,并且代码仅写入旧数据层。我们将在稍后阶段看到当配置变为 True 时会发生什么。
此步骤涉及一些数据工程和创建数据管道,将数据从旧数据库复制到新数据库。这包括:
datetime
标记列,它跟踪任何记录的最近更改,并帮助跟踪需要同步到新数据库的记录的最新版本。值得注意的是,通过定期运行此数据同步,正在构建旧数据库的实时副本,理想情况下,该副本能够在切换到旧数据库时吸收流量。这将我们带入下一阶段。
现在,此处使用在步骤 2 中开发的迁移标志从 False 切换到 True。然后代码开始双重写入新旧数据库并从新数据库读取?。这有两个方面的帮助:
如果没有问题,那么我们将继续最后的步骤。
此步骤中的代码已更新,以停止对旧数据库的双重写入,而仅从新数据库进行读写。在双写停止并验证没有新数据通过管道同步后,数据同步也可以安全停止。
在第 5 阶段结束时,可以有一个可选的清理阶段来删除所有未使用的代码和数据同步源。?
总之,实时数据库迁移是一个复杂但有用的过程,可确保数据从旧数据库无缝过渡到新数据库,而不会造成任何服务停机。概述的分阶段方法可确保该过程安全、可逆,并且万无一失,防止测试过程中可能出现的任何问题。迁移结束时,系统在新数据库上完全运行,所有未使用的代码和数据同步源均已清理。
更多技术干货请关注公号【云原生数据库】
Squdis DBMotion是专业的数据库迁移同步工具,免费使用,快访问squids.cn~