2014-12-02 149 views
1

如果在我的cassandra CF中,RowKey是(a,b,c),並且我的數據高度傾斜於一個存在的基數,比如說只有一個。如果我的複製因子是1,是否將整個數據駐留在我的cassandra集羣的單個節點上?在Cassandra中的分區鍵

此外,如果該節點關閉,我會得到什麼異常?

+0

你是什麼意思的行鍵。你的意思是主鍵?發佈表的CQL DDL可能會更清晰。 – Raedwald 2014-12-02 08:13:08

回答

3

如果您只有一個分區鍵和RF 1,那麼如果該行所經過的節點已關閉,您將無法訪問您的數據。你會得到一個不可用的例外。

http://www.datastax.com/drivers/java/2.1/com/datastax/driver/core/exceptions/UnavailableException.html

Primary Key ((a),b,c)Primary Key (a,b,c)意味着只有a確定該數據駐留在哪個節點。

Primary Key ((a,b),c)意味着您使用的是組合鍵,並且ab的組合決定了節點所在的位置。

Primary key ((a,b,c))表示a,bc的完整組合用於決定正確的節點。

所有不在第一組內部括號中的變量充當集羣密鑰,並確定排在行內的數據的排序順序,但不確定該行放置在哪個節點上。

+0

感謝RussS的回答。在這種情況下,整個數據會駐留在一個節點上嗎?行密鑰的'b'和'c'不會在決定數據傳輸到哪個節點時發揮任何作用? – 2014-12-02 07:04:03

+0

已更新的答案。只有部分複合分區鍵會影響節點的位置。 – RussS 2014-12-02 15:52:00

1

我不知道你的模式。如果您發佈與您的問題相關的CQL DDL和cassandra.yaml配置,該解決方案將很清晰。假設,如果你的集羣有4個複製因子爲1的節點(節點A,B,C,D),把分區器作爲任何分區器,並且你的模式有些像下面這樣想,你可以參考答案。

CREATE TABLE demotable(
    a text, 
    b text, 
    c text, 
    d text, 
    PRIMARY KEY(a,b,c) 
); 

在上述架構中,分區鍵是a,聚集鍵是b。對於每個插入,分區鍵將確定要插入的行的位置。讓我們假設,節點A持有分區鍵範圍0-25,節點B持有分區鍵範圍26-50,節點C持有分區鍵範圍51-75,節點D持有分區鍵> 76的範圍。考慮下面的插入語句,

insert into demotable (a,b,c,d) values ('value1','value100','value101','value102','value103'); 
insert into demotable (a,b,c,d) values ('value1','value200','value201','value202','value203'); 
insert into demotable (a,b,c,d) values ('value1','value300','value301','value302','value303'); 
insert into demotable (a,b,c,d) values ('value2','value400','value401','value402','value403'); 

前三查詢有一個分區鍵value1和第四查詢有一個分區鍵value2。如果散列值爲value1爲12(僅舉例),則這三行將進入Node A。如果value2的散列值是29(僅舉例而言),則該行將轉到Node B

If that node is down, What exception will i get?

讓我們考慮一下,如果節點A是向下和節點剩下的就是。

select * from demotable where a='value1'將不會工作,你會得到Unavailable Exception

但是,因爲它駐留在節點B

不幸的是,select * from demotable也將不會工作​​會工作。因爲在節點A中可能有一些記錄。因此,如果任何一個節點關閉,複製爲1,則選擇所有查詢將無法工作。

相關問題