我已阅读what-does-it-mean-to-fit-working-set-into-ram-for-mongodb。但我对mongodb内存管理非常困惑。 假设我有一台40G RAM的机器。我使用mongo开发游戏,有两个系列。
用户,此集合每月保持增长,1G Data + 0.1G索引,但只有部分用户处于活动状态,我们假设只有1G数据处于活动状态。这是否意味着此系列将使用大约1G + 0.1G *月的内存,就像申请在线10个月时会消耗2G内存。
game_record _ $ {yyyy_MM},它可能包含像uid,gameId,win,score,time这样的列。 这个集合存储游戏记录,当用户玩游戏时创建数据,它是从用户到游戏_record _ $ {yyyy_MM}集合的1:n关系,这个集合也保持增长,每月10G数据+ 1G指数。它按月分片(手工分割程序)。假设应用程序在线约10个月,那么总数据为110G。 有集合
user_game_2018_01
数据访问模式只是一个简单的分页查询。
db.game_record_${yyyy_MM}.find({uid: 'Kelvin'}).sort({time:-1}).skip(n).limit(10) //n keep update for continuous query
程序继续搜索当前数据以通过。 问题是: 我们假设大多数用户只会检查他们最近3个月的数据,因此只有三个数据集合处于活动状态并且都适合内存,它将消耗33G RAM。在更糟糕的情况下,当一些用户继续将游戏数据导航到最旧时,所以查询所有集合。 mongo会发生什么,最旧的集合是否适合内存并换出当前的活动集合,如user_game_201801
答案 0 :(得分:0)
在您的情况下不会发生此问题,因为 Mongo将RAM中的索引保留为集合数据。
因此,在您的情况下,在10个月后,您将拥有来自用户集合的1GB索引。来自game_record_ {yyyy_MM}集合的10GB索引。
所以你有11GB索引,即小于你的RAM大小。