3

我有一个 Scylla 集群,其中包含 3 个节点和 1 个使用以下查询创建的表

CREATE TABLE id_features (
    id int PRIMARY KEY,
    id_feature_1 int,
    id_feature_2 int,

)

我从应用程序发出以下查询 SELECT * FROM id_features where id in (1,2,3,4...120); 该查询最多可以有 120 个 id。

在最坏的情况下,此查询是否会根据 id 的令牌值联系所有 3 个节点以获取 120 个 id 的数据?或者只联系 1 个节点来获取所有 id 的数据,并且多个节点仅用于高可用性

复制因子、一致性级别和负载平衡策略是否会在决定节点时起任何作用?

4

1 回答 1

4

此查询是否会根据 s 的令牌值联系所有 3 个节点id以获取数据

复制因子、一致性级别和负载平衡策略是否会在决定节点时起任何作用?

它在很大程度上取决于复制因子 (RF)、查询一致性和负载平衡策略等因素。具体来说,如果 RF < 节点数,则将根据哈希令牌值id和主要分配给这些令牌范围的节点联系多个节点。

但是,鉴于此声明:

或者只联系 1 个节点来获取所有 id 的数据,并且多个节点仅用于高可用性

...我感觉在这种情况下 RF=3。

如果应用程序配置为使用(默认)TokenAwarePolicy,那么是的,仅对于单键查询,可以将请求发送到各个节点。

但在这种情况下,查询使用的是IN运算符。基于 120 个潜在条目,查询无法确定发送查询的单个节点。在这种情况下,它TokenAwarePolicy只是作为其子策略 ( DCAwareRoundRobinPolicy) 的传递,它将选择LOCAL远处的一个节点作为“协调器”。然后,协调节点将承担路由副本请求和编译结果集的附加任务。

至于查询计划中是否使用非主副本,答案还是“视情况而定”。虽然负载平衡策略在实现上有所不同,但通常它们都会计算查询计划,其中:

  • 每个查询都不同,以平衡整个集群的负载;
  • 仅包含已知能够处理查询的主机,即既不忽略也不关闭;
  • 偏爱本地主机而不是远程主机。

取自:https ://docs.datastax.com/en/developer/java-driver/3.6/manual/load_balancing/#query-plan

因此,在 RF = 节点数的情况下,有时可能会使用单个节点来返回所有请求的副本。

专业提示

尽量不要将IN运算符与 120 个分区键条目的列表一起使用。这迫使 Cassandra 执行随机读取,它在顺序读取方面确实表现出色。如果这是应用程序真正需要执行的查询,请尝试:

  • 构建一个新表以更好地支持该查询模式。
  • 的条目不得超过两位数IN
于 2020-05-04T14:21:54.307 回答