【问题标题】:Set up MongoDB and Redis on the same server在同一台服务器上设置 MongoDB 和 Redis
【发布时间】:2014-10-10 04:01:53
【问题描述】:

目前我有一个使用 Node.js 和 MongoDB 设置的简单 API 服务器,但想开始合并 Redis 来缓存请求。在与 MongoDB 服务器相同的机器上设置 Redis 实例是不好的做法吗?如果我将来要扩展 MongoDB 服务器,是否应该注意任何 Redis 设置问题?

【问题讨论】:

    标签: node.js mongodb architecture redis


    【解决方案1】:

    虽然 Redis 和 MongoDB 确实是一个很好的组合,但它们不应该安装在同一个节点上,尤其是在 MongoDB 数据库不适合内存的情况下。

    MongoDB 利用操作系统的虚拟内存机制,其数据结构(btrees)即使在交换的情况下也能提供可靠的性能(由于内存局部性)。如果 MongoDB 数据库大于内存,机器将交换,这是预期的行为。

    另一方面,Redis 是单线程内存数据存储,其数据结构针对随机内存访问进行了调整。一切都必须适合记忆。如果主机开始交换一些 Redis 内存,它的性能将非常糟糕。

    如果将两者放在同一主机上,MongoDB 将进行机器交换,Redis 将不再响应。解决问题的一种方法是使用 cgroups(或类似的隔离机制)来防止 MongoDB 吃掉机器的内存,但这会使配置更加复杂。我不会推荐它。

    【讨论】:

    • MongoDB 数据库不需要放入内存
    • 不,它没有,因为它依赖于 mmap 文件。这样做,如果你的MongoDB数据大于内存,它可以很容易地吸掉机器的所有内存,并使机器交换。
    • 但请记住只有活动集,您现在正在使用的集,工作集。此外,操作系统决定 MongoDB 使用多少 RAM,所以如果它使用整个机器,那是因为操作系统说它可以。
    • 感谢您的解释。我现在明白了,由于 MongoDB 和 Redis 都需要内存资源,因此拥有单独的机器是可行的方法。但另一方面,我们是否也应该考虑不同机器造成的机器对机器网络延迟,或者与替代方案相比它真的很小吗?
    • Redis 和 MongoDB 之间没有通信,只有你的应用和 Redis 之间,以及你的应用和 MongoDB 之间。所以 MongoDB 和 Redis 服务器之间的延迟是无关紧要的。
    【解决方案2】:

    您可能会发现最大的问题是 MongoDB 希望为其工作集分页数据和 redis 希望使用与操作系统分配这些页面相同的内存地址之间的资源争用。

    根据我自己的经验,我曾让 redis 和 MongoDB 一起运行,但我应该强调,他们一起工作的原因是因为我的 MongoDB 工作集和我存储在 redis 中的数据量。

    我要说的是,这完全取决于您对这两者的使用以及运行它们的金属。如果你发现你正在使用 redis 来存储很多东西,然后你在 MongoDB 中的工作集也很大,比如在一台小型服务器上,那么你可能会发现两者会相互碰撞,但如果你在 RAM 中留出足够的空间来存储两个人开心地坐在一起,应该不会有太大的问题。

    【讨论】:

    • 实际上,MongoDB 并没有真正为其工作集分配内存。它只是对文件进行映射,并将内存管理委托给操作系统。这避免了双重缓存(这很好),但另一方面,它可以使用的 RAM 数量没有限制(这很糟糕)。
    • @DidierSpezia good catch 改变了措辞,谢谢。那么操作系统决定限制
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2020-11-29
    • 2011-07-09
    • 1970-01-01
    • 2021-11-20
    • 2012-04-07
    • 2016-09-06
    • 2015-04-01
    相关资源
    最近更新 更多