Cassandra
僅從本地 cassandra 節點中的分區讀取
我知道我可以從任何 cassandra 節點讀取數據,它充當協調器從包含特定分區的節點讀取數據,但我可以只從我正在連接的節點上的分區讀取數據嗎?
換句話說,當一個 cassandra 集群有 10 個節點時,它在每個節點上包含 10 個分區(並且可能在設置 RF 時在其他節點上包含副本)。當我發送 SELECT * FROM TABLE 時,我只想獲得總數據的 1/10,這些數據實際上儲存在該特定節點上,而沒有任何流量到其他節點。
非常感謝!
您可以按以下方式進行(類名稱等用於驅動程序 3.x,在 4.x 中可能略有不同):
確定特定節點處理哪些令牌範圍 - 您可以從
Metadata
類中獲取此資訊cluster.getMetadata().getTokenRanges(keyspace, host)
(請參閱doc);對於每個令牌範圍重複:
- 生成類似的查詢
select * from table where token(part_keys) > rangeStart AND token(part_keys) <= rangeEnd
(但這可能不會一直有效,因為您需要處理節點的令牌範圍在令牌環結束和令牌環開始之間分割的情況 - 請參閱連結程式碼)- 為每個查詢創建一個實例
Statement
(例如 asSimpleStatement
),並將一致性級別設置 為LOCAL_ONE
應該發送查詢的主機(通過setHost 函式)execute
使用or函式執行查詢executeAsync
並處理數據可以在此處找到執行完整集群掃描的原始碼- 您可以重用其中的一部分,以生成對令牌範圍的查詢等。