我阅读了 Cassandra 的文档,了解它在查询数据时执行的内部步骤。看起来 Cassandra 依赖 Partitioner 和 Replication Strategy 来处理查询。我仍然对 Partitioner 需要知道 Partition Key 感到困惑。如果查询具有分区键,则内部查询过程看起来很简单。但是,如果查询需要结果集而不是像下面这样的确定性行。
SELECT * FROM <table>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当WHERE
子句中没有指定 Primary Key 时,Coordinator 如何知道将请求发送到哪些节点?
如果返回多行,可能分布在不同的节点,这些行如何聚合返回给客户端?
当 WHERE 子句中没有指定 Primary Key 时,Coordinator 如何知道将请求发送到哪些节点?
如果返回多行,可能分布在不同的节点,这些行如何聚合返回给客户端?
考虑对名为 的表运行未绑定查询crew
,分区键为crewname
。当我token()
在该键上运行 CQL函数时,您可以看到返回的行确实按其令牌排序。
aploetz@cqlsh:presentation> SELECT crewname,token(crewname),firstname,lastname
FROM crew;
crewname | token(crewname) | firstname | lastname
----------+----------------------+-----------+-----------
Simon | -8694467316808994943 | Simon | Tam
Jayne | -3415298744707363779 | Jayne | Cobb
Wash | 596395343680995623 | Hoban | Washburne
Mal | 4016264465811926804 | Malcolm | Reynolds
Zoey | 7853923060445977899 | Zoey | Washburne
Sheppard | 8386579365973272775 | Derial | Book
(6 rows)
Run Code Online (Sandbox Code Playgroud)
它以这种方式工作,因为 Cassandra 使某些节点主要负责某些令牌范围。然后,协调器按该顺序返回结果集就变成了一项简单的任务。如果有多行具有相同的分区键,结果将另外按每个分区键内的集群键进行排序。