在没有分区键的情况下查询 Cassandra

Jet*_*Jet 8 cassandra

我阅读了 Cassandra 的文档,了解它在查询数据时执行的内部步骤。看起来 Cassandra 依赖 Partitioner 和 Replication Strategy 来处理查询。我仍然对 Partitioner 需要知道 Partition Key 感到困惑。如果查询具有分区键,则内部查询过程看起来很简单。但是,如果查询需要结果集而不是像下面这样的确定性行。

SELECT * FROM <table>
Run Code Online (Sandbox Code Playgroud)
  1. 在这种情况下,当WHERE子句中没有指定 Primary Key 时,Coordinator 如何知道将请求发送到哪些节点?

  2. 如果返回多行,可能分布在不同的节点,这些行如何聚合返回给客户端?

Aar*_*ron 7

当 WHERE 子句中没有指定 Primary Key 时,Coordinator 如何知道将请求发送到哪些节点?

  1. 它没有。(选择为节点的)协调器必须扫描每个节点上该表的所有行。这就是未绑定查询被认为是 Cassandra 中的反模式的原因,因为它们会占用大量网络时间。特别是在较大的集群中。此外,协调器将不得不做额外的工作,因为它必须组装并返回结果集。

如果返回多行,可能分布在不同的节点,这些行如何聚合返回给客户端?

  1. 它们并没有真正聚合,因为它们是按其分区键的散列令牌值按顺序返回的。

考虑对名为 的表运行未绑定查询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 使某些节点主要负责某些令牌范围。然后,协调器按该顺序返回结果集就变成了一项简单的任务。如果有多行具有相同的分区键,结果将另外按每个分区键的集群键进行排序。