Cassandra:分区键也用于集群吗?
Cassandra: Is partition key also used in clustering?
假设我有一个这样的主键:primary key (PK, CK)
。
根据我阅读的内容(参见参考文献),我想我可以粗略地描述 Cassandra 使用 PK
和 CK
的方式如下 - PK
将用于决定哪个数据应该到达的节点,CK
将用于该节点内数据的聚类(也称为排序)。
然后,似乎 PK
没有用于节点内的集群数据,这听起来是错误的。如果我有一个只有 PK
的简单主节点怎么办?由于没有聚类列,Cassandra 是否只会跨节点分发数据而不在每个节点内对数据进行排序?
参考文献:
- https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_compound_keys_c.html
- Difference between partition key, composite key and clustering key in Cassandra?
因为 table 的所有数据都将按照分区键的顺序写入相同的 SSTables。所以是的,它们是排序的。
我认为您要问的是为什么不能像使用集群键那样使用主键。例如,您不能在分区键上执行小于 (<) 或大于 (>) 的操作。由于一个节点没有所有分区键,这种类型的查询必须检查集群中的所有节点,以查看它们是否具有与您的查询匹配的分区键。
Then, it seems PK is not used in clustering data within the node and
that sounds wrong. What if I have a simple primary with with just PK?
Will Cassandra only distribute data across nodes and not order data
within each node since there is no clustering column?
好问题。让我们试试这个。我将创建一个简单的 table 和 INSERT
一些数据:
aploetz@cqlsh:Whosebug> CREATE TABLE programs
(name text PRIMARY KEY, data text);
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Tron');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Yori');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Quorra');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Clu');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Flynn');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Zuze');
现在,让我们运行一个可以回答您问题的查询:
aploetz@cqlsh:Whosebug> 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
顺序肯定是而不是,也就是partition key和lone PRIMARY KEY。但是,我的查询 运行 是 name
上的 token()
函数,它显示分区键 的 散列值(name
在这个案例)。结果按那个排序。
因此,为了回答您的问题,Cassandra 通过分区键的散列值对其分区进行排序。请注意,此顺序在整个集群中维护,而不仅仅是在单个节点上。因此,未绑定查询的结果(不建议在多节点配置中 运行)将按分区键的哈希值排序,而不管集群中的节点数。
假设我有一个这样的主键:primary key (PK, CK)
。
根据我阅读的内容(参见参考文献),我想我可以粗略地描述 Cassandra 使用 PK
和 CK
的方式如下 - PK
将用于决定哪个数据应该到达的节点,CK
将用于该节点内数据的聚类(也称为排序)。
然后,似乎 PK
没有用于节点内的集群数据,这听起来是错误的。如果我有一个只有 PK
的简单主节点怎么办?由于没有聚类列,Cassandra 是否只会跨节点分发数据而不在每个节点内对数据进行排序?
参考文献:
- https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_compound_keys_c.html
- Difference between partition key, composite key and clustering key in Cassandra?
因为 table 的所有数据都将按照分区键的顺序写入相同的 SSTables。所以是的,它们是排序的。
我认为您要问的是为什么不能像使用集群键那样使用主键。例如,您不能在分区键上执行小于 (<) 或大于 (>) 的操作。由于一个节点没有所有分区键,这种类型的查询必须检查集群中的所有节点,以查看它们是否具有与您的查询匹配的分区键。
Then, it seems PK is not used in clustering data within the node and that sounds wrong. What if I have a simple primary with with just PK? Will Cassandra only distribute data across nodes and not order data within each node since there is no clustering column?
好问题。让我们试试这个。我将创建一个简单的 table 和 INSERT
一些数据:
aploetz@cqlsh:Whosebug> CREATE TABLE programs
(name text PRIMARY KEY, data text);
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Tron');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Yori');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Quorra');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Clu');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Flynn');
aploetz@cqlsh:Whosebug> INSERT INTO programs (name) VALUES ('Zuze');
现在,让我们运行一个可以回答您问题的查询:
aploetz@cqlsh:Whosebug> 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
顺序肯定是而不是,也就是partition key和lone PRIMARY KEY。但是,我的查询 运行 是 name
上的 token()
函数,它显示分区键 的 散列值(name
在这个案例)。结果按那个排序。
因此,为了回答您的问题,Cassandra 通过分区键的散列值对其分区进行排序。请注意,此顺序在整个集群中维护,而不仅仅是在单个节点上。因此,未绑定查询的结果(不建议在多节点配置中 运行)将按分区键的哈希值排序,而不管集群中的节点数。