我们的一个客户端有一个运行MongoDB实例的服务器,我们必须使用存储在MongoDB数据库中的数据来构建一个分析应用程序,该数据库经常更改。
客户要求是:
我们建议部署REST应用程序,获取数据库转储的副本,但他们不希望这样。他们只是希望我们运行我们自己的MongoDB intance,它与MongoDB实例目录相连。这甚至可能吗?
过去两天我一直在寻找解决方案,我们必须在星期一之前提交解决方案。我真的需要一些帮助。
答案 0 :(得分:2)
我认为这是正常的请求,因为分析查询可能会导致生产服务器上的负载过大。分离生产和分析数据库是很正常的。
最简单的选择是使用MongoDB复制。使用生产数据库实例将MongoDB 副本集设置为辅助数据库实例,将分析实例配置为永远不会成为主数据库。
如果无法使用复制 - 例如客户端不想要这样,则服务器无法直接相互连接...... - 还有另一种选择。您可以从远程数据库读取oplog 并将操作应用于数据库实例。这正是副本集的工作原理的低级机制,但您也可以手动完成。例如,MMS(Mongo Monitoring Sevice)Backup使用读取oplog进行MongoDB的在线备份。
更新: mongooplog可能是从本地服务器上的远程服务器提取的复制oplog实时应用的正确工具。
答案 1 :(得分:0)
我认为运行两个指向相同数据库文件的数据库是不可能的,甚至不推荐使用。
您可以使用mongorestore
直接从其数据文件中恢复,但这只有在他们的mongod实例未运行时才会起作用(因为mongorestore
需要锁定目录)。
另一种解决方案是执行file system snapshots,然后恢复到本地数据库。
此备份/恢复解决方案的缺点是您的数据不会一直同步。
最好的解决方案可能是使用隐藏成员的副本集。 您只需两个成员即可创建副本集:
他们的服务器将永远是主要的(因为隐藏的成员不能成为初选)。客户端无法看到隐藏的成员,因此出于所有意图和目的,您的服务器将是只读的。 另一个好处是,MongoDB复制将执行在服务器之间同步数据的所有“繁重”工作,您的实例将始终拥有最新数据。