如何仅连接指定Cassandra节点?容器部署下的数据访问疑问
首先明确核心结论:在你的场景下,container1上用cqlsh执行查询时,一定会从node1返回数据,完全不会被路由到node2,原因如下:
你的场景核心前提
你提到两个节点之间「无数据交互」——这说明node1和node2本质上是两个完全独立的单节点Cassandra集群,彼此之间没有加入同一个集群,也不存在gossip通信(Cassandra用来发现集群节点的核心机制)。这种情况下,两个节点互相不知道对方的存在,自然不会有任何查询路由的可能。
cqlsh的默认连接行为
当你在container1(node1的容器)里启动cqlsh时,如果没有指定其他节点地址,它会默认连接本地的Cassandra实例(也就是node1)。即使你手动指定连接,比如执行cqlsh localhost 9042或者cqlsh [node1容器IP] 9042,cqlsh都会直接和你指定的节点建立一对一的连接,所有查询请求都会直接发送给这个节点,结果也由它返回。
只有当两个节点属于同一个Cassandra集群时,cqlsh才可能在某些特殊场景下(比如设置了token-aware路由、或者当前节点无法响应)将查询路由到其他集群节点,但你的场景里节点间无数据交互,显然不属于这种情况。
额外验证小技巧
如果你想彻底确认,可以在node1和node2上分别写入不同的测试数据:
在node1的cqlsh中执行:
CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}; USE test; CREATE TABLE users (id int PRIMARY KEY, name text); INSERT INTO users (id, name) VALUES (1, 'from-node1');
在node2的cqlsh中执行类似操作,但修改name值:
CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}; USE test; CREATE TABLE users (id int PRIMARY KEY, name text); INSERT INTO users (id, name) VALUES (1, 'from-node2');
之后回到container1的cqlsh里查询SELECT * FROM test.users;,只会看到from-node1的数据,完全不会出现node2的内容,这就直观证明了查询完全没有路由到node2。
内容的提问来源于stack exchange,提问作者Sathish

