2

我有一個web應用程序 - 一個簡單的web應用程序存檔文件 - 它有幾個存儲適配器,用於不同的存儲類型,即。 MongoDB和CouchDB。通過使用這個應用程序,我可以使用我編寫的Web服務將數據存儲/查詢到這些數據庫。目前,每個應用程序只能有一個數據庫實例,不能有多個數據庫實例阻止我進行並行處理。分佈式處理的不同場景


我想要的是在幾臺機器上運行我的應用程序。除此之外,我想編寫一個UI,使客戶端能夠在不知道數據庫類型/地址的情況下存儲/查詢數據。

我有兩種不同的情況,想問你他們哪一個是更好的方法來做到這一點,爲什麼。


1)比方說,我有跑三個單數據庫三個服務器 - CouchDB的。我可以將我的應用程序上傳到這些服務器,然後在我的UI或應用程序上方的幫助下,我可以定義服務器映射,以便我可以存儲和查詢數據。

enter image description here

正如你看到的上面,數據庫和應用程序位於同一服務器上,所以他們是遙遠。


2)假設三個服務器仍在遠程運行,但在這種情況下,我的應用程序是本地的。我使它能夠接受多個數據庫實例。

enter image description here


其實我更喜歡第一個,因爲在這種情況下,我不會需要延長我的應用程序,但我想聽聽你想想看。如果你能爲這種分佈式場景提供一些資源,我會很高興 - 我根本沒有這方面的經驗。

回答

2

請看文章,描述爲Instagram architecture。知道3名工程師每天處理1,500萬張照片的15-25百萬用戶是非常有趣的。

此外,我會建議interesting博客,它描述了流行的網絡資源的可擴展性不同的解決方案:

有很多的信息。

但最常見的事情是:

而且即使你可能會發現解釋每個這些,我想根據您的要求專注於最後一個。

當您希望使您的應用程序具有水平可伸縮性時,您需要將每個集羣視爲單獨的邏輯模塊,而不管實際數量的服務器涉及到集羣。 F.E.對於您的Web應用程序,您可以設置該應用程序的多個實例並在它們之前設置一個負載平衡器。因此用戶可以訪問單個入口點(例如http://mysite.com),同時實際實例可能是任意的。

如果需要相互之間的協作情況,那麼你需要避免內存存儲,而是用「鍵值」存儲器,如Redis,有消息經紀人一起,如ActiveMQRabbitMQ或雲版本Iron.IO

數據存儲你還需要考慮作爲單一的入口點,例如(f.e.MongoDB支持開箱即用的auto-sharding,並且大多數NoSQL解決方案也有它 - CouchDB,HBase)。 所以基本上你會調用一些分片控制器,它根據特定的分片鍵重定向到相應的實例。但請注意,通常分片可能是非常不平凡的事情,因此在大多數情況下,當您處理RDBMS時,您需要使用垂直可伸縮性。

考慮到上述的一切我會建議你這樣的結構:

simple schema

可以肯定地全部服務器都必須靠近對方身體(在同一個數據中心的遠東)。但是如果你打算在全球範圍內使用你的應用程序,那麼你需要按照更少的延遲來分割你的實例。這裏是關於服務器配置的相當有趣的講座(儘管它是關於MongoDb的,我相信一些方法也可能對你的情況有所幫助):https://www.youtube.com/watch?v=TZOH92mZIN8

但是如果不需要使用你所有的服務器來分發「map/reduce 「計算,併爲了得到結果,你只需要一個特定的服務器的實例,在這種情況下,我相信場景#1是相當合適,更好地滿足您的需求(如果您在實例之前設置負載平衡器)。

+0

感謝您的解釋,不幸的是不能給你的賞金,因爲它是封閉的。但真的很感謝細節 – anvarik 2013-03-24 10:46:47

+0

沒問題,賞金並不那麼重要。我希望這對未來有用。 – n1ckolas 2013-03-24 11:01:20