2

我有一个带有单个复制的 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应用程序中将consistencyLevel设置为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;
}

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

感谢您的任何见解

4

3 回答 3

1

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

于 2013-08-19T22:55:42.833 回答
0

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

在请求属于下行节点的数据时也是如此。

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

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

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

于 2013-08-19T19:33:25.770 回答
0

LOCAL_QUORUM如果您像这样配置将不起作用NetworkTopologyStrategy

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.
于 2013-11-07T10:44:35.360 回答