Tombstones i Apache Cassandra

typer av gravstenar

Tombstones kan skapas på ett antal sätt och det är viktigt att du förstår vissa fallgropar som kan leda till implicit skapande av gravstenar som kommer att förbli dolda från programmerarens synvinkel tills det dyker upp som ett troligt problem som påverkar ditt kluster. Därför är det viktigt att förstå vilka typer av gravstenar som kan skapas i Cassandra:

Cellgravstenar
infoga satser kan skapa gravstenar när ett visst cellvärde är inställt som null i frågan. Detta kan hända när databasabstraktionslager eller ett ORM-ramverk abstraherar frågan med objektnivårepresentation och null-värdena implicit skickas ner i den faktiska frågan till Cassandra. Tänk till exempel på följande CQL-fråga:

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');

detta skulle skapa en cellgravsten för kolumnen replacements för posten med store_number CA104.
nu överväga följande delete query:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

detta skulle också skapa en cellgravsten för motsvarande post.

Radgravstenar
en hel rad markeras som en gravsten som ett resultat av en raderingsfråga som identifierar en rad. Till exempel:

DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;

Sstabledump skulle visa en deletion_info på radnivå för klusterkolumnerna i partitionen.

,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]

ett stort antal radgravstenar kan vara en indikation på en dålig datamodell där din applikation ofta tar bort poster från en tabell. I sådana fall kan du överväga att se över din datamodell och omforma tabeller baserat på frågemönster och kardinaliteten.

Range tombstones
radera ett helt radintervall med WHERE-klausulen med en partitionsnyckel och ett intervall som representeras av en klusterkolumn. Till exempel:

DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;

SSTabledump skulle visa,

,"position" : 0
},
"rows" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
},
{
"type" : "range_tombstone_bound",
"end" : {
"type" : "inclusive",
"clustering" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
}
]
}
}}

SSTabledump skulle skriva ut intervallgravstenar med en typ av range_tombstone_bound med en början och slutet av klustringsnyckeln som används för att beteckna radintervallet som var tombstoned i en partition. Range tombstones skapas också när en hel samling ersätts med en INSERT eller UPDATE-fråga. Det rekommenderas alltid att ersätta specifika delar av en samling snarare än att ersätta hela samlingen själv.

Partition tombstones
Tombstones av denna typ skapas när en delete-fråga avfyras med endast partitionsnyckeln i where-satsen. Till exempel:

DELETE FROM item_price WHERE store_number = 'CA102';

som du säkert har gissat skulle detta ta bort hela partitionen CA102 och sstabledump skulle visa partitionen deletion_info-attributet med marked_deleted tidsstämpel.

,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]

TTL-gravstenar
dessa är gravstenar som skapas automatiskt när tiden att leva löper ut för en viss rad eller cell. De är dock markerade annorlunda än vanliga gravstenar.

följande insert-uttalande skulle skapa en TTL-gravsten efter 20 sekunder.

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code) VALUES ( 'CA103', 'item103', 3.0, {'item101-r', 'item101'}, 'p103') using TTL 20;

sstabledump skulle visa:

,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]

sammanfattning

  • Cassandra behandlar en borttagningsfråga internt som en uppdateringsoperation som lägger till en markör som heter tombstone på de data som ska raderas.
  • Tombstones kan konfigureras med en utgångstid (gc_grace_seconds) och städas upp under komprimeringsprocessen.
  • sstabledump utility kan användas för att visa innehållet i en sstable-fil i ett läsbart format.
  • Undvik att skriva Null-värden till dina tabeller, eftersom det kan skapa gravstenar. Var försiktig när du gör frågor abstraherade av ditt ORM-lager.
  • Range tombstones föredras framför cell-eller radgravstenar eftersom det bara lagrar intervallgränserna som sparar diskutrymme.
  • Undvik att ersätta hela element i en samling som set, list, map med INSERT och UPDATE-frågor eftersom detta kan skapa intervallgravstenar.

Lämna ett svar

Din e-postadress kommer inte publiceras.