2011-12-27 36 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%的吞吐量。