我们的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)
);
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 CAS的Cassandra票,所以我认为在这种情况下的CQL只能在本地数据中心处理,但事实并非如此.
我对轻量级交易的理解有什么问题?
该DataStax文档解释(强调):
Cassandra 2.0使用Paxos共识协议,类似于2阶段提交,以支持可线性化的一致性.所有操作都是基于仲裁的,更新将导致性能损失......
默认情况下,CAS操作(IF NOT EXISTS)使用SERIALPaxos 的隔离级别,需要联系所有副本的法定数量.如果只有两个副本(如每个数据中心一个副本),则仲裁需要两个副本.如果您尝试使用QUORUM一致性级别的非CAS插入,它也将失败.
CASSANDRA-5797引入了LOCAL_SERIAL隔离级别的概念,但它不是默认值,必须明确指定才能使用.如何做到这将取决于您如何与Cassandra连接,例如cqlsh客户端与DataStax Java驱动程序.
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |