小编典典

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

redis

尽管我有很多编写代码的经验。我真的没有太多的部署经验。我正在编写一个项目,该项目使用mongodb进行持久化,使用redis进行元缓存,并使用其播放页面。我正在决定是否要购买专用服务器,还是要从亚马逊/
linode购买多个小型/中型实例(每个,mongo,redis,play一次)。我想到了以下折衷方案,我想知道是否有人可以添加到列表中或提供进一步的见解。我倾向于(b)从linode和amazon购买两组实例,因此,如果其中之一发生故障,它将故障转移到另一提供商。另外,如果有人有任何部署scala
/ maven群集的技巧或这样做的工具,也非常感谢。

A.将所有东西都放在一个实例中
优点:

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

缺点

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

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

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

缺点:

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

阅读 423

收藏
2020-06-20

共1个答案

小编典典

我只能评论技术方面的内容(不能评论成本,可维护性等)

没有提及专用实例是物理盒还是大型VM。如果应用程序产生了许多到MongoDB或Redis的往返,那么两者之间的差异将非常显着。

使用虚拟机时,I /
O,操作系统调度和系统调用的成本较高。这些元素往往代表着高效的远程数据存储(如MongoDB或Redis)的性能成本中的重要组成部分,因此虚拟化的代价更高。

从系统角度来看,如果希望MongoDB数据库大于可用内存,则不会将MongoDB和Redis /
Play放在同一盒子上。MongoDB将数据文件映射到内存中,并依靠操作系统执行内存交换。专为此设计。其他过程则没有。如果将MongoDB放在同一盒子中,则由MongoDB引起的交换将对Redis和Play响应时间造成灾难性后果。因此,我至少会将MongoDB与Redis
/ Play分开。

如果您打算使用Redis进行缓存,则将其与Play服务器保持在同一盒子上是很有意义的。Redis将使用内存,但CPU较低。播放将使用CPU,但不会占用太多内存。因此,这似乎很合适。另外,我不确定Play是否可以提供这种服务,但是如果您使用unix域套接字而不是TCP回送连接到Redis,则可以免费获得约50%的吞吐量。

2020-06-20