我正在为 Apache Cassandra (v. 2.1.9) 使用 datastax java 驱动程序,我想知道当我将 replication_factor 设置为大于节点数时会发生什么。我在某处读过 Cassandra 允许此操作,但是当我尝试保存一些数据时应该会失败(当然这取决于写入一致性级别,但我的意思是 ALL 的情况)。
问题是一切正常,即使我尝试保存数据也不会抛出异常。为什么?
对于旧版本的 Cassandra,我读过的信息可能是旧的?还有一个问题,这是否属实,而不是当我将另一个节点添加到集群时会发生什么?
3 回答
Cassandra 有一个“可调一致性”的概念,这在一定程度上意味着您可以控制读/写操作的一致性级别设置。
您可以在解释一致性级别以及如何在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
一切正常,因为默认的一致性级别是 ONE,所以只有 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 驱动程序应用相同的内容,具体取决于您的应用程序需要什么。
您不应将此值设置为高于节点数的原因,因为当写入副本和读取副本计数大于复制因子时,Cassandra 将实现更高的一致性。
例如,如果您有 5 个节点,并且您已将复制因子设置为 5。现在,如果 1 个节点出现故障,您将无法获得高一致性,因此您失去了 Cassandra 的可用性优势。
添加节点后,您可能会智能地增加因子,因为一致性级别永远不允许您写入超过复制因子指定的节点数。
我认为答案在这篇关于数据如何在集群中分布的文档中。
添加新节点最简单的情况是使用 vnode。当你添加一个新节点时,它会被分配一些曾经属于其他节点的 vnodes(token range)。一切都会继续正常工作。