2012-09-13 68 views
3

我來自RDBMS背景,設計一個Cassandra作爲後端的應用程序,我不確定我設計的有效性和可擴展性。Cassandra DB Design

我正在研究書籍/電影等的某種評價/反饋應用程序。由於卡桑德拉具有靈活的列族的概念(稀疏結構),我想用下面的架構:

user-id (row key): book-id/movie-id (dynamic column name) - rating (column value) 

如果我這樣做,這樣一來,我會最終擁有數以百萬計的列(這本來是行在RDBMS)雖然沒有本質上與行鍵相關聯,例如:

user1: {book1:Rating-Ok; book1023:good; book982821:good} 
user2: {book75:Ok;book1023:good;book44511:Awesome} 

由於所有列族都存儲在一個單一的文件,我不知道這是否是一個可擴展的設計(或設計可言!)。此外,可能會有像"pick all 'good' reviews of 'book125'"這樣的查詢。 我應該使用什麼方法?

回答

2

此設計具有完美的可擴展性。 Cassandra以稀疏的形式存儲數據,因此空單元不消耗磁盤空間。

缺點是卡桑德拉在按價值進行索引時不是很好。有二級索引,但它們應該只用於索引一列或兩列,而不是每列數百列。

有兩個選項來解決這個問題:

  • 物化視圖(描述,例如,在這裏:http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/)。這允許構建一些預定義的查詢,可能非常複雜。
  • 臨時查詢可以通過某種映射/縮減作業實現,它可以有效地迭代整個數據集。這聽起來很可怕,但仍然非常快:Cassandra將所有數據存儲在SSTables中,並且可以實現這種迭代以順序掃描數據文件。從查詢的一組期望的
2

啓動和組織你的列族來支持這些觀點。尤其是在涉及的領域非常少的情況下,每個CF都可以以自己的數據索引視圖的方式低價操作。在提取期間,密鑰最終將數據分區到一個特定的Cassandra節點,該節點可以按照預定順序將一組寬行快速地傳輸到您的應用服務器。這對Cassandra的優勢之一起到了作用,因爲與在RDBMS表的索引搜索中圍繞各種軌道和扇區進行的彈跳相比,物理介質上的讀取碎片(當未被緩存時)非常低。

一個可用時是選擇你的關鍵段中的數據,從而在該段中的所有列的全掃描是一個合理的命題,和良好的粗糙適合您的查詢有用的方法。然後,即使您的客戶端(應用程序服務器)執行了過濾,也可以過濾不需要的內容。所有對電影的評論都是一個很好的例子。即使您過濾了正面評論或僅提供最近的評論或摘要,您仍然可以合理地獲取該密鑰的所有行,然後拋棄不需要的內容。

0

另一種選擇是,如果你能弄清楚(按類別,按時間)如何對數據進行分區,playOrm提供做S-SQL變成一個分區,這是非常快的解決方案。它非常類似於RDBMS,除非您對數據進行分區以保持可伸縮性,並且可以擁有任意數量的分區。分區可以包含數百萬行(儘管在分區中我不會超過1000萬行)。

以後, 院長