我有两个不同的数据库,其中一个是旧的遗留数据库,由于旧服务不再使用,我将退役。另一个是新服务,最终将取代旧系统。在此之前,我们需要两种服务运行一段时间。
两个表都有两个表供用户存储电子邮件地址,密码,另一个表用于简单的用户相关数据(地址。)
我需要在这两个数据库之间同步数据。旧的是MS SQL Server DB,新的是NoSQL DB,(DynamoDB。)
我的策略是在上线之前,将所有用户从旧数据库复制到新数据库,然后在新系统运行后,然后在每个数据库之间同步用户。
我将通过定期运行工具来检查上次运行后添加的任何用户,方法是查询用户表格,例如WHERE CreationDate >= LastRunTime
,然后为每个用户查询它是否存在于另一个用户中数据库。我将这两种方式做到这一点,即从旧的DB - >新数据库和新数据库 - >旧DB。
这是一个很好的方法吗?还有其他更好,更快的解决方案吗?
如何检测现有用户数据的更改?有没有比检查和更好的解决方案?匹配两个系统中的每个用户的记录'表,然后取最后一次修改的表(通过检查每条记录的LastModifiedDate时间戳)并在其他系统的表中更新它?
答案 0 :(得分:3)
解决方案1 (我的推荐):每当系统在任一数据库中插入/更新记录时,您都会在数据库中添加/更新记录数据并添加该信息在Queue
。
sperate reader将从队列中读取并定期将数据复制到相应的数据库,这样您的数据就会在数据库之间同步。
注意:使用队列的另一个好处是您不必在DynamoDB表中设置非常高的吞吐量。
解决方案2:您在问题中建议的内容,您可以添加一个CRON作业,通过根据时间戳检查记录来复制数据库。
答案 1 :(得分:1)
我已经执行了几次从Oracle / MySQL迁移到DynamoDB的表,没有停机时间,我使用的方法与您描述的方法略有不同。这种方法最终需要更多的编码,但我认为这是一种风险低于你所描述的硬切换的方法。
这种方法需要多个阶段,如下所述:
阶段1
第2阶段
第3阶段
第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/,看看它是否满足您的要求。