2012-04-23 65 views
6

關於選擇哪個NoSQL的另一個問題。 但是,我還沒有找到有人要求這種類型的目的,消息存儲...哪些爲消息存儲目的集羣了NoSQL DB?

我有一個二郎聊天服務器,我已經使用MySQL存儲朋友列表,並且「加入需要」信息。

我想存儲消息(該用戶沒有收到,因爲他處於脫機狀態......)並檢索它們。

我已經做了NoSQL的預選,由於它是面向RAM的範例,我不能使用像MongoDB這樣的東西,並且無法像其他的那樣集羣。 我了我的列表,3個選擇我想:

  • HBase的
  • 了Riak
  • 卡桑德拉

我知道他們的模型退出不同,使用的鍵/值之一,其他使用SuperColumns和co。

到目前爲止,由於它是Erlang穩定的客戶端庫,我對Riak有偏好。

我知道,我可以使用卡桑德拉與節儉,但似乎沒有使用Erlang很穩定(我還沒有得到很好的回報吧)

我真的不知道事情的HBase現在,只是知道它是存在的,並且基於Dynamo像Cassandra和Riak。

所以,這就是我需要做的:

  • 店從1到每個註冊用戶X的消息。
  • 獲取每個用戶存儲的消息數量。
  • 立即檢索來自用戶的所有消息。
  • 一次刪除來自用戶的所有消息。
  • 刪除是比X個月

現在,我真的很新的NoSQL的數據庫,我一直是一個MySQL的愛好者,這是所有的消息,爲什麼我問你這個問題,作爲一個新手,會有比我更有經驗的人可以幫我選擇哪一個更好,並且會讓我盡我所能去做,而不會有太多的麻煩......

謝謝!

+0

@BrianRoach:他們不似乎這麼認爲在這個問題上http://stackoverflow.com/questions/2892729/mongodb-vs-cassandra這是同一種問題。 – TheSquad 2012-04-23 19:41:27

+1

事實上,一個問題沒有被降低和關閉,因爲它應該已經不會影響......根據常見問題和元數據不適合的事實。此外,這是2年前 - 隨着其他網站的增加,事情已經發展。 – 2012-04-23 20:19:52

回答

7

我不能說Cassandra或Hbase,但讓我解決Riak部分。

是的,Riak會適合您的情況(我已經看到幾家公司和社交網絡將它用於類似的目的)。

要實現這一點,您需要簡單的Riak鍵/值操作,以及某種索引引擎。您的選項是(按優先順序粗糙):

  1. CRDT設置。如果您的1-N收集大小的大小合理(比方說,每個用戶少於50條消息或其他),則可以將子集合的密鑰存儲在CRDT Set Data Type中。

  2. Riak搜索。如果您的收藏大小很大,特別是如果您需要在任意字段中搜索對象,則可以使用Riak Search。它在後臺加速Apache Solr,並根據您定義的模式爲您的對象編制索引。它有非常棒的搜索,彙總和統計,地理空間功能等。

  3. 二級索引。您可以在eLevelDB storage back end之上運行Riak,並啓用Secondary Index(2i)功能。

運行一些性能測試,選擇最快的方法。就模式而言,我建議使用兩個存儲桶(用於您描述的設置):用戶存儲桶和消息存儲桶。

索引消息桶。 (通過關聯一個搜索索引,或通過2i存儲一個user_key)。這讓你做所有需要的操作(和消息日誌不必裝入內存):從1

  • 商店每個註冊用戶 X消息 - 一旦你創建一個User對象,並得到一個用戶密鑰,爲每個用戶存儲任意數量的消息很容易,他們會直接寫入消息桶,每條消息都存儲相應的user_key作爲輔助索引。
  • 獲取每個用戶存儲的消息數 - 沒問題。獲取屬於用戶的消息密鑰列表(通過搜索查詢,通過檢索保留密鑰的Set對象,或通過user_key上的2i查詢)。這可以讓你在客戶端得到點數。
  • 立即檢索來自用戶的所有消息 - 請參閱上一項。獲取屬於用戶的所有消息的密鑰列表(通過搜索,集合或2i),然後通過多次獲取每個密鑰的值來獲取這些密鑰的實際消息(所有官方Riak客戶端都具有multiFetch的能力,客戶端)。
  • 一次刪除用戶的所有消息 - 非常相似。獲取用戶的消息密鑰列表,在客戶端發出刪除消息。
  • 刪除所有超過X個月的郵件 - 您可以在日期上添加索引。然後,檢索所有超過X個月的消息密鑰(通過搜索或2i),併爲它們發出客戶端刪除。
+0

生活中有趣的事情......我發佈這個問題3年後,我開始另一個項目,並且需要回答一些問題。賠率是你回答他們!所以在這裏3年後,一個有效的問題和+1未來seing ;-) – TheSquad 2015-11-02 14:16:50

+0

很高興幫助! :) – 2015-11-03 15:22:36

+0

我編輯了這個答案,解釋了從那以後誕生的幾個新的Riak功能 - 具體來說就是搜索和數據類型。 – 2015-11-03 15:38:37

0

我根本不會跟Riak說話,但我會質疑你選擇放棄Mongo。只要您關閉日誌功能並且不要完全禁用RAM即可。

我對HBase有相當多的瞭解,聽起來它能夠輕鬆滿足您的需求。取決於你有多少用戶可能會過度殺傷。它平凡支持諸如爲每個用戶存儲許多消息之類的東西,並且具有寫入自動到期的功能。根據架構架構的方式,它可能是或不是原子的,但這對你的用例無關緊要。

缺點是有很多開銷來正確設置它。在站立HBase之前,您需要了解Hadoop,運行HDFS,確保您的namenode可靠等。

+1

我想MongoDB也是一個不錯的選擇,但我真的想要有一個基於Dynamo的模型(沒有單點故障),AFAIK MongoDB不是基於此,但我可能是錯的,是嗎?卡桑德拉的缺點是什麼? – TheSquad 2012-04-23 19:05:45

+0

我的想法並沒有因爲拋棄MongoDB而停止,但是現在,我還沒有真正確信它是羣集數據庫的最佳解決方案......看起來我現在選擇的3個最適合這個主體點,你不覺得? – TheSquad 2012-04-23 19:12:15

+0

當分片並且每個chard被複制時,Mongo都沒有SPOF。 HBase確實是HDFS NameNode。我對Cassandra的描述不夠了解,除了它沒有SPOF並且與HBase的能力非常相似。 – 2012-04-23 19:31:55

0

我建議使用像Riak或Couchbase這樣的分佈式鍵/值存儲,並將每個用戶的整個消息日誌作爲一個值序列化(二進制erlang條款或JSON/BSON)。

所以你usecases它看起來像:

  • 店從1到X消息的每個註冊用戶 - 當用戶上線時產生一個狀態gen_server,從存儲獲得和反序列化整條消息登錄啓動,接收新消息,將它們附加到它的日誌副本,在它終止的會話結束時,序列化已更改的日誌並將其發送到存儲。
  • 獲取每個用戶存儲的消息數 - 獲取註銷,反序列化,計數;或者也可以將商店計算在單獨的k/v對中。
  • 立即檢索來自用戶的所有消息 - 只需將其從存儲中取出即可。
  • 一次刪除用戶的所有消息 - 只需從存儲中刪除值。
  • 刪除所有超過X個月的郵件 - 獲取,過濾,放回。

顯而易見的限制 - 消息日誌必須適合內存。

如果您決定單獨存儲每條消息,它將需要從分佈式數據庫中檢索後對它們進行排序,如果您希望它們按照時間順序進行排序,所以它不會幫助處理大於內存的數據集。如果它是必需的 - 你會無論如何最終會有一些更棘手的計劃。

+0

不幸的是,消息日誌有很大的機會不適合內存...這就是爲什麼我可能會與卡桑德拉它列的數據庫看起來很有前途,如果它適用於Twitter的鳴叫,它會爲我工作.. (可以做得更多,可以做得更少;-) – TheSquad 2012-04-26 10:36:24

+0

你也可以將消息記錄分成多頁,其​​中一頁作爲一個值存儲。我沒有這方面的個人經驗,但它在Voxer的這次談話中描述:http://vimeo.com/52827773 – 2014-04-02 20:55:39