在Datastax驱动程序中使用LOCAL_QUORUM一致性级别

时间:2018-01-30 10:43:23

标签: java cassandra datastax datastax-java-driver cassandra-3.0

由于某些原因,我需要查询我的cassandra集群中的特定数据中心。根据{{​​3}},我可以使用LOCAL_QUORUM一致性级别:

  

在当前的法定数量的副本之后返回记录   数据中心作为协调员报告。避免延迟   数据中心间通信。

我是否正确理解,为了为当前查询指定特定数据中心,我必须在属于此特定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);

这是一种正确的方法吗?

2 个答案:

答案 0 :(得分:3)

单独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) 。这样,指定分区键的任何操作都将自动路由到正确的节点,从而无需协调器节点需要额外的跃点。

答案 1 :(得分:0)

根据Cluster班级documentation

  

群集对象与其中一个群集保持永久连接   它仅用于维护信息的集群节点   集群的状态和当前拓扑

另外,因为a default load balancing policyDCAwareRoundRobinPolicy,这种方法应该可以正常运行。