【问题标题】:Cassandra UnavailableException: Cannot achieve consistency level LOCAL_ONECassandra UnavailableException:无法达到一致性级别 LOCAL_ONE
【发布时间】:2018-08-14 18:25:05
【问题描述】:

我有一个 3 节点 Cassandra 集群,其密钥空间的复制因子为 3:

CREATE KEYSPACE demo
  WITH REPLICATION = {
    'class':'SimpleStrategy',
    'replication_factor':3
  };

(仅部署在一个数据中心)

在进行故障测试时,即关闭一个节点时,我在尝试对我的键空间进行查询时遇到这些异常:

 Caused by: org.apache.cassandra.exceptions.UnavailableException: Cannot achieve consistency level LOCAL_ONE
    at org.apache.cassandra.db.ConsistencyLevel.assureSufficientLiveNodes(ConsistencyLevel.java:296) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.service.AbstractReadExecutor.getReadExecutor(AbstractReadExecutor.java:162) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.service.StorageProxy$SinglePartitionReadLifecycle.<init>(StorageProxy.java:1774) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.service.StorageProxy.fetchRows(StorageProxy.java:1736) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.service.StorageProxy.readRegular(StorageProxy.java:1682) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.service.StorageProxy.read(StorageProxy.java:1597) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.db.SinglePartitionReadCommand$Group.execute(SinglePartitionReadCommand.java:997) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:277) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:247) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.auth.CassandraRoleManager.getRoleFromTable(CassandraRoleManager.java:521) ~[apache-cassandra-3.10.jar:3.10]
    at org.apache.cassandra.auth.CassandraRoleManager.getRole(CassandraRoleManager.java:503) ~[apache-cassandra-3.10.jar:3.10]
    ... 47 common frames omitted

我不确定为什么会看到此错误,因为:

  1. 我的复制因子设置为 3(即我还有 2 个节点,每个节点都包含所有数据)
  2. 我的一致性级别设置为 QUORUM。 (为什么我看到的是 LOCAL_ONE?)

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    您在日志中看到的一致性级别是 Cassandra 在内部用于检索存储在 system_auth 密钥空间中的身份验证信息的一致性级别。

    Cassandra 在查询默认 Cassandra 用户“cassandra”的系统身份验证时使用 QUORUM

    Cassandra 在为其他用户查询 system_auth 时使用 LOCAL_ONE

    默认情况下,Cassandra 对 system_auth 密钥空间使用 SimpleStrategy(这不是很好),复制因子为 1(这不是很好)。 强烈建议改用 NetworkTopologyStrategy,并将复制因子增加到每个数据中心至少 3 个。这应该可以解决您的问题。

    Apache Cassandra 文档中解释了所有内容:

    http://cassandra.apache.org/doc/latest/operating/security.html#authentication

    【讨论】:

      【解决方案2】:

      所以事实证明,在我的情况下,问题在于 system_auth 密钥空间,它需要增加它的复制因子(到 2 或 3)才能实现高可用性。这是必需的,因为我使用 PasswordAuthenticator 进行身份验证。

      我必须用以下语句来解决这个问题:

      ALTER KEYSPACE "system_auth"
        WITH REPLICATION = {
          'class':'SimpleStrategy',
          'replication_factor':3
        };
      

      (复制因子默认为 1)

      这里记录了这样做的需要:https://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/secureConfigNativeAuth.html

      【讨论】:

        猜你喜欢
        • 2016-10-12
        • 2015-10-27
        • 2016-10-29
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2016-07-05
        相关资源
        最近更新 更多