2017-04-19 4 views
2

In der Aerospike-Dokumentation wird erwähnt, dass Aerospike 4096 logische Partitionen hat und jeder Schlüssel gehashed und schließlich zu einer der Partitionen zwischen 1 bis 4096 zugeordnet ist, die bestimmt, in welchem ​​Knoten die Daten für diesen Schlüssel sollten gespeichert werden.Affinitätsschlüssel in Aerospike

Wenn wir jedoch zwei Schlüssel "A" und "AB" haben und wir sie im selben Knoten speichern wollen, gibt es einen Weg?

In Redis kann es erreicht werden, indem die Schlüssel als "A" und "{A} B" gemacht werden, die sicherstellen, dass der Schlüssel "{A} B" zu einem Knoten geht, an dem "A" gehasht wird gelagert.

In Apache Ignite kann dasselbe mit "AffinityKey" durchgeführt werden.

Gibt es eine ähnliche Idee in Aerospike?

Dank

+1

Aerospike hat an dieser Stelle keine solche Funktion. Was ist der Anwendungsfall hinter dieser Anforderung? – Meher

+1

lässt sagen, ich habe eine riesige Tabelle für globale Schulen, in denen der Primärschlüssel ist Schule ID, die zufällig ist, aber es hat Spalten wie Land, Name der Schule, etc etc ...Alle meine Abfragen haben immer ein Länderfeld in ihnen und einige andere optionale Felder. Also, wenn ich eine Tabelle habe, die über 10 Partitionen verteilt ist, und die Daten zufällig verteilt sind, für jede Abfrage wie "Select * von Schulen, wo Land = Indien und foo = bar", muss ich 10 Abfragen und seine auslösen Die Zeit wird von der langsamsten Abfrage diktiert. Wenn ich stattdessen "country" als Affinitätsschlüssel erstelle, werden die Daten länderspezifisch aufgeteilt. – Tuco

+0

Hinzufügen zu obigen Kommentar, und ich werde in der Lage sein, alle Daten mit nur einer Abfrage in allen Fällen zu erhalten. – Tuco

Antwort

2

Aerospike wurde als verteilte Datenbank konzipiert. Redis wurde entwickelt, um auf einem einzelnen Knoten zu laufen, und es fehlen Konzepte wie data distribution, clustering, Replikation, Failover, zumindest nativ. Ich bin mir bewusst, dass Sie verschiedene Application-Side-Shenanigans verwenden können, um es zu einem Ad-hoc-Cluster zu machen.

Machen Sie sich keine Sorgen über die Implementierungsdetails der Aerospike-Datenverteilung. Diese treten automatisch zwischen dem Client und dem Cluster auf und erfordern nicht, dass Sie auf der Anwendungsseite etwas tun. Denken Sie stattdessen über Ihre Zugriffsmuster nach.

Zuerst wird Ihr Aerospike-Cluster sicherstellen, dass die Daten gleichmäßig verteilt sind. Da Arbeit direkt proportional zu Daten ist, sollten Sie sicherstellen, dass die Knoten homogen sind. Sie können dann erwarten, dass Operationen mit mehreren Knoten auf jedem Knoten ungefähr in der gleichen Zeit abgeschlossen werden.

Sie können eine secondary index in den Feldern erstellen, die Sie häufig querying werden, um die Geschwindigkeit der Abfrage zu verbessern. Mit Release 3.12 wird predicate filtering hinzugefügt, mit dem Sie komplexere Abfrageprädikate über den ersten sekundären indexbasierten Filter erstellen können (siehe auch die Klasse PredExp des Java-Clients).

Wenn Sie keine sekundären Indizes verwenden möchten (es gibt mehrere gültige Gründe), können Sie Ihre eigene Suche mit externen Datensätzen erstellen. In einer set namens Landesschule können Sie eine record für jedes Land (Schlüssel wie "Indien", "Luxemburg") mit einem Wert list mit den IDs der Schulen in diesem Land haben. Sie können die Liste mit einem einzelnen get erhalten (oder einem Batch-Get, wenn es mehrere Datensätze gibt, z. B. india-1, india-2, ..., india-9999) und dann die Ergebnisse verwenden, um eine batch-get-Operation für die Schulen. Der Batch liest die Ergebnisse in der angeforderten Reihenfolge zurück, so dass Sie einen großen Batch abrufen können. Überprüfen Sie, ob das letzte Element null ist und ob Sie einen anderen Batch erhalten.

('ns1', 'country-school', 'us-california') => [ 1, 2, 3, 5, 8, 11, .. ] 

Ebenso können Sie Permutationen wie Land-State-Stadt, (beispielsweise US-California-oakland) mit kleineren Listen erstellen. Dies kostet etwas mehr Speicherplatz, bietet Ihnen jedoch einen schnelleren (key-value Based) Abruf, ohne Speicher auf Sekundärindizes auszugeben.

('ns1', 'country-school', 'us-california-oakland') => [ 1, 5, 42, .. ]