Cassandra复制因子大于节点数

8
我正在使用数据斯塔克Java驱动程序访问Apache Cassandra(版本2.1.9),我想知道当我将副本因子设置大于节点数时会发生什么。我在某个地方读到过,Cassandra允许此操作,但在保存一些数据时应该失败(当然这取决于写一致性级别,但我是指所有情况)。问题是,即使我尝试保存数据,也没有抛出任何异常。为什么呢?或许这些信息是陈旧的,用于旧版本的Cassandra? 还有一个问题,如果我向集群添加另一个节点,是否正确?
3个回答

9
Cassandra有一个“可调一致性”的概念,部分意味着您可以控制读/写操作的一致性级别设置。您可以在文档中阅读更多关于一致性级别和如何在cqlsh shell中设置它们的信息。为了了解更多,建议在单个Cassandra节点上尝试cqlsh。例如,我们可以创建一个副本因子为2的keyspace,并将一些数据加载到其中:
cqlsh> create keyspace test with replication = {'class': 'SimpleStrategy', 'replication_factor':2};
cqlsh> create table test.keys (key int primary key, val int);
cqlsh> insert into test.keys (key, val) values (1, 1);
cqlsh> select * from test.keys;

 key | val
-----+-----
   1 |   1 

一切都很正常,因为默认的一致性级别是ONE,所以只需要一个节点在线。现在尝试将其设置为ALL并进行相同的操作:

cqlsh> CONSISTENCY ALL;
Consistency level set to ALL.
cqlsh> insert into test.keys (key, val) values (2, 2);
Traceback (most recent call last):
  File "resources/cassandra/bin/cqlsh.py", line 1324, in perform_simple_statement
    result = future.result()
  File "resources/cassandra/bin/../lib/cassandra-driver.zip/cassandra-driver/cassandra/cluster.py", line 3133, in result
    raise self._final_exception
Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level ALL" info={'required_replicas': 2, 'alive_replicas': 1, 'consistency': 'ALL'}

cqlsh> select * from test.keys;
Traceback (most recent call last):
  File "resources/cassandra/bin/cqlsh.py", line 1324, in perform_simple_statement
    result = future.result()
  File "resources/cassandra/bin/../lib/cassandra-driver.zip/cassandra-driver/cassandra/cluster.py", line 3133, in result
    raise self._final_exception
Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level ALL" info={'required_replicas': 2, 'alive_replicas': 1, 'consistency': 'ALL'}

由于第二个节点不存在,因此既不能读取也不能写入。事实上,错误消息将给出有用的提示,需要两个副本,但只有一个可用。

一旦您使用cqlsh理解了这一点,您可以根据应用程序的需求使用Java驱动程序进行相同的操作。


1
我的错误,我定义了一个字符串查询,然后为此查询创建了一个语句,将一致性级别设置为ALL,最后……执行了字符串查询而不是语句:D 对不起我的问题,但我的代码不正确。感谢您的回答。 - bemol

1
不要将此设置为大于节点数的值,因为当写副本和读副本计数大于复制因子时,Cassandra会实现更高的一致性。例如,如果您有5个节点,并将复制因子设置为5,则如果1个节点停机,您将无法获得高一致性,因此失去了Cassandra可用性的优势。在添加节点后,您可以智能地增加因子,因为一致性级别从不允许您编写多于复制因子指定的节点数。

是的,我知道我不应该设置那个值。这不是生产代码,我只是编写了一些单元测试来学习Cassandra,并且我认为将复制因子设置为大于节点数会失败,但实际上并没有。所以我开始寻找原因,但还没有找到,所以我在这里问了一下。 - bemol
它不会立即失败。 - Rishi

0

我认为答案在这份关于如何在集群中分配数据的文档中。

添加新节点最简单的情况是使用虚拟节点。当您添加一个新节点时,它将被分配一些曾经属于其他节点的虚拟节点(令牌范围)。一切都会正常运作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接