mongodb - 为服务/数据/缓存部署多个实例的好处

标签 mongodb deployment redis cluster-computing

尽管我有很多编写代码的经验。我真的没有太多部署东西的经验。我正在编写一个项目,该项目使用 mongodb 进行持久化,使用 redis 进行元缓存,并使用 play 来提供页面服务。我正在决定是购买专用服务器还是从 amazon/linode 购买多个小型/中型实例(每个实例一个,mongo、redis、play)。我想到了以下权衡取舍,我想知道是否有人可以添加到列表中或提供进一步的见解。我倾向于 (b) 从 linode 和亚马逊购买两套实例,因此如果其中一套出现故障,它将故障转移到另一家供应商。此外,如果有人有任何关于部署 scala/maven 集群或工具的提示,非常感谢。

A.把一切都放在一个实例中
优点:

  1. 数据库和页面 servlet(同一主机)之间的速度更快。
  2. 更便宜。
  3. 需要保护的端点更少。

缺点:

  1. 更难管理。 (在我看来)
  2. 更难升级单个模块。如果存在安装问题,可能会导致整个系统崩溃。

B.将每个模块(mongo、redis、play)放在不同的实例中
优点:

  1. 分片更容易。
  2. 更容易为单一目的创建集群。 (即 redis 集群)
  3. 更容易在模块之间分配资源。
  4. 不太可能所有事情同时失败。

缺点:

  1. 模块之间的带宽 -> $
  2. 保护每个连接和端点。

最佳答案

我只能评论技术方面(不是成本、可维护性等...)

没有提到专用实例是物理盒子,还是简单的大型虚拟机。如果应用程序生成大量到 MongoDB 或 Redis 的往返,那么差异将非常显着。

对于 VM,I/O、操作系统调度和系统调用的成本更高。这些元素往往是 MongoDB 或 Redis 等高效远程数据存储的性能成本的重要组成部分,并且它们的虚拟化代价更高。

从系统的角度来看,如果预期 MongoDB 数据库大于可用内存,我不会将 MongoDB 和 Redis/Play 放在同一个盒子上。 MongoDB 将数据文件映射到内存中,并依赖操作系统进行内存交换。它是为此而设计的。其他进程不是。如果 MongoDB 引起的交换将对 Redis 和 Play 响应时间产生灾难性后果,如果它们都在同一个盒子上。所以我至少会将 MongoDB 与 Redis/Play 分开。

如果您计划使用 Redis 进行缓存,将它与 Play 服务器放在同一个盒子上是有意义的。 Redis 会使用内存,但 CPU 低。播放会使用 CPU,但不会占用太多内存。所以看起来很合适。另外,我不确定 Play 是否可行,但如果您使用 unix 域套接字而不是 TCP 环回连接到 Redis,您可以免费获得大约 50% 的吞吐量。

关于mongodb - 为服务/数据/缓存部署多个实例的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8641784/

相关文章:

c++ - 开源项目通常是如何组织和部署的?

javascript - 将 Nodejs 应用程序部署到 Azure 的最佳实践

ruby-on-rails - 在rails控制台中加载Capistrano的环境

node.js - Redis 的 Nodejs 对象文档模型

python - 获取 pymongo 中导致 DuplicateKeyError 的 id

javascript - 尝试使用 NodeJS 通过 POST 请求将多个文档/记录插入 MongoDB

node.js - 类型错误 : userDetails. findAll 不是函数

redis - 使用 predis SCAN 时的无限循环

javascript - PHP:最佳前进方式 [序列化、对象、Redis]

php - PHP 中错误的时区 MongoDate