我们的表数据少于50GB,我们正在努力为我们的Cassandra数据库提供合理的设计。由于数据太少,我们考虑在每个节点上拥有所有数据(2个节点集群,复制因子为2)。
我们希望使用Cassandra轻松复制 - 防止故障转移,在世界不同地区拥有数据副本,而Cassandra则非常出色。
此外,我们目前提出的最佳模型意味着单个查询(一致性级别1-2)将涉及从多个分区获取数据(avg = 2,90%= 20)。大多数查询会要求来自< = 2个分区的数据,但有些可能会达到5k。
所以我的问题是它是否真的有问题?如果我们确保所有分区都在单个节点上,Cassandra是否很难从多个分区中检索数据?
答案 0 :(得分:4)
编辑:
误读了我对其他人稍后来到这里的道歉。请查看TokenAwarePolicy的代码作为确定副本所有者的基础,一旦完成,您可以将查询与IN查询组合以从单个节点获取多个分区。请注意总查询大小。
原文供参考:
不要在单个查询中从多个分区获取数据,原因的详细信息为here
TLDR最好不要从需要协调员完成这项工作的多个不同分区异步查询。
答案 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驱动程序
X = 100
A - 10ms
B - 150ms
r = 15
X = 1000
A - 20ms
B - 1400ms
r = 70
X = 10000
A - 100ms
B - 14000ms
r = 140
使用DevCenter(一次检索限制为1000行)
X = 100
A - 20ms
B - 900ms
r = 45
X = 1000
A - 30ms
B - 1300ms
r = 43
技术细节:
2.13.0
3.0.9
10
1.6