Cassandra复制因子大于节点数

时间:2016-03-09 11:03:02

标签: java cassandra datastax-java-driver cassandra-2.1


我正在为Apache Cassandra使用datastax java驱动程序(v.2.1.9),我想知道当我将replication_factor设置为大于节点数时会发生什么。我已经阅读过Cassandra允许进行此操作的地方,但是当我尝试保存一些数据时会失败(当然这取决于写入一致性级别,但我的意思是ALL的情况)。
问题是一切正常,即使我尝试保存数据,也不会抛出任何异常。为什么呢?
对于较旧版本的Cassandra,也许我读过的那些信息都很旧了? 还有一个问题,不管它是否属于我将另一个节点添加到集群时会发生什么?

3 个答案:

答案 0 :(得分:5)

Cassandra有一个"可调整一致性的概念"这部分意味着您可以控制读/写操作的一致性级别设置。

您可以在解释consistency levels的文档中阅读更多内容,以及如何在cqlsh shell中进行设置。

要了解更多信息,我建议在Cassandra的单节点上尝试使用cqlsh。例如,我们可以创建一个复制因子为2的密钥空间,并将一些数据加载到其中:

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 

一切正常,因为默认一致性级别为1,因此只有1个节点必须在线。现在尝试相同但将其设置为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 :(得分:1)

当写入副本和读取副本计数大于复制因子时,不应将此值设置为高于节点数的原因,因为Cassandra将实现更高的一致性。

例如,如果您有5个节点,并且已将复制因子设置为5.现在,如果1个节点发生故障,您将无法获得高度一致性,因为您已失去Cassandra可用性的优势。

添加节点后,您可以智能地增加因子,因为一致性级别从不允许您写入超过复制因子指定的节点数。

答案 2 :(得分:0)

我认为答案出现在本文件中How data is distributed accross a cluster

添加新节点的最简单方法是使用vnode。添加新节点时,将为其分配一些曾经属于其他节点的vnode(令牌范围)。一切都会继续正常。