在Cassandra中的分区键
如果在我的cassandra CF中,RowKey是(a,b,c),并且我的数据高度倾斜于一个存在的基数,比如说只有一个。如果我的复制因子是1,是否将整个数据驻留在我的cassandra集群的单个节点上?在Cassandra中的分区键
此外,如果该节点关闭,我会得到什么异常?
如果您只有一个分区键和RF 1,那么如果该行所经过的节点已关闭,您将无法访问您的数据。你会得到一个不可用的例外。
Primary Key ((a),b,c)
或Primary Key (a,b,c)
意味着只有a
确定该数据驻留在哪个节点。
Primary Key ((a,b),c)
意味着您使用的是组合键,并且a
和b
的组合决定了节点所在的位置。
Primary key ((a,b,c))
表示a
,b
和c
的完整组合用于决定正确的节点。
所有不在第一组内部括号中的变量充当集群密钥,并确定排在行内的数据的排序顺序,但不确定该行放置在哪个节点上。
感谢RussS的回答。在这种情况下,整个数据会驻留在一个节点上吗?行密钥的'b'和'c'不会在决定数据传输到哪个节点时发挥任何作用? – 2014-12-02 07:04:03
已更新的答案。只有部分复合分区键会影响节点的位置。 – RussS 2014-12-02 15:52:00
我不知道你的模式。如果您发布与您的问题相关的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,则选择所有查询将无法工作。
你是什么意思的行键。你的意思是主键?发布表的CQL DDL可能会更清晰。 – Raedwald 2014-12-02 08:13:08