2011-12-27 34 views
2

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

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

  1. 更快的数据库和网页的servlet(同一主机)之间的速度。
  2. 便宜。
  3. 较少的端点以确保安全。

缺点

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

B.把每个模块(蒙戈,Redis的,播放)在不同的情况下
优点:

  1. 分片更容易。
  2. 更容易为一个目的创建群集。 (即redis集群)
  3. 更容易在模块之间分配资源。
  4. 不太可能一切都会一次失败。

缺点:

  1. 模块之间的带宽 - > $
  2. 固定每个连接和结束点。

回答

2

我只能对技术方面提出意见(不是成本,可维护性等)

它没有提到的专用实例是物理盒子,或只是一个大的虚拟机。如果应用程序向MongoDB或Redis生成大量往返,则差异将非常显着。

使用虚拟机,I/O成本,操作系统调度和系统调用更高。这些元素往往代表了MongoDB或Redis等高效远程数据存储的性能成本中的重要部分,虚拟化费用对他们来说更高。

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

如果您打算使用Redis进行缓存,将其保留在与Play服务器相同的框中是有意义的。 Redis将使用内存,但CPU很低。 Play将使用CPU,但内存不多。所以它看起来很合适。另外,我不确定Play是否可以使用,但如果您使用unix域套接字连接到Redis而不是TCP环回,则可以免费获得大约50%的吞吐量。