出于某些原因,我需要查询我的cassandra集群中的特定数据中心.根据the documentation,我可以使用LOCAL_QUORUM一致性级别:
Returns the record after a quorum of replicas in the current
datacenter as the coordinator has reported. Avoids latency of
inter-datacenter communication.
我是否正确理解,为了为当前查询指定特定数据中心,我必须在属于此特定DC的给定端点上构建群集?
说,我有两个DC与以下节点:
DC1: 172.0.1.1, 172.0.1.2
DC1: 172.0.2.1, 172.0.2.2
因此,为了使用DC1,我构建了一个集群:
Cluster cluster = Cluster.builder().addContactPoint("172.0.1.1").build();
Session session = cluster.connect();
Statement statement = session.prepare("select * from ...").bind().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
ResultSet resultSet = session.execute(session);
这是一种正确的方法吗?
解决方法:
DCAwwareRoundRobinPolicy本身会选择使用“最小网络距离”算法找到的数据中心.要确保它连接到您想要的位置,您应该将DC指定为参数.
以下是我告诉开发团队这样做的方法:
Builder builder = Cluster.builder()
.addContactPoints(nodes)
.withQueryOptions(new QueryOptions()
.setConsistencyLevel(ConsistencyLevel.LOCAL_ONE))
.withLoadBalancingPolicy(new TokenAwarePolicy(
new DCAwareRoundRobinPolicy.Builder()
.withLocalDc("DC1").build()))
.withPoolingOptions(options);
注意:这可能适用于您的情况,也可能不适用,但我建议使用TokenAwarePolicy并将DCAwareRoundRobin嵌套在其中(指定本地DC).这样,指定分区键的任何操作都将自动路由到正确的节点,从而不需要协调器节点所需的额外跃点.