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 你最好从多个需要协调器完成这项工作的不同分区异步查询。
- 如果失败,则需要更多重试(当查询中有一个或两个非常大的分区时,这尤其难看)
- 您正在等待任何回复的最慢查询,这时您可能会返回部分答案(甚至包括基于已完成部分的进度表)。
我在我的机器上做了一些测试,结果与 Ryan Svihla 在另一个答案中提出的建议相矛盾。
TL;DR 在多个分区中存储相同数据并通过 IN 运算符检索比在单个分区中存储数据慢 多 并一次性检索它。请注意,所有操作都在单个 Cassandra 节点上进行(因为对于分布式 Cassandra 集群而言,结论应该更加明显)
案例A
将 X 行插入到下面定义的 table 的单个分区中。通过 SELECT
在 WHERE
.
中指定分区键来检索所有这些
案例 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 驱动程序
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
技术细节:
- 幻影驱动 v
2.13.0
- 卡桑德拉
3.0.9
- Windows
10
- 开发中心
1.6
table 我们只有不到 50GB 的数据,我们正在努力为我们的 Cassandra 数据库提出一个合理的设计。由于数据如此之少,我们正在考虑将所有数据都放在每个节点上(2 节点集群,开始时复制因子为 2)。
我们想使用 Cassandra 来轻松复制 - 防止故障转移,在世界不同地方拥有数据副本,而 Cassandra 在这方面非常出色。
此外,我们目前提出的最佳模型意味着单个查询(一致性级别 1-2)将涉及从多个分区(avg=2,90th %=20)获取数据。大多数查询会要求来自 <= 2 个分区的数据,但有些可能会达到 5k。
所以我的问题是这是否真的是一个问题?如果我们确保所有分区都在单个节点上,Cassandra 从多个分区检索数据是否很慢?
编辑:
误读问题我为后来来到这里的其他人道歉。请查看 TokenAwarePolicy 的代码作为确定副本所有者的基础,一旦您拥有它,您就可以将您的查询与 IN 查询结合起来以从单个节点获取多个分区。仍然要注意总查询大小。
原文供参考:
不要在单个查询中从多个分区获取数据,原因的详细信息是 here
TLDR 你最好从多个需要协调器完成这项工作的不同分区异步查询。
- 如果失败,则需要更多重试(当查询中有一个或两个非常大的分区时,这尤其难看)
- 您正在等待任何回复的最慢查询,这时您可能会返回部分答案(甚至包括基于已完成部分的进度表)。
我在我的机器上做了一些测试,结果与 Ryan Svihla 在另一个答案中提出的建议相矛盾。
TL;DR 在多个分区中存储相同数据并通过 IN 运算符检索比在单个分区中存储数据慢 多 并一次性检索它。请注意,所有操作都在单个 Cassandra 节点上进行(因为对于分布式 Cassandra 集群而言,结论应该更加明显)
案例A
将 X 行插入到下面定义的 table 的单个分区中。通过 SELECT
在 WHERE
.
案例 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 驱动程序
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
技术细节:
- 幻影驱动 v
2.13.0
- 卡桑德拉
3.0.9
- Windows
10
- 开发中心
1.6