任何排序顺序的方式,Mongod在启动后将东西加载到内存中



第一次检查时,我的用例可能看起来很奇怪,但我相信原则上我所做的是在短时间内大规模扩展而不会对实时服务产生任何影响的好方法。

我们的实时数据库运行在Amazon EC2上的3个成员多区域副本集上。我们通过快照EBS日志和数据卷进行定期备份。因此,基于最近的快照启动数据库的独立克隆非常容易。我们定期有一些繁重/复杂的聚合任务,这些任务要求我们以编程方式完成聚合管道中不可能完成的工作,并且需要从数据库中提取大量数据。我发现从活动的复制集成员中提取数据会影响性能,因此我一直在使用包含最新快照数据的独立mongo服务器旋转盒子。这工作得很好,虽然它似乎需要大约30分钟,然后mongo服务器变得高性能,我猜是由于所有索引等被加载到内存。

问题是,我实际上只想访问数据库中的一两个集合。我想知道是否有一种方法可以优先考虑我希望使用的集合,或者在不将它们加载到内存的情况下删除我不想要的集合?

您遇到的部分问题是由于从快照创建的新EBS卷的性能受到影响。来自EC2文档:

当您创建新的EBS卷或从快照恢复卷时,后端存储块立即分配给您。然而,第一次访问存储块时,必须将其擦除清理(对于新卷)或从其快照实例化(对于已恢复的卷),然后才能访问该块。这初步操作需要时间,并且可能导致5%到50%的IOPS损失第一次访问每个块时的卷。对于大多数应用程序,在卷的生命周期内分摊此成本是可以接受的。一次数据访问即可恢复性能

我可以想到三个方法来解决这个问题:

  1. 文档的其余部分http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-prewarm.html讨论了在启动EBS卷之前预热它的方法(基本上是通过读取卷上的所有块)。这可能是可能不是解决问题的有效方法。
  2. 您可以点击mongodb博客建议的特定数据库文件Post: http://blog.mongodb.org/post/10407828262/cache-reheating-not-to-be-ignored:

    服务器重启时,复制数据文件到/dev/null强制重新加热到保持顺序,从而更快。这可以做到,即使Mongod进程已经在运行。如果数据库大于RAM,只复制最新的数据文件(数量最多的);而这并不完美,最新的文件可能包含最大的文件常用数据的百分比。

  3. 您可以从辅助服务器使用已经预热的EBS卷而不是新创建的卷。在这种情况下,你可以取您的二级服务器关闭,交换新创建的卷,并获取用于新实例的旧卷。这需要一些时间但是可以为您提供完全预热的EBS卷可能比自己预热要快得多

如果我理解正确,您使用专用的Amazon EC2实例来获取一些数据并在客户端进行聚合。

一旦启动EC2实例内存将处于冷状态,即没有数据和索引加载到内存中。一旦开始向box发送查询,就只会将查询访问的数据和一些索引加载到内存中。如果你只用这个方框获取一些数据,只会加载你需要的数据。不需要优先级,因为只加载所需的数据

你提到它会影响性能。你能解释一下你的意思吗?您尝试在客户端检索多少数据?

最新更新