Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra中的分区密钥_Cassandra - Fatal编程技术网

Cassandra中的分区密钥

Cassandra中的分区密钥,cassandra,Cassandra,如果在我的cassandra CF中,RowKey是(a,b,c),我的数据是高度倾斜的,基数是a,比如说只有一个。如果复制因子为1,整个数据是否会驻留在cassandra群集的单个节点上 另外,如果该节点已关闭,我将得到什么异常 如果您只有一个分区键和RF 1,那么如果行散列到的节点关闭,您将无法访问数据。您将得到一个不可用的异常 主键((a),b,c)或主键(a,b,c)意味着只有a决定数据驻留在哪个节点上 Primary Key((a,b),c)意味着您正在使用复合键以及a和b的组合来确

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


另外,如果该节点已关闭,我将得到什么异常

如果您只有一个分区键和RF 1,那么如果行散列到的节点关闭,您将无法访问数据。您将得到一个不可用的异常

主键((a),b,c)
主键(a,b,c)
意味着只有
a
决定数据驻留在哪个节点上

Primary Key((a,b),c)
意味着您正在使用复合键以及
a
b
的组合来确定节点所在的位置

主键((a,b,c))
表示使用
a
b
c
的完整组合来确定正确的节点


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

如果您只有一个分区键和RF 1,那么如果行散列到的节点关闭,您将无法访问数据。您将得到一个不可用的异常

主键((a),b,c)
主键(a,b,c)
意味着只有
a
决定数据驻留在哪个节点上

Primary Key((a,b),c)
意味着您正在使用复合键以及
a
b
的组合来确定节点所在的位置

主键((a,b,c))
表示使用
a
b
c
的完整组合来确定正确的节点


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

我不知道你的模式。如果您发布与您的问题相关的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(例如),这三行将转到
节点A
。如果
value2
的哈希值为29(例如),则此行将转到
节点B

如果该节点关闭,我将得到什么异常?

让我们考虑节点A是否下降,节点的其余部分是否上升。

select*from demodable在class='value1'
不起作用的地方,您将得到
不可用异常

但是,
select*from demodable,其中a='value2'
将起作用,因为它位于节点B上


不幸的是,
select*from demograble
也将不起作用。因为节点a中可能有一些记录。因此,如果任何一个节点的复制为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(例如),这三行将转到
节点A
。如果
value2
的哈希值为29(例如),则此行将转到
节点B

如果该节点关闭,我将得到什么异常?

让我们考虑节点A是否下降,节点的其余部分是否上升。

select*from demodable在class='value1'
不起作用的地方,您将得到
不可用异常

但是,
select*from demodable,其中a='value2'
将起作用,因为它位于节点B上


不幸的是,
select*from demograble
也将不起作用。由于节点a中可能有一些记录。因此,如果任何一个节点的复制为1,则“全选”查询将无法工作。

感谢RussS的回答。在这里