有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Cassandra复制因子大于节点数


我正在使用Apache Cassandra(2.1.9版)的datastax java驱动程序,我想知道当我将复制系数设置为大于节点数时会发生什么。我在某个地方读到,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 
    

    一切正常,因为默认的一致性级别是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驱动程序应用同样的方法,具体取决于您的应用程序需要什么

  2. # 2 楼答案

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

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

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