2013-07-30 89 views
3

最近我在cassandra中用不同的設計進行了一些性能測試。 我目前使用cassandra作爲寫密集型項目。但是,我將添加讀取密集型部分以使用select語句導出數據。cassandra複合節點,多節點上的複合鍵

我正在用下表做時間系列;

CREATE TABLE events (
    date text, 
    n int, // it could be 1,2,3 
    id timeuuid, 
    PRIMARY KEY ((date, n), id) 
); 

date|n爲分區鍵。爲了提高閱讀性能,我試圖從寬行的概念中獲得槓桿作用。在文件中,據說:

如果分區鍵是相同的,則它們被插入到同一個物理節點並擴大分區鍵的行。

因此,我使用n來平均分配行的情況下得到熱點,這是here;

但是,在多節點集羣中,當我插入以下內容時;

'2013-07-30'|1, some-timeuuid 
'2013-07-30'|1, another-timeuuid 

我看到它們不在同一個物理節點中。

我得到節點信息;

nodetool getendpoint keyspace columnfamily some-timeuuid

所以,不知何故,我想他們是在同一行,以提高讀取性能,但不能太寬在找兩個十億列的情況。 (這是列的大小限制)

那麼,有什麼想法發生了什麼?

回答

6

如果我沒有記錯的話,爲了找出在哪些節點的行存儲,則需要運行:

nodetool getendpoints keyspace columnfamily 2013-07-30:1

用你(複合分區/)行鍵,而不是你的欄鍵。

如果您使用的是SimpleStrategy令牌/副本計算,這將在內部發生:

您計算出密鑰的MD5哈希值。創建分配給環中節點的令牌 的排序列表。找到大於 哈希的第一個標記。這是第一個節點。列表中的下一個是取決於RF的複製品 。

(發現這個卡桑德拉郵件列表 http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/How-to-find-what-node-a-key-is-on-td6202253.html上)

+3

的複合隔膜是(根據評論更新我的答案。),你不應該把引號輪字符串,因爲他們將被列入關鍵。所以第一個例子應該是'nodetool getendpoints keyspace columnfamily 2013-07-30:1'。 – Richard

+1

顯然,'nodetool getendpoints'也爲不存在的鍵提供輸出。它在密鑰上運行算法後輸出物理節點ip。你對「getendpoints」的使用是正確的 – aacanakin