【问题标题】:Local MongoDB instance with index in remote server在远程服务器中具有索引的本地 MongoDB 实例
【发布时间】:2023-03-04 21:02:01
【问题描述】:

我们的一个客户有一个运行 MongoDB 实例的服务器,我们必须使用存储在他们的 MongoDB 数据库中的数据构建一个分析应用程序,这些数据经常变化。

客户要求是:

  • 我们不直接连接到他们的 MongoDB 实例或在他们的服务器上运行另一个 MongoDB 实例,而是以某种方式在我们办公室的机器上运行我们自己的 MongoDB 实例,使用他们远程只读访问的 MongoDB 数据库目录。

我们建议部署一个 REST 应用程序,获取他们的数据库转储副本,但他们不希望这样做。他们只是希望我们运行我们自己的与 MongoDB 实例目录挂钩的 MongoDB 实例。这甚至可能吗?

过去两天我一直在寻找解决方案,我们必须在星期一之前提交解决方案。我真的需要一些帮助。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我认为这是正常请求,因为分析查询可能会导致生产服务器上的负载过大。将生产数据库和分析数据库分开是很正常的。

    最简单的选择是使用 MongoDB 复制。设置 MongoDB 副本集,将生产数据库实例作为主数据库实例,将分析数据库实例作为辅助数据库实例,并将分析实例配置为永远不会成为主数据库实例。

    如果无法使用复制 - 例如客户端不希望这样做,服务器无法直接相互连接... - 还有另一种选择。您可以从远程数据库读取 oplog 并将操作应用于您的数据库实例。这正是副本集如何工作的低级机制,但您也可以手动完成。例如 MMS (Mongo Monitoring Service) Backup 使用读取 oplog 进行 MongoDB 的在线备份。

    更新:mongooplog 可能是实时应用从远程服务器拉取到本地服务器上的复制 oplog 的正确工具。

    【讨论】:

      【解决方案2】:

      我认为运行两个指向同一个数据库文件的数据库是不可能的,甚至是不推荐的。

      您可以使用mongorestore 直接从他们的数据文件中恢复,但这只有在他们的 mongod 实例未运行时才有效(因为mongorestore 需要锁定目录)。

      另一种解决方案是执行file system snapshots,然后恢复到本地数据库。

      这种备份/恢复解决方案的缺点是您的数据不会一直同步。

      可能最好的解决方案是使用具有隐藏成员的副本集。 你可以创建一个只有两个成员的副本集:

      1. 主要 - 这将是客户端服务器。
      2. 次要 - 隐藏,投票和优先级设置为 0。这将是您的本地实例。

      他们的服务器将永远是主要的(因为隐藏的成员不能成为主要的)。客户端无法看到隐藏的成员,因此出于所有意图和目的,您的服务器将是只读的。 另一个好处是 MongoDB 复制将完成在服务器之间同步数据的所有“繁重”工作,并且您的实例将始终拥有最新数据。

      【讨论】:

        猜你喜欢
        • 2014-09-18
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多