Cassandra中以下查询的执行路径是什么: - 来自一个带有令牌1(Node1)的Cassandra节点的5行 - 来自一个带有令牌2(Node2)的Cassandra节点的5行 - 来自一个带有令牌3(Node3)的Cassandra节点的5行
客户端向Node1发送查询。 - 在3个节点中执行此查询的顺序是什么? - Node1如何将此查询传播到node2和node3? - Node1合并来自node2和node3的行以提供完整的查询结果?
答案 0 :(得分: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';
它将消息转发给保存每个密钥数据的节点。每个键有一个,因此这些查询是并行执行的。响应收集在协调器上,合并后只保留最新的响应,然后发送给客户端。