【问题标题】:cassandra replica exception HUnavailableExceptioncassandra 副本异常 HUnavailableException
【发布时间】:2013-08-21 15:40:41
【问题描述】:

我有一个带有单个复制的 cassandra 2 数据中心对,每个数据中心包含一个节点,每个数据中心位于网络上不同的物理服务器上。如果一个数据中心崩溃,另一个数据中心将继续可用于读写我在第三台服务器上启动了我的 java 应用程序,并且一切正常。它正在对 cassandra 进行读写。

接下来,我断开了网络连接,拔掉了网络中的第二台数据中心服务器。 我希望应用程序能够继续运行,不会出现第一个数据中心的异常情况,但事实并非如此。

应用程序开始出现以下异常:

me.prettyprint.hector.api.exceptions.HUnavailableException: : May not be enough replicas present to handle consistency level.
        at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:60)
        at me.prettyprint.cassandra.service.KeyspaceServiceImpl$9.execute(KeyspaceServiceImpl.java:354)
        at me.prettyprint.cassandra.service.KeyspaceServiceImpl$9.execute(KeyspaceServiceImpl.java:343)
        at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:101)
        at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:232)
        at me.prettyprint.cassandra.service.KeyspaceServiceImpl.operateWithFailover(KeyspaceServiceImpl.java:131)
        at me.prettyprint.cassandra.service.KeyspaceServiceImpl.getSuperColumn(KeyspaceServiceImpl.java:360)
        at me.prettyprint.cassandra.model.thrift.ThriftSuperColumnQuery$1.doInKeyspace(ThriftSuperColumnQuery.java:51)
        at me.prettyprint.cassandra.model.thrift.ThriftSuperColumnQuery$1.doInKeyspace(ThriftSuperColumnQuery.java:45)
        at me.prettyprint.cassandra.model.KeyspaceOperationCallback.doInKeyspaceAndMeasure(KeyspaceOperationCallback.java:20)
        at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecute(ExecutingKeyspace.java:85)
        at me.prettyprint.cassandra.model.thrift.ThriftSuperColumnQuery.execute(ThriftSuperColumnQuery.java:44)

将网线重新连接到第二台服务器后,错误就停止了。

这里有更多关于 cassandra 1.0.10 的详细信息

1) 以下是两个数据中心上 cassandra 的以下描述

Keyspace: AdvancedAds:
Replication Strategy: org.apache.cassandra.locator.NetworkTopologyStrategy
Durable Writes: true
Options: [DC2:1, DC1:1]

2) 我对每个实例运行了一个节点工具环

./nodetool -h 111.111.111.111 -p 11000 ring
Address DC Rack Status State Load Owns Token
1
111.111.111.111 DC1 RAC1 # <-- usUp Normal 1.07 GB 100.00% 0
111.111.111.222 DC2 RAC1 Up Normal 1.1 GB 0.00% 1

./nodetool -h 111.111.111.222 ring -port 11000
Address DC Rack Status State Load Owns Token
1
111.111.111.111 DC1 RAC1 Up Normal 1.07 GB 100.00% 0
111.111.111.222 DC2 RAC1 # <-- usUp Normal 1.1 GB 0.00% 1

3) 我检查了 cassandra.yaml

the seeds are 111.111.111.111, 111.111.111.222

4) 我检查了 cassandra-topology.properties

111.111.111.111

    # Cassandra Node IP=Data Center:Rack

    # datacenter 1
    111.111.111.111=DC1:RAC1 # <-- us

    # datacenter 2
    111.111.111.222=DC2:RAC1

    default=DC1:r1

111.111.111.222

    # Cassandra Node IP=Data Center:Rack

    # datacenter 1
    111.111.111.111=DC1:RAC1

    # datacenter 2
    111.111.111.222=DC2:RAC1 # <-- us

    default=DC1:r1

5) 我们在 java 应用程序中将一致性级别设置为 LOCAL_QUORUM,如下所示:

public Keyspace getKeyspace(final String keyspaceName, final String serverAddresses)
{        
    Keyspace ks = null;
    Cluster c = clusterMap.get(serverAddresses);
    if (c != null)
    {            
        ConfigurableConsistencyLevel policy = new ConfigurableConsistencyLevel();
        policy.setDefaultReadConsistencyLevel(consistencyLevel);
        policy.setDefaultWriteConsistencyLevel(consistencyLevel);

        // Create Keyspace
        ks = HFactory.createKeyspace(keyspaceName, c, policy);
    }        
    return ks;
}

有人告诉我这种配置可以工作,但也许我遗漏了一些东西。

感谢您的任何见解

【问题讨论】:

    标签: cassandra consistency


    【解决方案1】:

    众所周知,Hector 会返回虚假的不可用错误。原生协议Java驱动没有这个问题:https://github.com/datastax/java-driver

    【讨论】:

      【解决方案2】:

      如果您只有两个节点,并且您的数据将放在实际关闭的节点上,那么当需要一致性时,您可能无法实现完全写入可用性。 Cassandra 将通过 Hinted Handoff 实现这一目标,但对于 QUORUM 一致性级别,无论如何都会抛出 UnavailableException

      请求属于down节点的数据时也是如此。

      但是,您的集群似乎不是很平衡。你的节点 111.111.111.111 拥有 100%,然后 111.111.111.222 似乎拥有 0%,看看你的代币,他们似乎是这样做的原因。

      在这里查看如何设置初始令牌:http://www.datastax.com/docs/0.8/install/cluster_init#token-gen-cassandra

      另外,当这种情况可能发生时,您可能需要检查Another Question,其中包含更多原因的答案。

      【讨论】:

        【解决方案3】:

        如果您像这样配置NetworkTopologyStrategyLOCAL_QUORUM 将不起作用:

        Options: [DC2:1, DC1:1] # this will make LOCAL_QUORUM and QUORUM fail always
        

        LOCAL_QUORUM 和(根据我的经验)QUORUM 要求数据中心至少有 2 个副本。如果您想要一个跨数据中心的仲裁,您必须将一致性级别设置为与数据中心无关的TWO

        更多示例:

        Options: [DC2:3, DC1:1] # LOCAL_QUORUM for clients in DC2 works, QUORUM fails
        
        Options: [DC2:2, DC1:1] # LOCAL_QUORUM in DC2 works, but down after 1 node failure
                                # QUORUM fails, TWO works.
        

        【讨论】:

          猜你喜欢
          • 2015-06-03
          • 2019-04-01
          • 2016-10-14
          • 2019-02-13
          • 1970-01-01
          • 2015-01-22
          • 2019-10-25
          • 2018-09-16
          • 2011-01-24
          相关资源
          最近更新 更多