2012-01-09 62 views
9

我們有一個JAVA網絡應用程序,它使用postgres(單個數據庫與從屬)來存儲所有重要數據。雷迪斯,蒙戈或Hazelcast?

我們現在正從單一服務器設置轉移到多臺服務器,因此我需要做一些更改以解決新的需求。

1)非粘性會話ID用於負載平衡和分區容限。

2)可從所有Web服務器訪問的頻繁讀取數據緩存(在內存/ Memcache中)。

3)隊列(電子郵件,短信,通過羣集執行的任務)。通常它們都必須通過xml api或屏幕抓取來執行。
避免重複處理任務很重要,但有時可能發生:-)

4)持久存儲API請求和響應(大量XML,大量行但列數很少)。 (可能通過刪除舊的請求和響應來保存數據集來歸檔)。

5)登錄到一個共同的地方。桌子將繼續增長。另外我需要一個工具來訪問生產日誌而不停止它們。根據時間和/或搜索字符串進行某種搜索應該是可能的。

我想要一個解決方案來滿足所有這些要求,並根據我的個人偏好查看redis,mongo和hazelcast作爲可能的替代方案。

其他重要注意事項: 1)少入侵我們的代碼。 2)簡單的備份/複製策略。至少主奴隸。 3)可管理性,社區並經過測試(在生產中運行)。

哪些能夠執行所有或大部分功能和要求?

編輯 - 我做了什麼

  1. Redis的支持會話管理器tomact。
  2. Redis for caching
  3. Jesque(Respue的java版本)支持redis。
  4. Postgres的
  5. SLF4J通過Log4j2

回答

4

支持我可以解決從MongoDB的角度看其中的一些。

我注意到的第一件事情是,您正在從單個服務器設置移動到多個服務器設置。 MongoDB使設置複製和分片非常容易。反過來,複製和分片以及一些Mongo的其他功能,可以幫助您實現很多你想要做的事情。

首先,來看看對位的文檔,以獲得一點感覺:

Replica SetsSharding

根據自己的需要一些其他的想法:

  • 相比其他使用不同的數據存儲進行縮放的方法 mongo用商品硬件水平縮放的方法是 設置,縮放和維護非常簡單。這意味着您可以花更多時間在構建應用程序上花費更多時間,而不是成爲DBA。
  • 如果你使用mongo,你也可以跳過一個緩存層。 MongoDB使用內存映射文件,這意味着如果您的工作集 可以保存在物理內存中,則基本上已經有內存緩存 。
  • MongoDB非常適合日誌記錄。用戶通常不需要爲此類應用程序編寫安全的 ,因此如果您堅持使用默認的「即燃即用」模式進行寫入,性能將非常出色。
  • 然而,與典型的對象關係映射器相比,這是否意味着它會入侵您的代碼更少,因此Mongo對您的數據的干擾要小得多。它能夠將數據存儲在自然可用狀態下,即對象!

希望幫助,歡呼。

+0

截至目前我對分佈式數據庫不感興趣。當我們需要擴大規模時,Mongo似乎更像是未來的postgres競爭對手。 – gladiator 2012-01-10 15:15:37

2

我會說使用sql。因爲你希望關係數據庫已經完善多年的一切。就我所見,您希望數據解決方案不是用於「特定」目的(這是NOSQL試圖涵蓋的目的),而是用於「一體式」方案。這就是SQL的用途。

的MongoDB是最接近數據存儲,如果你想從那些3選擇您要命名,但再次:使用SQL

0

你是對的,Redis將解決前三個要求 - 非粘性會話,緩存和隊列。

至於集中式日誌記錄,這不是一個簡單的用例,但可以在Redis上完成,這裏是一個blog post,它解釋瞭如何。請注意,NoSQL大師Alex Popescu對this post中的方法提出了一些保留。

至於持久性,這裏是關於persistence options的Redis.io的概述 - 有一些問題,但是可行。