2012-03-23 8 views
3

Ich baue eine node.js-Anwendung mit riak als Datenspeicherlösung. Die Anwendung ermöglicht einige Datenspeicherung von Benutzern. Ich möchte auf irgendeine Weise verfolgen, wie viel Speicherplatz von einem einzelnen Benutzer belegt wird (1 Benutzer -> x Buckets). Ich möchte auch die verteilten Kopien ignorieren (nur 1 Kopie zählen).Wie finden Sie die Größe eines Eimers in Riak? (in MB und Ignorieren der Backups)

Ich konnte nichts finden, um den ungefähren Platz zu berechnen. Die Verwendung eines node.js-Skripts ist in Ordnung, obwohl ich einen Weg bevorzugen würde, es in der Datenbank (in einer verteilten Weise) zu tun.

Hat jemand eine Idee von dem besten Weg, dies zu tun?

Antwort

0

Ich bin ein Riak-Noob, aber basierend auf dem, was ich weiß mein erster Instinkt wäre, einen Post-Commit-Haken zu betrachten, wo Sie Zugriff auf das Objekt und Eigenschaften haben - einschließlich Größe, glaube ich. Sie können dann die Werte in einem separaten Bucket anpassen, der die Verwendung verfolgt. Nicht sicher, ob Pre- oder Post-Commit-Hooks auf Operationen an dem Objekt beschränkt sind, das den Hook ausgelöst hat. Vielleicht könnte der Post-Commit-Hook dem fraglichen Objekt einen sekundären Index mit der Größe der Datei hinzufügen, auf die Sie in Zukunft über MapReduce zugreifen könnten.

Ich entschuldige mich, wenn ich vielleicht laut denke ... es scheint wie ein interessantes Problem, also bin ich interessiert zu sehen, wie Sie es lösen. Ich wollte selbst mit den Haken spielen, hatte aber noch keine Chance.

Commit Hooks

+0

Ok, krank an den Haken nehmen einen Blick. Ich dachte über Kartenreduzierung nach und bemerkte keinen Größenzugriff. – Luigimax

0

Die aktuelle Gesamtgröße der Daten in einem Eimer (oder für eine beliebige Gruppe von Datensätzen) durch eine mapreduce Abfrage abgerufen werden. Dies liefert die Größe unabhängig davon, wo die Datensätze gespeichert sind und wie viele Kopien aufbewahrt werden. Da ich keine mapreduce-Funktion finden konnte, die tatsächlich die Größe der Daten zurückgibt, habe ich eine erstellt. Dies wird map_datasize genannt und kann in my GitHub repository gefunden werden. Die Mapreduce-Abfrage für den Inhalt eines gesamten Buckets auszuführen ist wahrscheinlich ziemlich langsam und belastet das System (das Ausführen von mapreduce-Jobs auf ganzen Buckets wird nicht empfohlen), könnte aber möglicherweise verwendet werden, wenn die Größe nur benötigt wird gelegentlich bestimmt werden.

Wenn Sie immer eine aktuelle Zahl benötigen, denke ich, dass ein Post-Commit Hook, wie im anderen Post vorgeschlagen, eine bessere Option sein könnte, obwohl es ein bisschen schwierig sein kann, es genau zu halten, wie ich nicht bin Stellen Sie sicher, dass Sie Zugriff auf die Größe des Datensatzes haben, der bei Aktualisierungen ersetzt wird, um die Größenänderung zu berechnen.

3

Wie in früheren Veröffentlichungen vorgeschlagen gibt es 2 Möglichkeiten dies zu tun:

  1. einen Beitrag commit Haken zu tun, ist die beste Option, wenn Sie es in einer Karte implementieren/reduzieren Job können Sie sich auf die Verwendung byte_size Inhalt des Objekts (siehe unten)

  2. Karte Implement/reduzieren Job Besuche https://github.com/whitenode/riak_mapreduce_utils und ihre map_datasize Funktion

erlang commit

update_bucket_size_hook(Object) -> 
my_hooks_utils:update_bucket_size(riakc_obj:key(Object), 
    erlang:byte_size(riak_object:get_value(Object))).