Cassandra 3.1
NodeJS 驱动程序:cassandra-driver 3.0.0

使用以下语句创建 key 空间:

如果不存在则创建键空间 xxxxxx
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };

即使复制因子为 2,我也仅出于开发目的运行一个实例,并将一致性级别设置为 ONE。
这是当我尝试使用 IF NOT EXISTS 子句插入任何记录时出现的问题,我遇到了一致性级别错误。但是没有 IF NOT EXISTS 的语句工作得很好。这是来自 cqlsh 的日志:

cqlsh:xxxxxx> CONSISTENCY;
Current consistency level is ONE.
cqlsh:xxxxxx> insert into accounts(account_id) values('test');
cqlsh:xxxxxx> insert into accounts(account_id) values('test1') if not exists;
Traceback (most recent call last): File "/usr/bin/cqlsh.py", line 1258, in perform_simple_statement result = future.result() File "/usr/share/cassandra/lib/cassandra-driver-internal-only-3.0.0-6af642d.zip/cassandra-driver-3.0.0-6af642d/cassandra/cluster.py", line 3122, in result raise self._final_exception Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level QUORUM" info={'required_replicas': 2, 'alive_replicas': 1, 'consistency': 'QUORUM'}

最佳答案

paxos 的“if not exists”子句使用“SERIAL CONSISTENCEY”的不同一致性设置,它可以具有值 SERIAL 或 LOCAL_SERIAL。

SERIAL 设置意味着它需要跨所有副本的仲裁,而 LOCAL_SERIAL 意味着它需要本地数据中心的仲裁。复制因子为 2 时,仲裁为 2 个副本。

不幸的是,“SERIAL CONSISTENTY”没有 LOCAL_ONE 或 ONE 设置,因此在您的情况下,如果不存在,您将需要两个副本才能成功插入。

关于node.js - Cassandra 一致性级别和 IF NOT EXISTS 子句问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34558848/

10-09 17:47
查看更多