Warum lese ich viele Grabsteine ​​in der Cassandra-Tabelle, obwohl mein Zugriffsmuster sie vermeiden sollte?

StackOverflow https://stackoverflow.com//questions/24053860

  •  21-12-2019
  •  | 
  •  

Frage

Ich weiß, dass dies nicht die beste Art ist, Cassandra zu verwenden, aber die Art meiner Daten erfordert das Lesen aller Daten der letzten Woche.Bei der Verwendung von Sammlungstypen in CQL3 bin ich jedoch auf bestimmte Einschränkungen gestoßen, die mich daran hindern, normale Datumsbereichsabfragen durchzuführen.

Deshalb habe ich Cassandra (derzeit ein einzelner Knoten, in Zukunft wahrscheinlich mehr) mit der folgenden Tabelle eingerichtet

CREATE TABLE cache (tag text, id int, tags map<text,text>, 
  PRIMARY KEY (tag, id) );
ALTER TABLE cache WITH GC_GRACE_SECONDS = 0;

Ich füge mit einer TTL von einer Woche ein, um die Elemente automatisch aus dem Cache zu entfernen.

Ich habe versucht, den in aufgeführten Vorschlägen zu folgen Dieser Artikel um das Auslesen vieler Tombstones zu vermeiden, indem ich nach „Mindest-ID“ auswähle, die ich an anderer Stelle beibehalte, um das Auslesen alter Daten zu vermeiden:

SELECT * FROM cache WHERE tag = ? AND id >= ?

Die ID ist im Grunde eine Art Zeitstempel, der ständig zunimmt, d. h.Ich füge mit der Zeit nur höhere Werte ein und entferne ständig ältere IDs aus der Tabelle.

Aber ich bekomme immer noch Warnungen, wenn Schwellenwerte erreicht werden

WARN 08:59:06,286 Read 5001 live and 5702 tombstoned cells in cache (see tombstone_warn_threshold)

Und wenn ich die manuelle Komprimierung/Bereinigung nicht regelmäßig durchführe, erhalte ich Ausnahmen und Abfragen schlagen fehl.

Basierend auf meinem Verständnis aus den Artikeln und der Dokumentation sollte ich jedoch die meisten, wenn nicht alle Tombstones hier vermeiden, da ich die Gleichheit des Tags abfrage, wodurch Cassandra nur nach diesen Bereichen suchen kann, und ich eine Mindest-ID verwende, die Cassandra den Start ermöglicht Wird erst nach den meisten Tombstones gelesen. Warum werden dann immer noch Tombstone-Warnungen/Ausnahmen gemeldet?

War es hilfreich?

Lösung

Das Karten-K/V-Paar ist eigentlich eine Spalte (Name, Wert und Zeitstempel):Wenn Sie also viele Kartenelemente löschen (es ist auch der Fall, dass sie nach TTL ablaufen), ist dies die Ursache dieser Warnung.Weil Sie immer noch vollständige Karten lesen (mit vielen Grabsteinen darin).Außerdem wird die TTL-Einstellung auf der Karte auf Elementbasis angewendet.

Zweitens wird dies mit dem Prädikat >= in Ihrer Auswahlabfrage multipliziert.

Wenn dies der Fall ist, sollten Sie Ihr Datenzugriffsmuster so umgestalten, dass in SELECT-Abfragen und Bumps nur EQ-Beziehungen verwendet werden id öfters.Außerdem können Sie mit diesem Zugriffsmuster den Clustering-Teil Ihres PRIMÄRSCHLÜSSELS loswerden.

Wenn Sie also nicht viele Löschungen auf dieser Karte vornehmen, können Sie versuchen, sie zu verwenden tag text, time timeuuid, name text, data text Modellieren und präzise nach Zeit aufteilen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top