Java Cassandra上已准备语句的最大数目
Backgound:我们使用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
- 时间段(如一周或一个月)和
- 保留政策(如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客户机,关闭会话/集群对象是否会缓解这种情况(服务器端)
Runtime.getRuntime().maxMemory()/256
。条目也会根据其内存使用情况进行加权,如果达到容量,大型语句将首先从缓存中逐出。您可以使用org.apache.cassandra.metrics.CQL.PreparedStatementSevRestricted
JMX度量来监视此行为
有没有比重新启动Cassandra节点来清理PS缓存更好的解决方案
我不知道。我也不太清楚为什么要这样做,因为将为相同的查询创建相同的MD5摘要。还请注意,Java客户端将自动删除服务器上找不到的内容,例如,如果它已从缓存中移出(另请参阅)
使用Java客户机,关闭会话/集群对象是否会缓解这种情况(服务器端)
我不这么认为。服务器必须跟踪数百个潜在客户已注册的语句,以便安全地清理它们。谢谢@stefan podkowinski,这澄清了很多幕后的情况,看起来我们只能相信服务器会保持合理数量的PS。我们肯定需要一些测试。如果我们预期的20000 PS可能是一个沉重的负载,有什么线索吗?顺便说一句,重新启动的想法与只保留客户端上最新的PS有关,因此只有这些PS才会被发送回。请帮助我解决以下问题