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

时间:2016-01-15 15:40:14

标签: sql-server database database-design amazon-dynamodb nosql

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

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

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

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

我将通过定期运行工具来检查上次运行后添加的任何用户,方法是查询用户表格,例如WHERE CreationDate >= LastRunTime,然后为每个用户查询它是否存在于另一个用户中数据库。我将这两种方式做到这一点,即从旧的DB - >新数据库和新数据库 - >旧DB。

这是一个很好的方法吗?还有其他更好,更快的解决方案吗?

如何检测现有用户数据的更改?有没有比检查和更好的解决方案?匹配两个系统中的每个用户的记录'表,然后取最后一次修改的表(通过检查每条记录的LastModifiedDate时间戳)并在其他系统的表中更新它?

3 个答案:

答案 0 :(得分:3)

解决方案1 ​​ (我的推荐):每当系统在任一数据库中插入/更新记录时,您都会在数据库中添加/更新记录数据并添加该信息在Queue

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

注意:使用队列的另一个好处是您不必在DynamoDB表中设置非常高的吞吐量。

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

答案 1 :(得分:1)

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

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

阶段1

  • 为旧系统中的数据创建新的DynamoDB表。

第2阶段

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

第3阶段

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

第4阶段

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

这肯定是更多步骤,并且将花费更多时间,而不仅仅是关闭应用程序,迁移所有数据,然后部署新版本的应用程序以从DynamoDB读/写。但是,这种方法的主要好处是它不仅不需要停机,而且风险较低,因为它可以测试阶段的变化,并且如果遇到任何问题,可以轻松回滚。

答案 2 :(得分:0)

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

如果您有“创建时间”和“last_updated_by time”,则cron作业可以进行同步和审核。在这种情况下,主数据库(应从中同步数据)通常是SQL Db,因为在SQL中进行表扫描比在NoSQL中更容易(如在DynamoDB中,您需要使用其扫描功能,并且它受限于表的哈希键)。

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

最后,您可以查看AWS数据库迁移服务https://aws.amazon.com/dms/,看看它是否满足您的要求。