Cassandra 卡桑德拉的单点故障

Cassandra 卡桑德拉的单点故障,cassandra,Cassandra,在做关于Cassandra的教程时,讲师提到Cassandra没有单点故障。也就是说,如果集群中的节点停机,则不应影响客户端访问它的方式 因此,我尝试了以下方法: 关闭我的3节点群集中的一个节点 然后尝试连接到被拒绝的节点 我被拒绝连接,这是显而易见的,因为该节点已关闭。但我希望cassandra像讲师提到的那样,以循环方式将连接路由到下一个节点。但事实并非如此。 为什么呢 ccm status node1: UP node3: UP node2: UP ccm node2 stop ccm s

在做关于
Cassandra
的教程时,讲师提到
Cassandra
没有
单点故障
。也就是说,如果集群中的节点停机,则不应影响客户端访问它的方式

因此,我尝试了以下方法: 关闭我的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
编辑

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

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.

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

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   
编辑:

复制级别和一致性级别 详细描述了这两种情况

你观察到的是:

只要负责其哈希键的节点处于启动状态,插入将在默认一致性(1)下成功。因此,即使RF为1,一个宕机节点仍将允许许多写入(和读取)仍然成功。如果您继续尝试其他值,您将看到大约1/3的输入选项散列到断开的节点,您将得到一个不可用的异常


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

我也有类似问题。将“复制系数”设置为2而不是1为我修复了它。许多示例似乎显示单节点设置的复制系数为1

第一步应该是:

cqlsh> CREATE KEYSPACE example with replication = 'class': 'SimpleStrategy', 'replication_factor': 2};
或者,我使用以下步骤来:

然后运行以下命令:

nodetool repair
等待维修过程完成,然后用以下命令确认:

nodetool status
#should show 'own %' as ~67% for a 3 node setup.

我正在使用cassandra群集管理器。我不知道它是否支持保存状态。在您提供的示例中,下一个连接的节点是什么?例如,节点1知道其邻居节点。我连接到节点1。但是,如果已知节点1,如何检索邻居节点信息,以便客户端可以将其请求转发给其他节点?感谢更新的答案。这解释得很清楚。你能看看我上面的评论并给出你的意见吗?CCM不是客户机/驱动程序。它只是一个启动Cassandra集群的工具。CQLSH使用python驱动程序,因此它只在最初与一个节点通信之后才知道集群的状态。当它连接到第一个注释时,驱动程序学习集群的所有拓扑并与其他节点建立连接。查询的执行顺序基于驱动程序中选择的另一种不同策略。默认情况下是本地循环,它首先命中负责分区的节点,然后在其余节点之间交替。+1感谢您的解释。您提到“CQLSH使用python驱动程序,因此它知道集群的状态,但只有在最初与一个节点通信之后。”。如果驱动程序首先连接到的节点已关闭,那么会发生什么情况?然后它将不连接。如果有问题,可以添加几个连接点。我不确定cqlsh是否允许,但python驱动程序的api允许。
nodetool repair
nodetool status
#should show 'own %' as ~67% for a 3 node setup.