Cassandra - satır silinemiyor

Aug 22 2020

Casandra tablosundan belirli bir satırı silmek istiyorum ama yapamıyorum. Bunun dışında tablodan diğerlerini silebilirim. Sonunda silme sorgusu koydum ama hiçbir şey olmadı:

cqlsh> delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';
cqlsh>
cqlsh> select * from sales.tbl where orderid=999999 and orderdate='2019/01/01';

 orderid | orderdate  | country | itemtype | orderpriority | region        | saleschannel | shipdate   | totalcost | totalprofit | totalrevenue | unitcost | unitprice | unitssold
---------+------------+---------+----------+---------------+---------------+--------------+------------+-----------+-------------+--------------+----------+-----------+-----------
  999999 | 2019/01/01 |  Canada |    Stuff |             N | North America |      Offline | 2019/01/02 |       100 |           0 |          100 |        0 |         1 |         1

(1 rows)
cqlsh>

İşte bu tablonun şema:

    CREATE TABLE sales.tbl1 (
        orderid bigint,
        orderdate text,
        country text,
        itemtype text,
        orderpriority text,
        region text,
        saleschannel text,
        shipdate text,
        totalcost float,
        totalprofit float,
        totalrevenue float,
        unitcost float,
        unitprice float,
        unitssold int,
        PRIMARY KEY (orderid, orderdate) ) WITH CLUSTERING ORDER BY (orderdate ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
        AND comment = ''
        AND compaction = {'class': 'SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND crc_check_chance = 1.0
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 1
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99.0PERCENTILE';

herhangi bir öneri?

Yanıtlar

3 NadavHar'El Aug 22 2020 at 18:36

Bu tuhaf durum, satır gelecekte çok uzak bir zaman dilimiyle oluşturulmuşsa gerçekleşebilir . Cassandra ve Scylla'da, istemciler her yazma işlemi için bir zaman damgası belirleyebilir ve güncellemelerin gerçek zamanlı sıralamasına bakılmaksızın en son zaman damgası kazanır.

Örneğin, bir istemcinin zaman damgası 1000 ile bir satır yazdığını ve bir süre sonra başka bir istemcinin zaman damgası 900'de bir silme gönderdiğini düşünün. Bu silme işlemi hiçbir şeyi silmeyecektir - yazma işleminin silme işleminden sonra gerçekleştiği kabul edilir, bu nedenle silme işlemi basitçe yok sayılır.

Size tam olarak bunun olması mümkündür: Yanlış yapılandırılmış bir saate sahip bir müşteri bu saati kullandı ve gelecekte çok uzak bir zaman damgası olan bir satır oluşturdu. Şimdi denediğinizde delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';, geçerli saat bu silme işleminin zaman damgası olarak kullanılır ve bu gelecekteki zaman damgasından daha eskidir, bu nedenle silme işlemi yok sayılır.

Durumun bu olup olmadığını kontrol etmek için deneyin

select writetime(region) from sales.tbl where orderid=999999 and orderdate='2019/01/01';

Bu, öğenizdeki "bölge" sütununun (örneğin) yazma süresini (yani zaman damgasını) gösterecektir. Bu süre, UNIX döneminden (gece yarısı GMT, 1 Ocak 1970) bu yana mikrosaniye cinsindendir. Gelecekte ise, probleminizi doğru tahmin ettim. Durum buysa, bu satırı gerçekten silmek için aşağıdaki gibi bir şey yapmanız gerekecek:

delete from sales.tbl using timestamp 111111111 where orderid=999999 and orderdate='2019/01/01';

Zaman damgası "111111111", selectsize gösterilen zaman damgasından (en az) bir büyük sayıdır .