Java Cassandra上已准备语句的最大数目

Java Cassandra上已准备语句的最大数目,java,cassandra,prepared-statement,time-series,Java,Cassandra,Prepared Statement,Time Series,Backgound:我们使用Cassandra存储一些时间序列数据,并使用准备好的语句访问数据 我们通过以下方式对表中的数据进行分区: 时间段(如一周或一个月)和 保留政策(如1年、5年或10年) 由于有不同的表,我们需要为查询、时间段和保留策略的每一种组合准备(仅在使用时)不同的语句,因此我们准备的语句数量将激增。一些数学: timePeriods = 12..52 * yearsOfData maxNumOfPrepStatements = timePeriods * policies

Backgound:我们使用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的方法,因此我担心,对于每个节点来说,准备大约20000条语句可能是一个巨大的成本

问题:此数量的PS是否会导致服务器出现问题

这就分成了几个小问题:

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

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

服务器将保留所有的PS还是删除使用较少的PS

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

有没有比重新启动Cassandra节点来清理PS缓存更好的解决方案

我不知道。我也不太清楚为什么要这样做,因为将为相同的查询创建相同的MD5摘要。还请注意,Java客户端将自动删除服务器上找不到的内容,例如,如果它已从缓存中移出(另请参阅)

使用Java客户机,关闭会话/集群对象是否会缓解这种情况(服务器端)


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

谢谢@stefan podkowinski,这澄清了很多幕后的情况,看起来我们只能相信服务器会保持合理数量的PS。我们肯定需要一些测试。如果我们预期的20000 PS可能是一个沉重的负载,有什么线索吗?顺便说一句,重新启动的想法与只保留客户端上最新的PS有关,因此只有这些PS才会被发送回。请帮助我解决以下问题