Cassandra中的分区键

时间:2014-12-02 02:36:45

标签: cassandra

如果在我的cassandra CF中,RowKey是(a,b,c)并且我的数据高度倾斜,其基数只是一个。如果我的复制因子为1,整个数据是否会驻留在我的cassandra集群的单个节点上?

此外,如果该节点已关闭,我将获得什么异常?

2 个答案:

答案 0 :(得分: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))表示abc的完整组合用于决定正确的节点。

不在第一组内括号中的所有变量都充当聚类键,并确定行中的数据的排序顺序,但不确定该行所在的节点。

答案 1 :(得分:1)

我不了解您的架构。如果您发布与您的问题相关的CQL DDL和cassandra.yaml配置,则解决方案将很明确。假设您的群集有4个节点(节点A,B,C,D),复制因子为1,将分区器作为任何随机分区器,并且您的架构如下所示,您可以参考答案。

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

但是,select * from demotable where a='value2'将起作用,因为它驻留在节点B上。

不幸的是,select * from demotable也无法运作。因为可能有一些机会在Node A中有一些记录。因此,如果任何一个节点因复制为1而关闭,那么select all查询将无法工作。