尽管我有很多编写代码的经验。我真的没有太多部署东西的经验。我正在编写一个项目,该项目使用 mongodb 进行持久化,使用 redis 进行元缓存,并使用 play 来提供页面服务。我正在决定是购买专用服务器还是从 amazon/linode 购买多个小型/中型实例(每个实例一个,mongo、redis、play)。我想到了以下权衡取舍,我想知道是否有人可以添加到列表中或提供进一步的见解。我倾向于 (b) 从 linode 和亚马逊购买两套实例,因此如果其中一套出现故障,它将故障转移到另一家供应商。此外,如果有人有任何关于部署 scala/maven 集群或工具的提示,非常感谢。
A.把一切都放在一个实例中
优点:
- 数据库和页面 servlet(同一主机)之间的速度更快。
- 更便宜。
- 需要保护的端点更少。
缺点:
- 更难管理。 (在我看来)
- 更难升级单个模块。如果存在安装问题,可能会导致整个系统崩溃。
B.将每个模块(mongo、redis、play)放在不同的实例中
优点:
- 分片更容易。
- 更容易为单一目的创建集群。 (即 redis 集群)
- 更容易在模块之间分配资源。
- 不太可能所有事情同时失败。
缺点:
- 模块之间的带宽 -> $
- 保护每个连接和端点。
最佳答案
我只能评论技术方面(不是成本、可维护性等...)
没有提到专用实例是物理盒子,还是简单的大型虚拟机。如果应用程序生成大量到 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/