7

如何在数据库迁移中保证数据一致性?

 3 years ago
source link: https://www.infoq.cn/article/DeDh79E4SrCrtwGBs47v
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文最初发布于王斌的个人博客,经原作者授权由 InfoQ 中文站翻译并分享,原文地址:

https://www.binwang.me/2020-11-29-Keep-Data-Consistency-During-Database-Migration.html

当一个系统存在很长一段时间后,经常会使用更新的技术来提高性能、可维护性或添加新特性。其中一个变化可能会是使用哪个数据库。这可能是最困难的改变。在迁移过程中,有两个数据源,这使得该系统成为一个分布式系统。在分布式系统中,保持数据一致非常困难,而且很容易出错。在本文中,我们将探索一种在迁移期间保持数据一致性的方法,并且这种方法的停机时间较短。

前提条件

为了使用本文描述的方法,需要满足一些要求:

  • 源数据库支持捕获数据更改(CDC)的方法,如MySQL的bin log。

  • 源数据库可以导出一致的数据,并且可以在数据更改日志中标记位置。

  • 目标数据库支持ACID事务。

  • 源和目标数据库都支持读写权限控制。

步骤

制定以下迁移步骤的两个基本想法:

  1. 在给定的时间点上,客户端只向其中一个数据库写入,从而避免了分布式事务易出错、处理速度慢的问题。

  2. 通过设置数据库权限来实现数据库切换。这比从客户端代码切换要快,而且更容易确保所有客户端都切换。

下面是具体步骤。

1.将源数据库转储到目标数据库

首先,我们需要源数据库可以导出一致的数据。标记好已转储的位置。例如,在 MySQL 中,可以在使用 mysqldump 转储数据库时带上 --master-data 选项,这样生成的文件中就会记录 bin log 日志的位置( 使用文档 )。从源数据库获得所有数据后,可以将它们插入目标数据库。

因为这是第一步,所以即使失败了也很容易处理:重新开始即可。因此,重要的是,在导入转储数据时,任何错误都要捕获。

2. 捕获源数据库的更改

下一步是捕获源数据库的更改。例如,在 MySQL 中,可以使用 bin log 捕获更改并将其插入到目标数据库中。因为上一步记录了开始位置,所以我们知道从哪里开始解析和导入更改。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK