2014-12-02 156 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,则选择所有查询将无法工作。

相关问题