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

时间:2017-07-20 08:18:27

标签: cassandra nodes partitioning cassandra-3.0

我们的表数据少于50GB,我们正在努力为我们的Cassandra数据库提供合理的设计。由于数据太少,我们考虑在每个节点上拥有所有数据(2个节点集群,复制因子为2)。

我们希望使用Cassandra轻松复制 - 防止故障转移,在世界不同地区拥有数据副本,而Cassandra则非常出色。

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

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

2 个答案:

答案 0 :(得分:4)

编辑:

误读了我对其他人稍后来到这里的道歉。请查看TokenAwarePolicy的代码作为确定副本所有者的基础,一旦完成,您可以将查询与IN查询组合以从单个节点获取多个分区。请注意总查询大小。

原文供参考:

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

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

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

答案 1 :(得分:1)

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

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

案例A 将X行插入下面定义的表的单个分区中。通过SELECT指定WHERE中的分区键来检索所有这些内容。

案例B 将X行各插入下面定义的表的单独分区中。通过使用SELECT指定多个分区键的WHERE pKey IN (...)检索所有这些。

表格定义

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
  4. 使用DevCenter(一次检索限制为1000行)

    1. X = 100 A - 20ms B - 900ms r = 45
    2. X = 1000 A - 30ms B - 1300ms r = 43
    3. 技术细节:

      • Phantom驱动程序v 2.13.0
      • Cassandra 3.0.9
      • Windows 10
      • DevCenter 1.6