Cassandra两个冗余节点

Cassandra两个冗余节点,cassandra,Cassandra,我已经按照DataStax网站上的文档设置了两台服务器来运行Cassandra。我当前的设置是 1个种子节点(在两个YAML中配置) 运行时,两个节点都已启动(当通过nodetool进行测试时),并且两个节点似乎都正确复制了数据,但我注意到,当我关闭种子节点时,另一个节点不允许客户端连接(无论是通过其API还是通过连接到cqlsh),这是一个问题 我的要求是有两台服务器,它们是彼此的完美副本,如果一台服务器暂时停机(例如,由于磁盘空间故障),另一台服务器可以接管请求,直到损坏的服务器恢复联机 鉴

我已经按照DataStax网站上的文档设置了两台服务器来运行Cassandra。我当前的设置是

1个种子节点(在两个YAML中配置)

运行时,两个节点都已启动(当通过nodetool进行测试时),并且两个节点似乎都正确复制了数据,但我注意到,当我关闭种子节点时,另一个节点不允许客户端连接(无论是通过其API还是通过连接到cqlsh),这是一个问题

我的要求是有两台服务器,它们是彼此的完美副本,如果一台服务器暂时停机(例如,由于磁盘空间故障),另一台服务器可以接管请求,直到损坏的服务器恢复联机

鉴于这一要求,我有以下问题:

  • 是否需要将两个节点都设置为“种子”节点
  • 如何确保在两台服务器之间复制所有内容?这是自动发生的还是需要在某个地方进行设置

  • 首先非常感谢,

    Cassandra不做主从复制。卡桑德拉没有大师。相反,数据分布在集群中。分配机制取决于许多因素

    数据存储在分区中的节点上。还记得卡桑德拉是一个分区行商店吗?这就是分区的用武之地。数据存储在分区中。分区的所有行一起存储在单个节点(和副本)中。复制副本的数量取决于表的复制系数。如果表的复制系数为3,则该表的每个分区(以及该分区中的所有行)将存储在另外两个副本中。这就像说:“我想要3份数据副本”

    在编写过程中,客户端可以指定一致性级别(CL)。这是写入成功必须确认的节点数。客户端也可以指定用于读取的CL。Cassandra向n=CL节点发出读取请求,并将最近的值作为查询结果

    通过调整读写CLs,可以控制一致性。如果读CL+写CL>复制因子(RF),则获得完全一致性

    在容错方面,您可以根据需要调整CLs和RF。例如,如果您有RF=3、Read CL=2、Write CL=2,那么您就具有完全一致性,并且您可以容忍一个节点发生故障。对于RF=5、Read CL=3、Write CL=3,您具有相同的性能,但可以容忍2个节点发生故障


    两节点集群不是一个好主意。您可以设置RF=2(所有复制数据)、写入CL=2和读取CL=1。但是,这意味着如果节点关闭,则只能读取而不能写入。您可以设置read CL=2和write CL=1,在这种情况下,如果节点发生故障,您可以写入,但不能读取。实际上,在RF=3的情况下,您应该选择至少5个(至少4个)节点。任何低于此值的值,都是自找麻烦。

    我应该补充一点,对于2个节点,可以执行RF=2、读取CL=1和写入CL=1;但是,这意味着您可能正在读取过时的数据,直到它被复制到另一个节点。如果只有一个节点处于活动状态,它将允许您进行读写操作,但您牺牲了一致性。非常感谢您的回答。很好的解释。最后一个问题,如果我选择2个读/写CL=1的节点(我知道这不好,但我在测试阶段只有2台服务器可供使用,以后只能添加更多服务器),我是否需要将这两个节点都设置为“种子”,以便在一个节点/服务器宕机的情况下,连接仍然是可能的?种子并不是那么关键。它是假定种子节点是稳定的,您给客户端的地址。客户端将连接到一个种子,并获取关于集群其余部分的信息。然后,它将连接到集群中的任何节点进行事务处理。如果不指定种子,信息可能会通过流言蜚语传播。如果您告诉您的客户端连接到一个非种子,那么它实际上不应该给您的双节点设置带来问题。如果您将两者都标记为种子,如果一个客户端连接到其中一个而它关闭,它将连接到另一个。我会把它们都标记为种子。@ashic我有两个节点的集群,RF=2,读CL=1,写CL=1。如果节点(比如节点2)宕机,集群仍然可以从客户端(节点1上)接收数据。但是,当时创建的副本数量是1,对吗?在此之后,如果节点2启动,是否有任何方法可以将节点1上的数据自动复制到节点2?如果运行修复,则长延迟..错过:)(如果该节点已关闭>宽限期,或者是新节点,则应复制该节点。此外,当执行分区查询时,有10%的几率触发读取修复,这将导致复制。