Cassandra的单点故障

bra*_*orm 2 cassandra

在做教程的同时Cassandra,讲师提到cassandra没有single point of failure.也就是说,如果节点在群集中关闭,则不应影响客户端访问它的方式.

所以我尝试了以下操作:关闭我的3节点集群中的一个节点.

然后尝试连接到已关闭的节点.

我被拒绝连接很明显,因为该节点已关闭.但正如教练提到的那样,我期待cassandra以循环方式将连接路由到下一个节点.但事实并非如此.这是为什么?

ccm status
node1: UP
node3: UP
node2: UP
ccm node2 stop
ccm status
node1: UP
node3: UP
node2: DOWN
ccm node2 cqlsh
Connection error: Could not connect to 127.0.0.2:9160
Run Code Online (Sandbox Code Playgroud)

编辑:

我注意到的另一件事是我能够进行写操作.但默认操作失败.我没有调整一致性水平.我正在使用默认值.我得到的是:

cqlsh> CREATE KEYSPACE example with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh> use example ;
cqlsh:example> CREATE TABLE users(id varchar PRIMARY KEY, email varchar, password varchar, name varchar);
cqlsh:example> INSERT INTO users (id, email, name, password) VALUES ('user1','user1@example.com','foo','foo_pwd');
cqlsh:example> SELECT * from users ;
Unable to complete request: one or more nodes were unavailable.
Run Code Online (Sandbox Code Playgroud)

Rus*_*ssS 6

如果节点已关闭且您使用的驱动程序未保存状态,则它不知道要连接到哪个节点.如果您使用的是任何新一代驱动程序,您会发现即使最初连接的节点发生故障,您仍可以继续执行查询.

DataStax Python驱动程序示例:

from cassandra.cluster import Cluster
sessions = Cluster("127.0.0.1").connect()
session.execute("Select * from ks.tab")

#Turn off Cassandra 127.0.0.1

session.execute("select * from ks.tab") # Will be ok if replication on ks is more than 1 and CL is one   
Run Code Online (Sandbox Code Playgroud)

编辑:

复制级别和一致性级别这些博客文章中都详细介绍了这两者

你观察的是这个:

只要负责哈希密钥的节点启动,插入就会以默认一致性(one)成功.因此,即使RF为1,一个被击落的节点仍然允许许多写入(和读取)仍然成功.如果你继续尝试其他值,你会看到大约1/3的输入选择哈希到破损的节点,你得到一个不可用的异常.

选择*虽然要求检查每个节点上的数据,这意味着如果任何节点关闭,此命令将失败(除非RF> 1)