【发布时间】:2019-01-02 22:33:44
【问题描述】:
我有一个 3 节点 Cassandra 集群(3.7),一个键空间
CREATE KEYSPACE demo WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '2'} AND durable_writes = true;
一张桌子
CREATE TABLE tradingdate (key text,tradingdate date,PRIMARY KEY (key, tradingdate));
有一天删除一行喜欢
delete from tradingdate
where key='tradingDay'and tradingdate='2018-12-31'
那么查询时删除的行就变成ghost了
select * from tradingdate
where key='tradingDay'and tradingdate>'2018-12-27' limit 2;
key | tradingdate
------------+-------------
tradingDay | 2018-12-28
tradingDay | 2019-01-02
select * from tradingdate
where key='tradingDay'and tradingdate<'2019-01-03'
order by tradingdate desc limit 2;
key | tradingdate
------------+-------------
tradingDay | 2019-01-02
tradingDay | 2018-12-31
所以当使用 order by 时,删除的行 (tradingDay, 2018-12-31) 又回来了。
我想我只删除了一个节点上的一行,但它仍然存在于另一个节点上。所以我执行:
nodetool repair demo tradingdate
在 3 个节点上,然后删除的行完全消失
所以我想知道为什么要使用order by,我可以看到鬼行。
【问题讨论】:
-
什么版本的 cassandra?
-
阅读时使用的一致性级别是多少?
-
我在cqlsh中执行查询,默认一致性是ONE。我记得我曾经遇到过这种情况,当设置一致性2时,会导致相同的结果
-
这可能是原因。您的删除不会传播到其他节点,并且在一致性 ONE 下,您可能会读取过时的数据。尝试使用 QUORUM 以获得更高的一致性。
-
但奇怪的是,当不使用 order by 时,我无法获取陈旧数据