IN Cassandra Where 子句中的查询

IN Query in Cassandra Where clause

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

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 的数据,多个节点仅用于高可用性

复制因子、一致性级别和负载平衡策略是否会在决定节点方面发挥作用?

Will this Query contact all 3 nodes based on the token value of ids to fetch data

Do the replication factor, consistency level, and load balancing policy will play any role in deciding the node?

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

但是,鉴于此声明:

Or only 1 node will be contacted to fetch the data for all the ids and multiple nodes are used only for high availability

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

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

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

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

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

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

因此在 RF = 节点数的情况下,单个节点 有时 可用于 return 所有请求的副本。

专业提示:

尽量不要对包含 120 个分区键条目的列表使用 IN 运算符。这迫使 Cassandra 执行 随机 读取,它真正擅长 顺序读取 。如果这是应用程序真正需要执行的查询,请尝试:

  • 构建新的 table 以更好地支持该查询模式。
  • IN.
  • 的条目不超过两位数