【问题标题】:Cassandra replication factor greater than number of nodesCassandra 复制因子大于节点数
【发布时间】:2016-06-23 17:15:33
【问题描述】:


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

【问题讨论】:

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


    【解决方案1】:

    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 
    

    一切正常,因为默认的一致性级别是 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 驱动程序来应用它,这取决于您的应用程序需要什么。

    【讨论】:

    • 我的错误,我定义了字符串查询,然后为此查询创建了一个语句,将一致性级别设置为 ALL,最后......执行字符串查询而不是语句:D 对不起我的问题,但我的代码不对。感谢您的回答。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我知道我不应该设置该值,这不是生产代码,我刚刚编写了一些单元测试来学习 Cassandra,我认为将 replication_factor 设置为大于节点数会失败,但事实并非如此。所以我已经开始寻找其中的原因,但我还没有找到,所以我在这里问。
    • 它不会立即失败。
    【解决方案3】:

    我认为答案在这篇文档中关于How data is distributed accross a cluster

    添加新节点最简单的情况是使用 vnode。当你添加一个新节点时,它会被分配一些曾经属于其他节点的 vnodes(token range)。一切都会继续正常工作。

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 2019-08-10
      • 1970-01-01
      • 2017-07-30
      • 2017-02-02
      • 2018-04-17
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多