Cassandra:分区键是否也用于聚类?

时间:2017-09-21 09:44:14

标签: cassandra datastax

假设我有一个这样的主键:primary key (PK, CK)

根据我所读到的内容(参见参考资料),我想我可以松散地描述Cassandra使用PKCK的方式如下 - PK将用于决定哪个节点( s)数据应该转到,CK将用于该节点内数据的聚类(也称为排序)。

然后,似乎PK未用于聚类节点内的数据并且听起来不对。如果我有一个只有PK的简单主要内容怎么办? Cassandra是否只在节点之间分配数据而不是在每个节点内订购数据,因为没有聚类列?

参考:

2 个答案:

答案 0 :(得分:2)

  

然后,似乎PK不用于聚类节点内的数据和   这听起来不对。如果我有一个只有PK的简单主要怎么办?   Cassandra只会跨节点分发数据而不是订购数据   因为没有聚类列,所以在每个节点内?

好问题。我们来试试吧。我将创建一个简单的表格并INSERT一些数据:

aploetz@cqlsh:stackoverflow> CREATE TABLE programs 
                             (name text PRIMARY KEY, data text);
aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Tron');
aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Yori');
aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Quorra');
aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Clu');
aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Flynn');
aploetz@cqlsh:stackoverflow> INSERT INTO programs (name) VALUES ('Zuze');

现在,让我们运行一个应该回答你问题的查询:

aploetz@cqlsh:stackoverflow> SELECT name, token(name) FROM programs;

 name   | system.token(name)
--------+----------------------
  Flynn | -1059892732813900311
   Zuze |  1815531347795840810
   Yori |  2854211700591734382
 Quorra |  3079126743186967718
   Tron |  6359222509420865788
    Clu |  8304850648940574176

(6 rows)

正如您所看到的,name按顺序排列 ,它们是分区键和单独的PRIMARY KEY。但是,我的查询在token()上运行name函数,该函数显示分区键的哈希值(在这种情况下为name)。结果按此排序。

因此,为了回答您的问题,Cassandra通过分区键的散列值对其分区进行排序。请注意,此顺序在整个群集中维护,而不仅仅在单个节点上维护。因此,无论群集中的节点数量如何,未绑定查询的结果(不建议在多节点配置中运行)将按分区键的散列值排序。

答案 1 :(得分:1)

由于表的所有数据都将通过分区键的顺序写入相同的SSTable。所以是的,他们已经分类了。

我认为您所问的是为什么您不能像使用群集密钥一样使用主键。例如,您不能在分区键上执行少于(<)或大于(>)的操作。由于一个节点没有所有分区键,因此这种类型的查询必须检查群集中的所有节点,以查看它们是否具有与您的查询匹配的任何分区键。