Cassandra 复制因子大于节点数
Cassandra replication factor greater than number of nodes
我正在为 Apache Cassandra (v. 2.1.9) 使用 datastax java 驱动程序,我想知道当我设置 replication_factor 大于节点数时会发生什么。我在某处读到 Cassandra 允许执行此操作,但是当我尝试保存一些数据时应该会失败(当然这取决于写入一致性级别,但我指的是 ALL 的情况)。
问题是一切正常,没有抛出异常,即使我尝试保存数据。为什么?
对于旧版本的 Cassandra,也许我读过的信息是旧的?
还有一个问题,这是否属实,而不是当我将另一个节点添加到集群时会发生什么?
您不应将此值设置为高于节点数的原因,因为当写入副本和读取副本数大于复制因子时,Cassandra 会实现更高的一致性。
例如,如果您有 5 个节点,并且您已将复制因子设置为 5。现在,如果 1 个节点出现故障,您将无法获得高一致性,因此您将失去 Cassandra 可用性的优势。
添加节点后,您可以智能地增加该因子,因为一致性级别永远不允许您写入超过复制因子指定的节点数。
我想答案就在这篇关于 How data is distributed accross a cluster 的文档中。
添加新节点最简单的情况是使用 vnode。当你添加一个新节点时,它会被分配一些曾经属于其他节点的vnodes(令牌范围)。一切都会继续正常工作。
Cassandra 有一个 "tunable consistency" 的概念,这在一定程度上意味着您可以控制 read/write 操作的一致性级别设置。
您可以在解释 consistency levels and how to set them in the 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 个节点必须在线。现在尝试相同但将其设置为 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 驱动程序应用相同的内容,具体取决于您的应用程序需要什么。
我正在为 Apache Cassandra (v. 2.1.9) 使用 datastax java 驱动程序,我想知道当我设置 replication_factor 大于节点数时会发生什么。我在某处读到 Cassandra 允许执行此操作,但是当我尝试保存一些数据时应该会失败(当然这取决于写入一致性级别,但我指的是 ALL 的情况)。
问题是一切正常,没有抛出异常,即使我尝试保存数据。为什么?
对于旧版本的 Cassandra,也许我读过的信息是旧的?
还有一个问题,这是否属实,而不是当我将另一个节点添加到集群时会发生什么?
您不应将此值设置为高于节点数的原因,因为当写入副本和读取副本数大于复制因子时,Cassandra 会实现更高的一致性。
例如,如果您有 5 个节点,并且您已将复制因子设置为 5。现在,如果 1 个节点出现故障,您将无法获得高一致性,因此您将失去 Cassandra 可用性的优势。
添加节点后,您可以智能地增加该因子,因为一致性级别永远不允许您写入超过复制因子指定的节点数。
我想答案就在这篇关于 How data is distributed accross a cluster 的文档中。
添加新节点最简单的情况是使用 vnode。当你添加一个新节点时,它会被分配一些曾经属于其他节点的vnodes(令牌范围)。一切都会继续正常工作。
Cassandra 有一个 "tunable consistency" 的概念,这在一定程度上意味着您可以控制 read/write 操作的一致性级别设置。
您可以在解释 consistency levels and how to set them in the 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 个节点必须在线。现在尝试相同但将其设置为 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 驱动程序应用相同的内容,具体取决于您的应用程序需要什么。