同步数据 b/w 两个数据存储

Synchronize data b/w two data stores

我有两个不同的数据库,一个是旧的遗留数据库,由于不再使用旧服务,我将其停用。另一个是新服务,最终将取代旧系统。在此之前,我们需要这两项服务 运行ning 一段时间。

两者都有两个 table 供用户存储电子邮件地址、密码,另一个 table 用于简单的用户相关数据(地址)。

我需要在这两个数据库之间同步数据。旧的是 MS SQL Server DB,新的是 NoSQL DB,(DynamoDB.)

我的策略是在上线之前,将所有用户从旧数据库复制到新系统,然后在新系统 运行ning 之后同步每个数据库之间的用户。

我将使用工具 运行 定期检查在上次 运行 之后添加的任何用户,方法是查询用户 table 类似 WHERE CreationDate >= LastRunTime 和然后对于每个用户查询它是否存在于另一个数据库中。我将以两种方式执行此操作,即从旧数据库 -> 新数据库和从新数据库 -> 旧数据库。

这样做的好方法吗?还有其他更好、更快速的解决方案吗?

如何检测现有用户数据的变化?有没有比在两个系统的 table 中检查和匹配每个用户的记录然后获取最后修改的记录(通过检查每条记录的 LastModifiedDate 时间戳)并在另一个系统的 table?

解决方案 1 (我的推荐): 每当系统 insert/update 您 add/update 在数据库中记录数据并将该信息添加到 Queue.

一个单独的 reader 将从队列中读取数据并定期将数据复制到相应的数据库,这样您的数据将在数据库之间同步。

注意:使用队列的另一个优点是您不必在 DynamoDB 中设置非常高的吞吐量 table.

解决方案 2:根据您在问题中的建议,您可以添加一个 CRON 作业,该作业将通过检查基于时间戳的记录来复制数据库。

我已经执行了几次从 Oracle / MySQL 到 DynamoDB 的 table 迁移,没有停机,我使用的方法与您描述的略有不同。这种方法最终需要更多编码,但我认为它比您描述的硬切换风险更低。

此方法需要多个阶段,如下所述:

阶段 1

  • 为遗留系统中的数据创建新的 DynamoDB table(s)。

阶段 2

  • 将您的应用程序更新为旧数据库和 DynamoDB 中的 write/update 数据。您的应用程序仍将读取和写入遗留系统,因此这应该是一个低风险的更改。
  • 在部署此代码之前立即使用所有旧数据加载 DynamoDB。
  • 部署后立即审核数据库以确保它们同步。

阶段 3

  • 更新您的应用程序以开始从 DynamoDB 读取数据。这应该是低风险的,因为您的应用程序将在 DynamoDB 中维护数据一段时间。
  • 让您的应用程序继续写入遗留数据库,以便您在发现新实施中的任何问题时可以减少。这确保切换风险低,您可以轻松回滚。

阶段 4

  • 从您的应用程序中删除读取和写入遗留数据库的代码,并将其部署到生产环境中。
  • 您现在可以停用旧数据库!

与仅关闭应用程序、迁移所有数据,然后将应用程序的新版本从 DynamoDB 部署到 read/write 相比,这肯定需要更多步骤,并且会花费更多时间。然而,这种方法的主要好处是它不仅不需要停机,而且风险较低,因为它分阶段测试更改,并允许在遇到任何问题时轻松回滚。

在高级别上,同步作业可以是 1> 基于 cron 作业或 2> 基于通知。

如果您有 "creation time" 和 "last_updated_by time",则 cron 作业可以进行同步和审核。在这种情况下,主数据库(数据应从中同步)通常是 SQL 数据库,因为在 SQL 中进行 table 扫描比在 No[=22= 中更容易](就像在 DynamoDB 中一样,您需要使用它的扫描功能,并且它受到 table 的哈希键的限制)。

第二个选项是构建一个通知机制,这可以基于 DynamoDB 的流 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html。它是DynamoDB 的一个成熟特性,它保证了事件的顺序并且可以实现接近实时的事件传递。您需要做的是为这些事件建立监听器。

最后,您可以看看 AWS Database Migration Service https://aws.amazon.com/dms/ 看看它是否满足您的要求。