Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
维护MongoDB副本集的镜像数据库_Mongodb_Sync_Mirror_Replay - Fatal编程技术网

维护MongoDB副本集的镜像数据库

维护MongoDB副本集的镜像数据库,mongodb,sync,mirror,replay,Mongodb,Sync,Mirror,Replay,我们正在生产环境中运行一个3人MongoDB副本集 我们需要维护该复制集的克隆,称为“镜像”,以进行内部分析。此镜像不需要实时,但越是最新越好(最多可能滞后1天) 维护这样一个镜像数据库最合适的方法是什么?(请注意,此镜像可以是单成员replset或独立实例) 仅供参考,我们尝试了两种方案,但其速度不可接受: Oplog回放。但是这花费了太多的时间(从replset的主服务器播放oplog大约需要40个小时) 定期使用生产复制集中的快照,但新卷(从快照创建)速度太慢,因为它没有预热(我们使用的是

我们正在生产环境中运行一个3人MongoDB副本集

我们需要维护该复制集的克隆,称为“镜像”,以进行内部分析。此镜像不需要实时,但越是最新越好(最多可能滞后1天)

维护这样一个镜像数据库最合适的方法是什么?(请注意,此镜像可以是单成员replset或独立实例)

仅供参考,我们尝试了两种方案,但其速度不可接受:

  • Oplog回放。但是这花费了太多的时间(从replset的主服务器播放oplog大约需要40个小时)
  • 定期使用生产复制集中的快照,但新卷(从快照创建)速度太慢,因为它没有预热(我们使用的是AWS EBS,预热耗时约12小时)
  • 更新#1
    :我们还尝试将镜像设置为replset成员,但我们希望将镜像与replset分开,因此此选项不满足要求

    更新#2
    :我们不希望此镜像成为replset成员的原因:我们对此镜像运行了大量查询,使其耗尽了资源信用(磁盘IO、网络IO、CPU),实例暂时不可用。这改变了整个replset结构(因为它丢失了一个节点)。当实例再次可用时,它再次更改了replset结构(又添加了一个节点)。这些更改严重影响了replset


    谢谢。

    您可以将mongodb设置为对已定义的节点进行读取首选项:。使用标记并不复杂,并且是“最近”阅读首选项的很好替代

    因此,您可以将此“镜像”作为副本集的从属成员,并使用标记
    “production”
    ,以便您的生产客户端从生产辅助节点进行读取,并且仅在需要从该实例进行读取时,才对该“镜像”实例使用特殊标记
    “mirror”
    。这样的镜像实例将是副本的完整成员,并且将不断更新。因为这个“镜像”实例在这种情况下也有意义

    但是有一点需要考虑:

    当读取首选项包括标记集时,客户端将尝试查找与指定标记集匹配的辅助成员,并从最近的组中将读取定向到随机辅助成员。如果没有辅助设备具有匹配的标记,则读取操作将产生错误。[1]

    无论如何,我都会在你的位置上这样做

    另外,在MongoDB上收集收集的统计数据和分析数据非常重要。Mongodb专家建议\在写入操作期间存储计数等统计信息: 这意味着,如果你有一些用户集合,你必须统计每个用户的一些帖子或其他统计信息,使用$inc对某些计数器***字段进行的一系列写入操作将抹去数据库上的负载,如果您每次需要从数据库中计算某个数据或获取平均值或执行类似的统计请求时都使用复杂的聚合请求,则总体性能会更好。

    您可以使用“隐藏辅助数据”,如下所述:

    我们在分片副本环境(4个分片,每个分片有多个辅助设备)中使用这些设备进行备份。我们关闭隐藏的二级数据库,拍摄文件系统的快照,然后启动机器。备份期间/之后,生产群集从未出现问题。 根据需要,您可以将延迟设置为自定义时间,以便复制副本处于活动状态或具有配置的延迟

    更新: 为了解释为什么我如此确信这会奏效:
    我们的集群(以MongoDB的规模)非常繁重,有巨大的M/R作业、高插入、更新和查询速率,总数据库大小约为10TB。所有这些都在相当小的EC2实例上。我们可以在生产群集的任何状态下关闭备份辅助设备,而不会出现任何问题。我们一年多来每天备份5次以上,并对该体系结构进行了多次测试。从未在生产群集上看到任何问题。由于我们的应用程序对延迟非常敏感,如果备份过程中存在任何延迟影响,我们将看到系统中的巨大影响。

    使用延迟副本集?()您可以选择delay.Thansk。有没有办法分开镜子?延迟的成员仍然属于replset。为什么不希望它属于副本集?因为我们在此镜像上运行了大量查询,使其耗尽了资源信用(磁盘IO、网络IO、CPU),实例暂时不可用。这改变了整个replset结构(因为它丢失了一个节点)。当实例再次可用时,它再次更改了replset结构(又添加了一个节点)。这些更改严重影响了replset。这就是为什么我不希望镜像成为replset的成员。您是否将其优先级设置为0并将投票设置为0?隐藏的真实?这样就不会改变选举新一届初选所需的投票人数、法定人数或多数票。我也一直在寻找最佳方法。就是这样。它的优先级为0这一事实也意味着,如果它需要重新启动,它将无法参与投票和f*您的主进程。我有一家规模较小的公司,只能负担2个节点,一个主节点和一个备份从节点。在我发现这一点之前,重新启动主程序并看到它在slaveOk=false,byebye站点上成为次要的,这是一件非常伤脑筋的事情。使用mongodump,您甚至不必关闭它,只需确保捕获oplog即可。我们以前有相同的建议回复集,但当隐藏的回复集变得不可用(由于资源信用耗尽)时,整个回复集的速度明显减慢。仅供参考,我们有“隐藏:真实”和“优先级:0”。我不确定这是因为我们缺少“0票”?(见我原来问题下的@asya kamsky的推荐)谢谢。T