【发布时间】:2019-08-31 10:59:39
【问题描述】:
我目前在 Cassandra 中设置了一个表,该表具有文本、小数或日期类型列,其中 复合分区键 为 business_date 和 account_number。对于此表的查询,我需要能够支持对给定日期的单个帐户或帐户列表的查找。
例子:
select x,y,z from my_table where business_date = '2019-04-10' and account_number IN ('AAA', 'BBB', 'CCC')
//Note: Both partition keys are provided for this query
我一直在努力解决与访问这些数据相关的性能问题,因为我注意到我在尝试理解/解释时遇到困难的延迟模式。
在许多情况下,客户端应用程序可以在短时间内总共运行 3 次完全相同的查询。对于这些场景,我看到三分之二的请求的响应时间非常糟糕(800 毫秒),其中一个请求的响应时间非常快(50 毫秒)。起初我认为这是由于键或行缓存,但是,我不太确定,因为我相信如果这是真的,那么三个请求中的第三个请求应该总是最快的,但事实并非如此.
我认为我面临的第二个问题是实际的数据模型本身。尽管查询是在提供所有分区键的情况下提交的,但由于它是一个 IN 子句,因此结果将是单独的分区,并且可以分布在整个集群中,因此这将是一个糟糕的访问模式。但是,即使运行单个帐户查询,我也会看到这些延迟问题。此外,我发现 15 到 20 个帐户的查询表现非常好(低于 50 毫秒),所以我不确定数据模型是否真的存在问题。
集群设置:
- 数据中心:2 个
- 每个数据中心的节点数:3
- 键空间复制:local_dc = 2,remote_dc = 2
Java 驱动程序集:
- 负载平衡:DCAware 与 LatencyAware
- 协议:v3
- 查询仍设置为使用“IN”子句而不是异步单个查询
- Read_consistency:LOCAL_ONE
在真正确定此问题的根本原因方面,是否有人对我应该关注什么有任何想法/线索?
【问题讨论】:
标签: cassandra query-optimization datastax-java-driver