如果在我的cassandra CF中,RowKey是(a,b,c)并且我的数据高度倾斜,其基数只是一个。如果我的复制因子为1,整个数据是否会驻留在我的cassandra集群的单个节点上?
此外,如果该节点已关闭,我将获得什么异常?
答案 0 :(得分:3)
如果您只有一个分区键和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
的完整组合用于决定正确的节点。
不在第一组内括号中的所有变量都充当聚类键,并确定行中的数据的排序顺序,但不确定该行所在的节点。
答案 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查询将无法工作。