1

Cassandra 中以下查询的执行路径是什么: - 来自一个 Cassandra 节点的 5 行,带有令牌 1(Node1) - 来自一个 Cassandra 节点的 5 行,带有令牌 2(Node2) - 来自一个 Cassandra 节点的 5 行,带有令牌 3(Node3 )

客户端向 Node1 发送查询。- 这个查询在 3 个节点中执行的顺序是什么?- Node1 如何将此查询传播到 node2 和 node3?- Node1 合并来自 node2 和 node3 的行以提供完整的查询结果?

4

1 回答 1

4

您可以发出两种类型的查询来从多个分区检索数据(我将使用 CQL 术语 - 分区是过去称为行的内容)。您使用哪一个取决于您是否知道分区键。

我将假设一个没有任何集群键的简单模式:

CREATE TABLE mytable (key text PRIMARY KEY, field text);

如果你不知道分区键,你可以发出

SELECT * FROM mytable LIMIT 15;

这将返回按分区哈希排序的前 15 行。因为它是按散列排序的,所以这种查询通常只有在您想要翻阅所有数据时才有用。

接收查询的节点(此查询的协调器)首先将其转发到具有最低令牌和副本的节点。它们最多返回 15 行。如果更少,则协调器将转发到具有第二低令牌和副本的节点。这种情况会一直发生,直到找到 15 行,或者直到所有节点都已联系。因此,此查询可能会联系集群中的每个节点。

复制因子大于 1 时,可能会返回冲突的结果。协调器查看时间戳以合并结果并仅将最新的返回给客户端。

如果您确实知道分区键,则可以使用

SELECT * FROM mytable WHERE key in ('key1', 'key2');

协调器将其视为接收单独的查询:

SELECT * FROM mytable WHERE key = 'key1';
SELECT * FROM mytable WHERE key = 'key2';

它将消息转发到为每个键保存数据的节点。每个键有一个,因此这些查询是并行执行的。响应在协调器上收集,合并以便只保留最新的,然后发送给客户端。

于 2013-09-05T09:10:30.717 回答