我有一个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'
然后,当查询时,已删除的行将变为幽灵
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,我可以看到幻影行。
答案 0 :(得分:0)
这是有关Cassandra(以及其他分布式系统)中删除操作的一些好读物:
http://thelastpickle.com/blog/2016/07/27/about-deletes-and-tombstones.html
以及:
https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlAboutDeletes.html
您将需要在gc_grace_seconds
内至少运行/安排一次例行修复,默认为10天,以防止数据重新出现在群集中。
此外,如果您的节点之一缺少删除(和其他消息),您还应该查找已丢弃的消息:
# nodetool tpstats
Pool Name Active Pending Completed Blocked All time blocked
MutationStage 0 0 787032744 0 0
ReadStage 0 0 1627843193 0 0
RequestResponseStage 0 0 2257452312 0 0
ReadRepairStage 0 0 99910415 0 0
CounterMutationStage 0 0 0 0 0
HintedHandoff 0 0 1582 0 0
MiscStage 0 0 0 0 0
CompactionExecutor 0 0 6649458 0 0
MemtableReclaimMemory 0 0 17987 0 0
PendingRangeCalculator 0 0 46 0 0
GossipStage 0 0 22766295 0 0
MigrationStage 0 0 8 0 0
MemtablePostFlush 0 0 127844 0 0
ValidationExecutor 0 0 0 0 0
Sampler 0 0 0 0 0
MemtableFlushWriter 0 0 17851 0 0
InternalResponseStage 0 0 8669 0 0
AntiEntropyStage 0 0 0 0 0
CacheCleanupExecutor 0 0 0 0 0
Native-Transport-Requests 0 0 631966060 0 19
Message type Dropped
READ 0
RANGE_SLICE 0
_TRACE 0
MUTATION 0
COUNTER_MUTATION 0
REQUEST_RESPONSE 0
PAGED_RANGE 0
READ_REPAIR 0
丢弃的消息表明出了点问题。