轻量级交易和带有cassandra的多重直流

时间:2014-04-20 09:17:21

标签: cassandra-2.0

我们的Cassandra 2.0.6存在问题。簇。我们的设置如下:

  • 2个数据中心,名称为:DC1,DC2
  • 每个DC中的两个节点
  • 使用NetworkTopologyStrategy进行复制
  • 客户端正在使用Datastax Java Driver v.1.0.3
  • 进行连接

首先,我创建了包含一个表的键空间。

CREATE KEYSPACE test 
WITH replication = {
  'class': 'NetworkTopologyStrategy',
  'DC1': '1',
  'DC2': '1'
};

CREATE TABLE account (
  id text,
  code text,
  alias text,
  PRIMARY KEY (id, code)
);

然后在运行此语句之前关闭DC2:

INSERT INTO test.account (id, code, alias) VALUES ( '1', '2', '3') if not exists;

导致错误消息:

  

>>>>无法完成请求:一个或多个节点不可用。

使用相同的环境,运行此语句就可以了:

INSERT INTO test.account (id, code, alias) VALUES ( '1', '2', '3')

我找到了Cassandra ticket for DC-local CAS,所以我认为这种情况下的CQL只能在本地数据中心处理,但它不是。

我对轻量级交易的理解有什么不对?

1 个答案:

答案 0 :(得分:5)

DataStax documentation解释(强调添加):

  

Cassandra 2.0使用类似于2阶段提交的Paxos共识协议来支持可线性化的一致性。 所有操作都是基于法定人数的,更新会带来性能损失......

默认情况下,您的CAS操作(IF NOT EXISTS)对Paxos使用SERIAL隔离级别,并且需要联系法定数量的所有副本。如果只有两个副本(如每个数据中心一个副本),则仲裁需要两个副本。如果您尝试使用QUORUM一致性级别的非CAS插入,它也将失败。

CASSANDRA-5797引入了LOCAL_SERIAL隔离级别的概念,但不是默认,必须明确指定才能使用。如何做到这将取决于你如何与Cassandra接口,例如cqlsh客户端与DataStax Java驱动程序。