【问题标题】:What does it mean to fit "working set" into RAM for MongoDB?将“工作集”放入 MongoDB 的 RAM 是什么意思?
【发布时间】:2011-06-23 11:55:51
【问题描述】:

MongoDB 速度很快,但前提是您的工作集或索引可以放入 RAM。那么如果我的服务器有 16G 的 RAM,这是否意味着我所有集合的大小都需要小于或等于 16G?怎么说“好的,这是我的工作集,其余的可以“存档?”

【问题讨论】:

  • 仅供参考,要估计工作集的当前大小,请运行:“db.runCommand( { serverStatus: 1, workingSet: 1 } )”。根据文档,“MongoDB 数据库的工作集是客户最常访问的数据部分”docs.mongodb.org/manual/faq/diagnostics

标签: mongodb


【解决方案1】:

“工作集”基本上是您的系统将处于活动状态/正在使用的数据量和索引。

例如,假设您有 1 年的数据。为简单起见,每个月涉及 1GB 的数据,总共 12GB,为了涵盖每个月的数据,您有 1GB 的索引,全年总计 12GB。

如果您总是访问过去 12 个月的数据,那么您的工作集是:12GB(数据)+ 12GB(索引)= 24GB。

但是,如果您实际上只访问最近 3 个月的数据,那么您的工作集为:3GB(数据)+ 3GB(索引)= 6GB。在这种情况下,如果您有 8GB RAM,然后您开始定期访问过去 6 个月的数据,那么您的工作集将开始超出可用 RAM 并产生性能影响。

但一般来说,如果您有足够的 RAM 来覆盖您希望经常访问的数据/索引的数量,那么您就可以了。

编辑:在 cmets 中回答问题
我不确定我是否完全遵循,但我会尝试回答。首先,工作集的计算是一个“球场图”。其次,如果您在 user_id 上有一个(例如)1GB 索引,那么只有经常访问的索引部分需要在 RAM 中(例如,假设 50% 的用户处于非活动状态,那么 0.5GB 的索引将更频繁RAM 中需要/需要)。通常,您拥有的 RAM 越多越好,尤其是由于使用量的增加,工作集可能会随着时间的推移而增长。这就是分片的用武之地——将数据拆分到多个节点上,您可以经济高效地进行横向扩展。然后你的工作集被划分到多台机器上,这意味着更多的机器可以保存在 RAM 中。需要更多内存?添加另一台机器进行分片。

【讨论】:

  • 感谢您使用示例 ;-) ... 如果该站点类似于社交网站。 (让我们不要争论 NoSQL 是否是适合这项工作的工具,等等......)。你有数以百万计的用户,我想那一定是一张巨大的桌子。你如何定义工作集?我想我的问题是,你如何定义一个工作集?如果我索引“user_id”,显然这需要我所有用户的用户集合。我不能指定,只能拉 3 个月前的用户,可以吗?
  • @luckytaxi - 我(希望)在上面的更新中回答了更多!
  • Doh,忘了分片。我想我的问题更多的是“你如何告诉 mongo 将以下数据保留为你的‘工作集’?”如果 50% 的用户处于非活动状态,你如何不将其加载到 RAM 中?
  • @luckytaxi - 归结为实际查询的内容。一般来说,如果不访问旧数据,则不会将其拉入 RAM。因此,更多的是正在访问/查询什么,而不是告诉它你想要在你的工作集中什么数据......如果你明白我的意思吗?!
  • "...那么只有经常访问的索引部分需要在 RAM 中..."。 MongoDB如何确定常用的数据?是今天/过去一周/过去一个月至少访问过一次的数据还是任何类似的逻辑?
【解决方案2】:

工作集基本上是您最常(经常)使用的东西。如果您使用集合 B 的索引 A 来搜索文档的子集,那么您可以考虑使用您的工作集。只要这些结构中最常用的部分可以放入内存,那么事情就会非常快。由于零件不再适合您的工作集,就像许多文档一样,这可能会减慢速度。通常,如果您的索引超出您的内存,事情会变得更慢。

是的,您可以拥有大量数据,其中大部分是“存档”且很少使用,而不会影响我们应用程序的性能或影响您的工作集(不包括该存档数据)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2018-12-16
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2017-11-19
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多