cassandra 使用setNode()方法指定的节点将读取请求转发到其他节点

omvjsjqw  于 2023-10-18  发布在  Cassandra
关注(0)|答案(1)|浏览(167)

我正在尝试使用Datastax驱动程序版本4.13读取特定cassandra(4)节点中的数据。我读过this的帖子,据说它适用于驱动程序版本3.x
我已经修改了我的代码,尽我所能为驱动程序版本4.x。代码的操作部分看起来像

BoundStatement bs= psGetAllOptimizedModule.bind(imei,year,month,startDate,endDate)
            .setTracing(true)
            .setNode(localNode).setConsistencyLevel(ConsistencyLevel.LOCAL_ONE).setPageSize(pageSize);
    Instant start=Instant.now();
    ResultSet rs = session.execute(bs);

虽然查询确实指向指定的节点,但该节点有时会将请求转发到其他节点,即使数据存在于指定的节点上。
我想看看这在cassandra中是否可行,如果可行,我需要做些什么不同的事情。
更新:根据要求,所要求的信息已添加到pastebin here中,因为它太长而无法添加到问题中。

xuo3flqw

xuo3flqw1#

Statement.setNode() API实际上限制了请求,这样驱动程序将忽略负载平衡策略,只在指定的节点上执行语句。
但是,您描述的症状向我表明,查询不能仅由一个节点满足,因此它必须从其他副本请求数据,尽管将一致性设置为LOCAL_ONE
实际上,psGetAllOptimizedModule这个名字让我觉得,你试图检索的不仅仅是一条记录,所以协调节点需要从其他节点请求数据是有道理的。
您可以通过在Cassandra节点上本地运行查询,启用跟踪并将一致性设置为LOCAL_ONE来轻松确认这一点。干杯!干杯!

相关问题