java - Cassandra 上准备好的语句的最大数量

标签 java cassandra prepared-statement time-series

背景:我们正在使用 Cassandra 存储一些时间序列数据,我们正在使用准备好的语句来访问数据。

我们按以下方式对表中的数据进行分区:

  • 时间段(如一周或一个月)和
  • 保留政策(例如 1 年、5 年或 10 年)

拥有不同的表,我们需要为查询、时间段和保留策略的每种组合准备(仅在使用时)不同的语句,因此准备语句的数量将会激增。一些数学:

timePeriods = 12..52 * yearsOfData
maxNumOfPrepStatements = timePeriods * policies * numOfQueries

ourCase => (20 * 10 y) * 10 p * 10 q = 20.000 prep statements

在客户端,我只能在缓存中保留最常用的 PS,但我找不到从服务器中删除未使用的 PS 的方法,所以我担心拥有大约 20.000 个准备好的语句对于每个节点。

问题:这个 PS 数量会导致服务器出现问题吗?

这分解成更小的问题:

  • 这些准备好的语句的服务器端成本是多少?
  • 服务器会保留所有 PS 还是会删除较少使用的?
  • 有没有比重启 Cassandra 节点来清理 PS 缓存更好的解决方案?
  • 使用 Java 客户端,关闭 Session/Cluster 对象是否可以缓解这种情况(服务器端)?

最佳答案

How much will be the server side cost of those prepared statements?

每个准备好的语句将被解析并进一步存储在缓存中,使用它的 MD5 摘要作为键。客户端即将重新注册的相同准备语句将导致服务器将 MD5 摘要与已存在的语句进行匹配,因此应避免。执行已注册的语句将使客户端将 MD5 连同查询参数一起发送到服务器,并且服务器能够使用 MD5 检索缓存的语句,与解析常规 CQL 语句相比执行速度更快。每个缓存的语句也将消耗部分 Java 堆,这对应于 MD5 key 的总大小和语句对象的表示。

Will the server keep all the PS or will it remove the less used ones?

准备好的语句由服务器通过创建基于ConcurrentLinkedHashMap 的缓存来管理.缓存的容量取决于可用内存:Runtime.getRuntime().maxMemory()/256。条目也根据它们的内存使用情况进行加权,如果达到容量,大型语句将首先从缓存中逐出。您可以使用 org.apache.cassandra.metrics.CQL.PreparedStatementsEvicted JMX 指标监控此行为。

Is there a better solution than restarting Cassandra nodes to clean the PS cache?

据我所知不是。我也不确定您为什么要这样做,因为将为相同的查询创建相同的 MD5 摘要。另请注意,Java 客户端会自动 re-register prepared statements在服务器上找不到的,例如以防它已从缓存中逐出(另请参阅 this answer )。

using the Java client, will closing the Session / Cluster object alleviate this (server side)?

我不这么认为。服务器必须跟踪数百个潜在客户注册了哪些语句,以便安全地清理它们。

关于java - Cassandra 上准备好的语句的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33539380/

相关文章:

java - contains() 不起作用,但 getAbsolutePath() 起作用

Cassandra 不监听 7199 JMX 端口

Cassandra-Stress 因错误而停止

mysql - 准备好的语句的数据库连接

mysql - 使用 MySQL C API - 使用准备好的语句检查插入行是否成功

java - 替换java准备的mysql查询语句中的字符串?

java - 通过java连接oracle 10g Express版的问题

java - 如何在一个java进程中调用我的jar文件

java - Jetty.xml如何定义JNDI引用OpenMQ

java - 线程 "main"com.datastax.driver.core.exceptions.InvalidQueryException : Unknown definition referenced in PRIMARY KEY 中出现异常