[英]Max number of prepared statement on Cassandra
Backgound :我們使用Cassandra存儲一些時間序列數據,我們使用預准備語句來訪問數據。
我們在表中對數據進行分區:
擁有不同的表我們需要為查詢,時間段和保留策略的每個組合准備(僅在使用時)不同的語句,因此我們將准備好的語句數量激增。 一些數學:
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的數量是否會導致服務器出現問題?
這會分解為更小的問題:
這些准備好的報表的服務器端成本是多少?
每個准備好的語句將被解析並使用它的MD5摘要作為關鍵字進一步存儲在緩存中。 客戶端關於重新注冊的相同准備語句將使服務器將MD5摘要與現有語句匹配,因此應該避免。 執行已注冊的語句將使客戶端將MD5連同查詢參數一起發送到服務器,並且服務器能夠使用MD5檢索緩存的語句,與解析常規CQL語句相比,執行速度更快。 每個緩存的語句也將使用部分Java堆,它對應於MD5鍵的總大小和語句對象的表示。
服務器會保留所有PS還是刪除較少使用的PS?
准備好的語句由服務器通過創建基於ConcurrentLinkedHashMap的緩存來管理。 緩存的容量取決於可用內存: Runtime.getRuntime().maxMemory() / 256
。 條目也按其內存使用情況加權,並且在達到容量的情況下,將首先從緩存中逐出大型語句。 您可以使用org.apache.cassandra.metrics.CQL.PreparedStatementsEvicted
JMX度量標准監視此行為。
有沒有比重新啟動Cassandra節點來清理PS緩存更好的解決方案?
不是我知道的。 我也不確定你為什么要這樣做,因為將為相同的查詢創建相同的MD5摘要。 還請注意,Java客戶端將自動重新注冊在服務器上找不到的預准備語句 ,例如,如果它已從緩存中逐出(請參閱此答案 )。
使用Java客戶端,關閉Session / Cluster對象會緩解這個(服務器端)嗎?
我不這么認為。 服務器必須跟蹤數百個潛在客戶已注冊的語句,以便安全地清理它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.