将UnavailableException重试到其他数据中心

时间:2014-12-12 20:15:39

标签: cassandra-2.0

我使用DataStax Cassandra Java驱动程序2.1.2让客户端连接到三个数据中心之一,如下所示:

.withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy(" DC1",1)))

这将DC1设置为本地数据中心,但也让驱动程序与其他两个远程数据中心建立连接。

现在,如果某些节点在本地数据中心中关闭,则客户端将无法在insert语句上获取本地仲裁,并且将抛出UnavailableException。但是远程数据中心有足够的节点可供插件在那里获得法定数量并成功,因此我希望驱动程序在其他数据中心重试插入。但是我如何告诉司机这样做呢?

看起来有一种方法可以将RetryPolicy设置为以较低的一致性级别重试,但我没有看到有关重试远程数据中心的任何信息。

如果DC1中的所有节点都关闭,那么驱动程序会在远程数据中心尝试插入成功。

1 个答案:

答案 0 :(得分:1)

我最终让这个工作的方式是我首先尝试使用这些设置插入(注意我在插入时使用“IF NOT EXISTS”子句):

statement.setConsistencyLevel(ConsistencyLevel LOCAL_QUORUM ); (ConsistencyLevel LOCAL_SERIAL )statement.setSerialConsistencyLevel;

这告诉Cassandra只有插入才能获得“IF NOT EXISTS”检查和写入的本地仲裁。如果没有足够的副本来获取本地仲裁,我会捕获UnavailableException和NoHostAvailableException异常并将一致性级别更改为:

statement.setConsistencyLevel(ConsistencyLevel QUORUM ); (ConsistencyLevel SERIAL )statement.setSerialConsistencyLevel;

然后我再次尝试插入,这次它将尝试在所有数据中心达到法定数量并成功。因此,通过这种方法,通过将非常昂贵的“IF NOT EXISTS”检查限制到本地DC,同时获得在某些本地副本关闭时不会死在水中的可靠性,我获得了大多数插入的良好性能。