2010-11-15 9 views
18

Können Sie Ihre Gedanken teilen, wie Sie die Datenversionierung in Cassandra implementieren würden?Möglichkeiten zum Implementieren der Datenversionsverwaltung in Cassandra

Angenommen, dass ich Datensätze in einem einfachen Adressbuch versionieren muss. (Adressbucheinträge werden als Zeilen in einer ColumnFamily gespeichert). erwarte ich, dass die Geschichte:

  • selten verwendet wird
  • wird auf einmal in einer „Zeitmaschine“ Art und Weise zu präsentieren verwendet werden
  • wird es nicht mehr Versionen als einige hundert bis ein einzelner Datensatz
  • Geschichte wird nicht ablaufen.

Ich betrachte den folgenden Ansatz:

  • das Adressbuch zu Super-Spalte Familie Konvertieren und mehrere Version von Adressbuch Aufzeichnungen in einer Zeile eingegeben speichern (durch Zeitstempel) als Super-Spalten.

  • Erstellen Sie eine neue Super Column Family, um alte Datensätze oder Änderungen an den Datensätzen zu speichern. Eine solche Struktur würde wie folgt aussehen:

    { 'Adressbuch Zeilenschlüssel': { 'Zeit STAMP1': { 'Vornamen': 'neuen Namen', 'geändert durch': 'user id' ,}

    'time stamp2': { 
         'first name': 'new name', 
         'modified by': 'user id', 
        }, 
    }, 
    

    'eine andere Adreßbuch Zeilenschlüssel': { 'Zeitstempel': { ....

  • Shop Versionen als serialisiert (JSON) Objekt in neuen Col angebracht umnFamilly. Darstellen von Versionen als Zeilen und Versionen als Spalten. (Nach dem Vorbild Simple Document Versioning with CouchDB)

Antwort

8

Wenn Sie die Annahme hinzufügen, die Bücher haben in der Regel weniger als 10.000 Einträge in ihnen adressiert, dann eine Zeile mit je Adressbuch Zeitlinie in einer Super-Säule Familie würde ein anständiger Ansatz. , Jeder Superspaltenname ein Zeitstempel ist, und die Unterspalten repräsentieren das Adressbuch des Inhalt für diese Version

{'address_book_18f3a8': 
    {1290635938721704: {'entry1': 'entry1_stuff', 'entry2': 'entry2_stuff'}}, 
    {1290636018401680: {'entry1': 'entry1_stuff_v2', ...}, 
    ... 
} 

, wo der Zeilenschlüssel des Adressbuchs identifiziert:

würde Eine Reihe aussehen.

Damit können Sie die neueste Version eines Adressbuchs mit nur einer Abfrage lesen und auch eine neue Version mit einer einzigen Einfügung schreiben.

Der Grund, warum ich vorschlage, wenn Adressbücher weniger als 10.000 Elemente verwenden, ist, dass Superspalten vollständig deserialisiert werden müssen, wenn Sie nur eine einzelne Unterspalte lesen. Alles in allem nicht so schlimm, aber es ist etwas, das man im Auge behalten sollte.

Ein würde alternativer Ansatz eine einzelne Zeile pro Version des Adressbuchs zu verwenden sein, und eine separate CF mit einer Pro-Adressbuch Zeitlinie Zeile verwenden wie:

{'address_book_18f3a8': {1290635938721704: some_uuid1, 1290636018401680: some_uuid2...}} 

Hier entsprechen some_uuid1 und some_uuid2 zu der Zeilenschlüssel für diese Versionen des Adressbuchs. Der Nachteil dieses Ansatzes besteht darin, dass jedes Mal, wenn das Adressbuch gelesen wird, zwei Abfragen erforderlich sind. Der Vorteil ist, dass Sie nur ausgewählte Teile eines Adressbuchs effizient lesen können.

+0

danke für den Hinweis, dass Sie immer die ganze Supercolumn lesen müssen. Ich habe diese Tatsache nicht bemerkt, als ich die Cassandra-Dokumente gelesen habe. –

1

HBase (http://hbase.apache.org/) hat diese Funktionalität eingebaut. Probieren Sie es aus.

+3

Beziehen Sie sich auf "Versionen" in hbase (http://hbase.apache.org/book/versions.html)? Es wäre hilfreich, auf die eigentliche Dokumentation für das Feature zu verweisen, auf das Sie sich beziehen. –