编程语言
首页 > 编程语言> > java-Cassandra上已准备好的语句的最大数量

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

作者:互联网

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的方法,因此我担心拥有大约20.000条准备好的语句对于每个节点来说可能都是很大的成本.

问题:此数量的PS会在服务器上引起任何问题吗?

这分为几个较小的问题:

>这些准备好的语句在服务器端的成本是多少?
>服务器将保留所有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键的总大小和语句对象的表示相对应.

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)?

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

标签:cassandra,time-series,prepared-statement,java
来源: https://codeday.me/bug/20191027/1946598.html