【发布时间】:2014-10-10 04:01:53
【问题描述】:
目前我有一个使用 Node.js 和 MongoDB 设置的简单 API 服务器,但想开始合并 Redis 来缓存请求。在与 MongoDB 服务器相同的机器上设置 Redis 实例是不好的做法吗?如果我将来要扩展 MongoDB 服务器,是否应该注意任何 Redis 设置问题?
【问题讨论】:
标签: node.js mongodb architecture redis
目前我有一个使用 Node.js 和 MongoDB 设置的简单 API 服务器,但想开始合并 Redis 来缓存请求。在与 MongoDB 服务器相同的机器上设置 Redis 实例是不好的做法吗?如果我将来要扩展 MongoDB 服务器,是否应该注意任何 Redis 设置问题?
【问题讨论】:
标签: node.js mongodb architecture redis
虽然 Redis 和 MongoDB 确实是一个很好的组合,但它们不应该安装在同一个节点上,尤其是在 MongoDB 数据库不适合内存的情况下。
MongoDB 利用操作系统的虚拟内存机制,其数据结构(btrees)即使在交换的情况下也能提供可靠的性能(由于内存局部性)。如果 MongoDB 数据库大于内存,机器将交换,这是预期的行为。
另一方面,Redis 是单线程内存数据存储,其数据结构针对随机内存访问进行了调整。一切都必须适合记忆。如果主机开始交换一些 Redis 内存,它的性能将非常糟糕。
如果将两者放在同一主机上,MongoDB 将进行机器交换,Redis 将不再响应。解决问题的一种方法是使用 cgroups(或类似的隔离机制)来防止 MongoDB 吃掉机器的内存,但这会使配置更加复杂。我不会推荐它。
【讨论】:
您可能会发现最大的问题是 MongoDB 希望为其工作集分页数据和 redis 希望使用与操作系统分配这些页面相同的内存地址之间的资源争用。
根据我自己的经验,我曾让 redis 和 MongoDB 一起运行,但我应该强调,他们一起工作的原因是因为我的 MongoDB 工作集和我存储在 redis 中的数据量。
我要说的是,这完全取决于您对这两者的使用以及运行它们的金属。如果你发现你正在使用 redis 来存储很多东西,然后你在 MongoDB 中的工作集也很大,比如在一台小型服务器上,那么你可能会发现两者会相互碰撞,但如果你在 RAM 中留出足够的空间来存储两个人开心地坐在一起,应该不会有太大的问题。
【讨论】: