如何仅连接到特定的 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。
我有两个 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。