【问题标题】:Cassandra querying multiple partitions on a single nodeCassandra 在单个节点上查询多个分区
【发布时间】:2017-07-25 18:57:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: cassandra nodes partitioning cassandra-3.0


    【解决方案1】:

    编辑:

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

    参考原文:

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

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

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

    【讨论】:

    • 感谢@RyanSvihla,我已阅读您链接到的帖子。但最大的不同是我集群中的任何节点上都有所有数据,因此没有协调器将部分查询转发到其他一些节点。同一个协调器节点计算出响应并将其发回。这就是为什么我希望在我的情况下它可能与将所有内容放入一个大分区一样快
    • 是的,需要我早上的咖啡,在这种情况下,您需要让您的查询令牌知道,然后您可以使用 IN 查询将其取消。使用 TokenAwarePolicy 作为代码示例来构建客户端代码以获取每个分区的副本列表github.com/datastax/java-driver/blob/…
    • 此外,由于您在 CASSANDRA-9754 中看到的问题,这应该比一个大分区更快,但我会对您的基准测试感兴趣
    • 我会尝试在我的机器上测试它。
    • 请看下面我的回答。
    【解决方案2】:

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

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

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

    案例 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

    使用 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
    • 视窗10
    • 开发中心1.6

    【讨论】:

    • Spark Cassandra 连接器一次从同一台机器检索多个分区,性能得到极大提升(并将此逻辑融入驱动程序),所以我怀疑基于您正在检索的行数导致总请求大小太大而无法从合并请求中受益。我很好奇 nodetool cfhistograms 输出什么。
    • 另外,我建议查看 CASSANDRA-9754,了解为什么在确定查询是否有效时单元格计数很重要。如果您一次检索多个较大的分区,那么您肯定会更好地异步执行它,尽管它可能会在此过程中给服务器带来更多压力。
    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 2016-02-09
    • 2019-06-23
    • 2015-10-06
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多