【问题标题】:Synchronize data b/w two data stores在两个数据存储之间同步数据
【发布时间】:2016-01-15 15:40:14
【问题描述】:

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

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

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

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

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

这是一个好方法吗?还有其他更好、更快的解决方案来实现这一目标吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 写入队列失败怎么办?谢谢。
    • @w0051977 你只需要有一个机制会说写入队列失败,所以重复上一个过程。
    • 我假设我有两个队列,即 SQL 队列和 NoSQL 队列。如果应用程序无法写入其中一个队列,则无法写入两个队列。是对的吗?这就是事务性消息 (msdn.microsoft.com/en-us/library/ms704006(v=vs.85).aspx) 的含义吗? +1。
    • 谢谢。你会采用这种方法还是有其他方法?
    • 另一种方法是在应用程序级别手动处理此问题,但我想第一个选项更好。
    【解决方案2】:

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

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

    第一阶段

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

    第二阶段

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

    第三阶段

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

    第 4 阶段

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        相关资源
        最近更新 更多