Cassandra - 选择不复制

Mus*_*enç 4 replication consistency cassandra

可以说我已经创建了一个键空间和表:

CREATE KEYSPACE IF NOT EXISTS keyspace_rep_0
    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 0};

CREATE TABLE IF NOT EXISTS some_table (
    some_key ascii,
    some_data ascii,
    PRIMARY KEY (some_key)
);
Run Code Online (Sandbox Code Playgroud)

我不想要这些数据的任何副本.我可以使用一致性级别插入此表ANY.但是我无法从该表中选择任何数据.

与一致性水平查询时,我得到了下面的错误ANY,并ONE分别为:

message="ANY ConsistencyLevel is only supported for writes"

message="Cannot achieve consistency level ONE"
   info={'required_replicas': 1, 'alive_replicas': 0, 'consistency': 1}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了其他读取一致性级别,但它们都没有为我工作.

这与选择'replication_factor': 1和关闭节点非常相似.我再次无法选择任何数据.所有读取一致性级别至少需要一个副本才能启动.这是卡桑德拉的作品吗?没有复制,您无法选择数据?我错过了什么?

Wil*_*ice 8

该数据,包括原始的每个副本,是一个复制品.复制因子不是额外副本的计数,而是副本的总数.您需要RF> = 1.

我很惊讶它允许RF == 0.没有可用的副本,没有什么可读的.但是,对CASSANDRA-4486的评论表明这是故意允许的,但出于特殊目的:

...关键是设置零复制密钥空间是合法的(这在添加新数据中心时很常见)并在以后进行更改.与此同时,拒绝写入是正确的.

并且写入不会导致错误,可能是由于一致性级别描述中提到的暗示切换,因为:ANY

必须将写入写入至少一个节点.如果给定分区键的所有副本节点都已关闭,则在写入提示切换后写入仍然可以成功.如果所有副本节点在写入时都处于关闭状态,则在该分区的副本节点恢复之前,ANY写入将不可读.

因此,如果您希望确认您的写入是持久保存到至少一个节点而不依赖于提示的切换(可能会过期),那么请写入一致性级别ONE而不是ANY.