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

How to connect to specific cassandra node only

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

我的目标是让我的 java 应用程序始终连接到节点 1,我的临时手动查询应该 return 仅来自节点 2(不应该有任何节点间数据通信)

通常我可以使用 cqlsh 在 container1 或 container2 上执行 read/write 查询。如果我使用 cqlsh 在 container1 之上触发一些查询,它是否总是 return 来自同一容器(node1)的数据,或者它也可能在内部路由到另一个节点?

并且我知道协调器节点将与对等节点通信以请求数据,如果 RF=2 和 2 个节点集群协调器节点本身能够提供数据,会发生什么情况?

此处,RF=2,节点=2,一致性=ONE

为了将OLTP和OLAP分开,我之前设置过集群。这样做的方法是将您的节点分离到不同的逻辑数据中心。

所以 node1 应该在 cassandra-rackdc.properties 中有它的本地数据中心在 "dc1."

dc=dc1
rack=r1

同样,node2应该放到它自己的数据中心,"dc2."

dc=dc2
rack=ra

那么您的键空间定义将如下所示:

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

My aim is to have my java application will always connect to 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 应用程序 "sticky" 连接到数据中心 "dc1," 中的所有节点,或者在本例中仅连接到 node1。同样,当您 cqlsh 进入 node2 时,您的临时查询应该 "sticky" 到 "dc2."

中的所有节点

注意:在此配置中,您没有高可用性。如果 node1 出现故障,您的应用将不会跳转到 node2。