如何仅连接到特定的cassandra节点

时间:2018-02-12 17:30:53

标签: cassandra cassandra-2.0 cassandra-3.0

我有两个docker cassandra容器节点在同一个数据中心中充当node1和node2。

我的目标是让我的java应用程序始终连接到node1,我的adhoc手动查询应该仅从node2返回(不应该有任何节点间的数据通信)

通常我可以使用cqlsh在container1或container2之上执行读/写查询。如果我使用cqlsh在container1上发出一些查询,它是否总是从同一个容器(node1)返回数据,或者它也可以在内部路由到另一个节点?

我知道协调节点将与对等节点通话以获取数据请求,如果RF = 2会发生什么,2节点集群将协调节点本身能够提供数据?

此处,RF = 2,node = 2,Consistency = ONE

1 个答案:

答案 0 :(得分:2)

我之前已经设置了群集,以便将OLTP与OLAP分开。这样做的方法是将节点分成不同的逻辑数据中心。

因此,node1应该让它在cassandra-rackdc.properties中的本地数据中心位于" dc1。"

dc=dc1
rack=r1

同样,node2应该被放入它自己的数据中心," dc2。"

dc=dc2
rack=ra

然后您的键空间定义将如下所示:

CREATE KEYSPACE stackoverflow
  WITH REPLICATION={'class':'NetworkTopologyStrategy','dc1':'1','dc2':'1'};
  

我的目标是让我的java应用程序始终连接到node1

在Java代码中,您应指定" dc1"作为您的默认数据中心,就像我在此示例中所做的那样:

String dataCenter = "dc1";

Builder builder = Cluster.builder()
                .addContactPoints(nodes)
                .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_ONE))
                .withLoadBalancingPolicy(new TokenAwarePolicy(
                                            new DCAwareRoundRobinPolicy.Builder()
                                            .withLocalDc(dataCenter).build()))
                .withPoolingOptions(options);

这将使您的Java应用程序变得“粘”"到数据中心的所有节点" dc1,"或者在这种情况下只是node1。同样,当你cqlsh进入node2时,你的临时查询应该是" sticky"到" dc2。"

中的所有节点

注意:在此配置中,您没有高可用性。如果node1关闭,您的应用程序将不会跳转到node2。