对于我的应用程序,我需要定期从mongodb服务器移动旧数据到另一个(即两个不同的服务器)。我还希望能够查询这些数据,就好像它们是相同的数据库一样。
简而言之,我希望能够将两个mongodb实例(在两个不同的服务器上)视为一个,并能够控制数据的存储时间和位置。
我读到了分片和块的概念,并迅速看到了moveChunk函数,它可以很容易地做我想要的。
问题是在mongodb中配置这样的架构似乎是不可能的。我在这里错过了什么吗?
答案 0 :(得分:1)
对于保留已删除文档的问题,您无法使用内置功能/机制(如分片或复制)来实现此目的。唯一的方法是手动处理这种情况,例如为已删除的文档保留一个单独的集合,只需移动文档到该集合,而不是删除它们。
对于移动数据的全局问题,您有以下两个选项:
使用分片,您可以将数据分成多个部分,这些部分将存储在两个(在您的情况下)不同的服务器上。在这种情况下,您可以使用正如您所提到的moveChunk
方法。但是这种方法非常棘手,因为你需要禁用内置的自动平衡器来完全手动控制你的块。无论如何,MongoDB不建议这样做:
仅在特殊情况下使用moveChunk,例如准备分片群集以初始摄取数据或大批量导入操作。在大多数情况下,允许平衡器在分片群集中创建和平衡块
除此之外,只允许分割数据,最后,为了实现目标,最终会得到一个完整的碎片和一个空碎片。
复制方法更安全,更容易实现。您只需configure a replica set并将第二台服务器添加到该集合中。
如果数据太大,您可以configure your second server as hidden。因此不会对该服务器执行任何读取,因此不会收到任何不一致的数据。数据复制完成后,您将在两台服务器上获得数据副本。
至于将两个服务器用作单个服务器,如果您需要平衡这两个服务器之间的请求,您可以将readPreference
配置为secondary
,这将确保所有读取都被发送到辅助服务器,默认情况下写入是在主服务器上完成的。
在这种情况下,您的代码将不知道您正在查询的服务器。您将只运行客户端方法,其余的将在驱动程序后面完成。
所以我的建议是使用复制方法作为更干净,无痛且安全的解决方案。