nagrobki w Apache Cassandra

rodzaje nagrobków

nagrobki mogą być tworzone na wiele sposobów i ważne jest, aby zrozumieć pewne pułapki, które mogą prowadzić do ukrytego tworzenia nagrobków, które pozostaną ukryte z punktu widzenia programisty, dopóki nie pojawią się jako prawdopodobny problem wpływający na Twój klaster. Dlatego ważne jest, aby zrozumieć rodzaje nagrobków, które można utworzyć w Cassandrze:

cell tombstones
instrukcje Insert mogą tworzyć nagrobki, gdy pewna wartość komórki jest ustawiona jako null w zapytaniu. Może się to zdarzyć, gdy warstwa abstrakcji bazy danych lub framework ORM abstrahuje zapytanie z reprezentacją na poziomie obiektu, a wartości null są domyślnie przesyłane w rzeczywistym zapytaniu do Cassandry. Na przykład rozważ następujące zapytanie CQL:

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

utworzyłoby to nagrobek komórki dla kolumny zamienników dla rekordu o numerze store_number CA104.
teraz rozważ następujące zapytanie delete:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

stworzyłoby to również nagrobek komórki dla odpowiedniego rekordu.

nagrobki rzędowe
cały wiersz jest oznaczany jako nagrobek w wyniku zapytania delete, które identyfikuje wiersz. Na przykład:

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

Sstabledump wyświetla deletion_info na poziomie wiersza dla grupowania kolumn wewnątrz partycji.

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

duża liczba nagrobków rzędowych może wskazywać na słaby model danych, w którym aplikacja często usuwa rekordy z tabeli. W takich przypadkach rozważ ponowne przeanalizowanie modelu danych i przeprojektowanie tabel w oparciu o wzorce zapytań i Kardynalność.

zakres
usuwanie całego zakresu wierszy za pomocą klauzuli WHERE z kluczem partycji i zakresu reprezentowanego przez kolumnę klastrową. Na przykład:

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

sstabledump pokaże,

,"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 drukuje nagrobki range z typem range_tombstone_bound z początkiem i końcem klucza klastrowania używanego do oznaczania zakresu wierszy, które zostały tombstonowane na partycji. Range tombstones są również tworzone, gdy cała kolekcja jest zastępowana zapytaniem INSERT lub UPDATE. Zawsze zaleca się zastępowanie konkretnych elementów kolekcji, a nie zastępowanie całej kolekcji.

nagrobki partycji
nagrobki tego typu są tworzone, gdy wywołane jest zapytanie delete, używając tylko klucza partycji w klauzuli WHERE. Na przykład:

DELETE FROM item_price WHERE store_number = 'CA102';

jak zapewne się domyślacie, spowoduje to usunięcie całej partycji CA102, a sstabledump pokaże partycji atrybut deletion_info ze znacznikiem czasowym marked_deleted.

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

TTL tombstones
są to nagrobki tworzone automatycznie, gdy wygasa czas życia dla określonego wiersza lub komórki. Są one jednak oznaczone inaczej niż zwykłe nagrobki.

poniższe polecenie insert stworzy nagrobek TTL po 20 sekundach.

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 pokaże:

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

podsumowanie

  • Cassandra traktuje zapytanie delete wewnętrznie jako operację aktualizacji, która dodaje znacznik o nazwie tombstone na danych do usunięcia.
  • nagrobki mogą być skonfigurowane z czasem wygaśnięcia (gc_grace_seconds) i są czyszczone podczas procesu zagęszczania.
  • sstabledump narzędzie może być używane do przeglądania zawartości pliku SSTable w formacie czytelnym dla człowieka.
  • unikaj zapisywania wartości Null do tabel, ponieważ mogą one tworzyć nagrobki. Zachowaj ostrożność podczas tworzenia zapytań abstrakcyjnych przez warstwę ORM.
  • Range tombstones są preferowane w stosunku do nagrobków komórkowych lub rzędowych, ponieważ po prostu przechowuje granice zakresu, oszczędzając miejsce na dysku.
  • unikaj zastępowania całych elementów kolekcji, takich jak zestaw, lista, mapa zapytaniami INSERT i UPDATE, ponieważ może to tworzyć szeregi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.