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

1 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)
);
Run Code Online (Sandbox Code Playgroud)

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

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

这导致了错误消息:

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

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

INSERT INTO test.account (id, code, alias) VALUES ( '1', '2', '3')
Run Code Online (Sandbox Code Playgroud)

我找到了DC-local CASCassandra票,所以我认为在这种情况下的CQL只能在本地数据中心处理,但事实并非如此.

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

Wil*_*ice 5

DataStax文档解释(强调):

Cassandra 2.0使用Paxos共识协议,类似于2阶段提交,以支持可线性化的一致性.所有操作都是基于仲裁的,更新将导致性能损失......

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

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