Cassandra 在单个节点上查询多个分区

Cassandra querying multiple partitions on a single node

table 我们只有不到 50GB 的数据,我们正在努力为我们的 Cassandra 数据库提出一个合理的设计。由于数据如此之少,我们正在考虑将所有数据都放在每个节点上(2 节点集群,开始时复制因子为 2)。

我们想使用 Cassandra 来轻松复制 - 防止故障转移,在世界不同地方拥有数据副本,而 Cassandra 在这方面非常出色。

此外,我们目前提出的最佳模型意味着单个查询(一致性级别 1-2)将涉及从多个分区(avg=2,90th %=20)获取数据。大多数查询会要求来自 <= 2 个分区的数据,但有些可能会达到 5k。

所以我的问题是这是否真的是一个问题?如果我们确保所有分区都在单个节点上,Cassandra 从多个分区检索数据是否很慢?

编辑:

误读问题我为后来来到这里的其他人道歉。请查看 TokenAwarePolicy 的代码作为确定副本所有者的基础,一旦您拥有它,您就可以将您的查询与 IN 查询结合起来以从单个节点获取多个分区。仍然要注意总查询大小。

原文供参考:

不要在单个查询中从多个分区获取数据,原因的详细信息是 here

TLDR 你最好从多个需要协调器完成这项工作的不同分区异步查询。

  1. 如果失败,则需要更多重试(当查询中有一个或两个非常大的分区时,这尤其难看)
  2. 您正在等待任何回复的最慢查询,这时您可能会返回部分答案(甚至包括基于已完成部分的进度表)。

我在我的机器上做了一些测试,结果与 Ryan Svihla 在另一个答案中提出的建议相矛盾。

TL;DR 在多个分区中存储相同数据并通过 IN 运算符检索比在单个分区中存储数据慢 并一次性检索它。请注意,所有操作都在单个 Cassandra 节点上进行(因为对于分布式 Cassandra 集群而言,结论应该更加明显)

案例A 将 X 行插入到下面定义的 table 的单个分区中。通过 SELECTWHERE.

中指定分区键来检索所有这些

案例 B 分别将 X 行插入到下面定义的 table 的单独分区中。通过使用 WHERE pKey IN (...).

指定多个分区键,通过 SELECT 检索所有这些

Table定义

pKey: Text PARTITION KEY
cColumn: Int CLUSTERING KEY
sParam: DateTime STATIC
param: Text (size of each was 500 B in tests)

结果

使用 Phantom 驱动程序

  1. X = 100 A - 10ms B - 150ms r = 15
  2. X = 1000 A - 20ms B - 1400ms r = 70
  3. X = 10000 A - 100ms B - 14000ms r = 140

使用 DevCenter(一次检索 1000 行的限制)

  1. X = 100 A - 20ms B - 900ms r = 45
  2. X = 1000 A - 30ms B - 1300ms r = 43

技术细节:

  • 幻影驱动 v 2.13.0
  • 卡桑德拉3.0.9
  • Windows 10
  • 开发中心1.6