我正在使用数据斯塔克Java驱动程序访问Apache Cassandra(版本2.1.9),我想知道当我将副本因子设置大于节点数时会发生什么。我在某个地方读到过,Cassandra允许此操作,但在保存一些数据时应该失败(当然这取决于写一致性级别,但我是指所有情况)。问题是,即使我尝试保存数据,也没有抛出任何异常。为什么呢?或许这些信息是陈旧的,用于旧版本的Cassandra?
还有一个问题,如果我向集群添加另一个节点,是否正确?
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驱动程序进行相同的操作。
我认为答案在这份关于如何在集群中分配数据的文档中。
添加新节点最简单的情况是使用虚拟节点。当您添加一个新节点时,它将被分配一些曾经属于其他节点的虚拟节点(令牌范围)。一切都会正常运作。