我们的Cassandra 2.0.6存在问题。簇。我们的设置如下:
首先,我创建了包含一个表的键空间。
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只能在本地数据中心处理,但它不是。
我对轻量级交易的理解有什么不对?
答案 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驱动程序。