Database 使用复制在集群之间迁移mongodb是否可行?

Database 使用复制在集群之间迁移mongodb是否可行?,database,mongodb,migration,database-migration,Database,Mongodb,Migration,Database Migration,我们有一个托管mongodb 3.0.11集群运行在Compose上,具有约300gb的数据(称为C0)。我们希望将此数据移动到在GCP上运行的自我管理mongodb 4.x集群(称为C1)。我已经尝试了一些用于克隆/同步DBs的github repo,但没有一个能够可靠地用于我的测试(老实说,我不确定是否要使用这些未经严格测试的repo来迁移我们的生产数据) 在阅读有关副本集、oplog等的mongodb文档时,我突然想到,也许我们可以让mongodb通过其内置的relica集成员添加过程为我

我们有一个托管mongodb 3.0.11集群运行在Compose上,具有约300gb的数据(称为C0)。我们希望将此数据移动到在GCP上运行的自我管理mongodb 4.x集群(称为C1)。我已经尝试了一些用于克隆/同步DBs的github repo,但没有一个能够可靠地用于我的测试(老实说,我不确定是否要使用这些未经严格测试的repo来迁移我们的生产数据)

在阅读有关副本集、oplog等的mongodb文档时,我突然想到,也许我们可以让mongodb通过其内置的relica集成员添加过程为我们进行迁移。然而,由于我不是mongodb专家,我不知道这是否是一个可行的解决方案

以下是我感兴趣的内容-mongodb专家请评论这是否可行(如果您有任何基于经验的建议):

  • 将C1中的两个mongodb实例作为优先级为0的副本集成员添加到C0
  • 等待C1.1成员更新
  • 进入“维护模式”-数据库访问客户端关闭
  • 强制将C1.1中的一个成员升级为主成员
  • 从副本集中删除所有C0.member
  • 使用C1副本集的新连接字符串重新启动数据库客户端
另一种选择是编写自己的cloner/sync,因为到目前为止,我发现的工具似乎都没有为mongo4.x做好生产准备


想法?

我强烈建议不要通过几个主要版本将集群迁移与升级结合起来。单独处理这些任务将有助于您在排除故障时限制更改的范围

如果您使用兼容的MongoDB服务器版本,并且能够将所有成员添加到同一副本集中,则可以使用您概述的常规方法在集群之间进行迁移。目前,滚动升级只支持相邻的主要服务器版本,因此,如果您的起点是MongoDB 3.0.x,那么可以直接添加到3.0.x副本集中的最新版本将是3.2.x。如果您的最终目标是4.0.x,那么您必须从3.2=>3.4、3.4=>3.6升级到3.6=>4.0。包含每个主要版本的特定先决条件、升级过程和兼容性信息

DBaaS提供程序通常不允许添加外部自管理成员,因为这可能会损害它们管理的集群的安全性和稳定性。但是,DBaaS提供程序通常具有自动化功能,可以帮助您就地升级,因此您可能希望在迁移到自管理之前利用这一点

从DBaaS进行实时迁移的最佳选择是创建一个可以访问复制oplog的用户,并找到一个适合您的用例和源/目标服务器版本的迁移工具。对于生产环境,我会小心尝试跨多个主要版本(如3.0.x到4.0.x)进行实时迁移,并鼓励使用单独的升级步骤进行相同版本的迁移(3.0.x=>3.0.x)

作为一般做法,我将:

  • 查看您正在计划的服务器和驱动程序升级的所有版本、升级和兼容性说明
  • 确保使用兼容的驱动程序版本,并在升级服务器版本之前升级驱动程序/应用程序代码
  • 在具有代表性的登台/QA环境中使用生产数据备份测试升级过程
  • 使用升级的驱动程序/服务器版本和具有代表性的工作负载测试您的应用程序,以查找潜在的问题,如性能下降

谢谢@stennie,我大体上同意你的建议。最后,我编写了一个工具,对所有记录进行完整克隆,然后实时跟踪oplog以同步目标。这使我们能够将320g数据库从3.0.11 DBaaS提供程序实时迁移到4.2 DBaaS提供程序,而不会出现问题—总迁移时间约为12小时。我将很快以开源的形式发布该工具。@ChrisEdgington好极了--请在开源之后在这里发表评论,并附上链接:)。有一些这样的工具,但通常它们是为一次性迁移而创建的,不幸的是没有积极维护。