Cassandra UnavailableException:无法达到一致性级别LOCAL_ONE

时间:2018-03-06 19:28:45

标签: cassandra

我有一个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?)

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

答案 1 :(得分:0)

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

我必须通过以下声明解决这个问题:

MANIFEST.MF

(复制因子的默认值为1)

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