我有两个docker cassandra容器节点在同一个数据中心中充当node1和node2。
我的目标是让我的java应用程序始终连接到node1,我的adhoc手动查询应该仅从node2返回(不应该有任何节点间的数据通信)
通常我可以使用cqlsh在container1或container2之上执行读/写查询。如果我使用cqlsh在container1上发出一些查询,它是否总是从同一个容器(node1)返回数据,或者它也可以在内部路由到另一个节点?
我知道协调节点将与对等节点通话以获取数据请求,如果RF = 2会发生什么,2节点集群将协调节点本身能够提供数据?
此处,RF = 2,node = 2,Consistency = ONE
答案 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。