2012-08-30 69 views
3

我們來自RDBMS背景,我們試圖做的是將現有數據存儲移植到cassandra,以利用分佈式數據庫的強大功能。 我們的要求是存儲相對於某個鍵的值,可能鍵是時間(計劃使用紀元時間)並檢索鍵範圍內的值Cassandra Cql範圍選擇

對於測試,我們創建了ColumnFamily並使用cql插入了Data (通過cqlsh):

CREATE COLUMNFAMILY Log(KEY int PRIMARY KEY,Val1 varchar,Val2 varchar); 

INSERT INTO Log (KEY,val1, val2) VALUES (1,'673153106.00','448768737.33'); 
INSERT INTO Log (KEY,val1, val2) VALUES (2,'673153106.50','448768737.67'); 
INSERT INTO Log (KEY,val1, val2) VALUES (3,'673153107.00','448768738.00'); 
INSERT INTO Log (KEY,val1, val2) VALUES (4,'673153107.50','448768738.33'); 
INSERT INTO Log (KEY,val1, val2) VALUES (5,'673153108.00','448768738.67'); 
INSERT INTO Log (KEY,val1, val2) VALUES (6,'673153108.50','448768739.00'); 
INSERT INTO Log (KEY,val1, val2) VALUES (7,'673153109.00','448768739.33'); 
INSERT INTO Log (KEY,val1, val2) VALUES (8,'673153109.50','448768739.67'); 
INSERT INTO Log (KEY,val1, val2) VALUES (9,'673153110.00','448768740.00'); 
INSERT INTO Log (KEY,val1, val2) VALUES (10,'673153110.50','448768740.33'); 

但我們的選擇沒有返回正確的數據

select * from Log where KEY>4 and KEY<9; 

KEY | val1 | val2 | 10 | 673153110.50 | 448768740.33 | 8 | 673153109.50 | 448768739.67 |

select * from Log where KEY>4 and KEY<9; 

請求無效:結束鍵的MD5後,按開始鍵的MD5排序。這不是允許的 ;你可能不應該指定結束鍵可言,下 RandomPartitioner

難道我們做錯了什麼?。就是有什麼解決方法使用randompartition

回答

14

選擇鍵範圍之間的值有一個很好的理由卡桑德拉禁止這種查詢。目前,通過使用主鍵的md5總和,您的所有日誌條目均勻分佈在您的節點上。支持你的查詢意味着Cassandra必須查詢所有節點,檢索所有條目,將它們存儲在磁盤上並對它們進行排序。這需要在您執行此查詢時完成。

如果您希望能夠執行此查詢,您可以使用Order-Preserving-Partioner,但也不建議這麼做,因爲如果您按順序插入數據,則所有查詢都會碰到單個節點,從而導致不需要的熱點。

通常的解決方案是使用複合主鍵(例如index_name + timeuuid)。這將確保您的索引通過使用索引名的md5sum均勻分佈在整個集羣中。但訪問索引(例如SELECT * FROM log WHERE index_name = ? AND time >= ? AND time < ?)仍然有效,因爲數據已經按照排序順序存儲在負責md5sum(index_name)的節點上。 index_name通常是可幫助您分區數據的一些關鍵字 - user_id或application_id可能是一個很好的候選項。

如果您認爲單個節點的索引可能會較大,那麼您可以通過將當前年份和月份添加到index_name來調整以前的架構。請閱讀更多信息,以下兩篇文章: